cmake_parser/doc/command/project/
target_precompile_headers.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    doc::command_scope::{CommandScope, ToCommandScope},
5    Token,
6};
7
8/// Add a list of header files to precompile.
9///
10/// Reference: <https://cmake.org/cmake/help/v3.26/command/target_precompile_headers.html>
11#[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}