cmake_parser/doc/command/project/
target_include_directories.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    doc::command_scope::{CommandScope, ToCommandScope},
5    Token,
6};
7
8/// Add include directories to a target.
9///
10/// Reference: <https://cmake.org/cmake/help/v3.26/command/target_include_directories.html>
11#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cmake(pkg = "crate")]
13pub struct TargetIncludeDirectories<'t> {
14    #[cmake(positional)]
15    pub target: Token<'t>,
16    pub system: bool,
17    pub mode: Option<Mode>,
18    pub directories: Vec<Directory<'t>>,
19}
20
21impl<'t> ToCommandScope for TargetIncludeDirectories<'t> {
22    fn to_command_scope(&self) -> CommandScope {
23        CommandScope::Project
24    }
25}
26
27#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
28#[cmake(pkg = "crate")]
29pub enum Mode {
30    After,
31    Before,
32}
33
34#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
35#[cmake(pkg = "crate", transparent)]
36pub enum Directory<'t> {
37    Interface(Vec<Token<'t>>),
38    Public(Vec<Token<'t>>),
39    Private(Vec<Token<'t>>),
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45    use crate::doc::cmake_parse::tests::{token, tokens_vec};
46    use crate::*;
47    use pretty_assertions::assert_eq;
48
49    #[test]
50    fn target_include_directories() {
51        let src =
52            include_bytes!("../../../../../fixture/commands/project/target_include_directories");
53        let cmakelists = parse_cmakelists(src).unwrap();
54        let doc = Doc::from(cmakelists);
55        assert_eq!(
56            doc.commands(),
57            Ok(vec![
58                Command::TargetIncludeDirectories(Box::new(TargetIncludeDirectories {
59                    target: token(b"mylib"),
60                    system: false,
61                    mode: None,
62                    directories: vec![Directory::Public(tokens_vec([
63                        b"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>",
64                        b"$<INSTALL_INTERFACE:include/mylib>",
65                    ]))],
66                })),
67                Command::TargetIncludeDirectories(Box::new(TargetIncludeDirectories {
68                    target: token(b"mylib"),
69                    system: true,
70                    mode: Some(Mode::Before),
71                    directories: vec![Directory::Public(tokens_vec([
72                        b"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>",
73                        b"$<INSTALL_INTERFACE:include/mylib>",
74                    ]))],
75                })),
76                Command::TargetIncludeDirectories(Box::new(TargetIncludeDirectories {
77                    target: token(b"mylib"),
78                    system: false,
79                    mode: Some(Mode::After),
80                    directories: vec![
81                        Directory::Interface(vec![token(
82                            b"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>"
83                        )]),
84                        Directory::Private(vec![token(b"$<INSTALL_INTERFACE:include/mylib>")])
85                    ],
86                })),
87            ])
88        )
89    }
90}