cmake_parser/doc/command/project/
target_include_directories.rs1use cmake_parser_derive::CMake;
2
3use crate::{
4 doc::command_scope::{CommandScope, ToCommandScope},
5 Token,
6};
7
8#[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}