cmake_parser/doc/command/project/
target_precompile_headers.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", untagged)]
13pub enum TargetPrecompileHeaders<'t> {
14 Main(MainTargetPrecompileHeaders<'t>),
15 Reuse(ReuseTargetPrecompileHeaders<'t>),
16}
17
18impl<'t> ToCommandScope for TargetPrecompileHeaders<'t> {
19 fn to_command_scope(&self) -> CommandScope {
20 CommandScope::Project
21 }
22}
23
24#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
25#[cmake(pkg = "crate")]
26pub struct MainTargetPrecompileHeaders<'t> {
27 #[cmake(positional)]
28 pub target: Token<'t>,
29 pub headers: Vec<Header<'t>>,
30}
31
32#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
33#[cmake(pkg = "crate", transparent)]
34pub enum Header<'t> {
35 Interface(Vec<Token<'t>>),
36 Public(Vec<Token<'t>>),
37 Private(Vec<Token<'t>>),
38}
39
40#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
41#[cmake(pkg = "crate")]
42pub struct ReuseTargetPrecompileHeaders<'t> {
43 #[cmake(positional)]
44 pub target: Token<'t>,
45 pub reuse_from: Token<'t>,
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51 use crate::doc::cmake_parse::tests::{quoted_tokens_vec, token, tokens_vec};
52 use crate::*;
53 use pretty_assertions::assert_eq;
54
55 #[test]
56 fn target_precompile_headers() {
57 let src =
58 include_bytes!("../../../../../fixture/commands/project/target_precompile_headers");
59 let cmakelists = parse_cmakelists(src).unwrap();
60 let doc = Doc::from(cmakelists);
61 assert_eq!(
62 doc.commands(),
63 Ok(vec![
64 Command::TargetPrecompileHeaders(Box::new(TargetPrecompileHeaders::Main(
65 MainTargetPrecompileHeaders {
66 target: token(b"myTarget"),
67 headers: vec![
68 Header::Public(tokens_vec([b"project_header.h"])),
69 Header::Private(tokens_vec([
70 b"\"other_header.h\"",
71 b"<unordered_map>"
72 ]))
73 ]
74 }
75 ))),
76 Command::TargetPrecompileHeaders(Box::new(TargetPrecompileHeaders::Main(
77 MainTargetPrecompileHeaders {
78 target: token(b"mylib"),
79 headers: vec![Header::Private(quoted_tokens_vec([
80 b"$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/cxx_only.h>",
81 b"$<$<COMPILE_LANGUAGE:C>:<stddef.h$<ANGLE-R>>",
82 b"$<$<COMPILE_LANGUAGE:CXX>:<cstddef$<ANGLE-R>>"
83 ])),]
84 }
85 ))),
86 Command::TargetPrecompileHeaders(Box::new(TargetPrecompileHeaders::Reuse(
87 ReuseTargetPrecompileHeaders {
88 target: token(b"target"),
89 reuse_from: token(b"other_target"),
90 }
91 ))),
92 ])
93 )
94 }
95}