cmake_parser/doc/command/project/
try_compile.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    command::common::{
5        CopyFile, LangExtensions, LangStandard, LangStandardRequired, Source, SourceAlt,
6    },
7    doc::command_scope::{CommandScope, ToCommandScope},
8    Token,
9};
10
11/// Try building some code.
12///
13/// Reference: <https://cmake.org/cmake/help/v3.26/command/try_compile.html>
14#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
15#[cmake(pkg = "crate", untagged)]
16pub enum TryCompile<'t> {
17    Sources(TryCompileProjectSources<'t>),
18    SourcesAlt(TryCompileProjectSourcesAlt<'t>),
19    Project(TryCompileProject<'t>),
20    ProjectAlt(TryCompileProjectAlt<'t>),
21}
22
23impl<'t> ToCommandScope for TryCompile<'t> {
24    fn to_command_scope(&self) -> CommandScope {
25        CommandScope::Project
26    }
27}
28
29#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
30#[cmake(pkg = "crate")]
31pub struct TryCompileProject<'t> {
32    #[cmake(positional)]
33    pub compile_result_var: Token<'t>,
34    #[cmake(positional, transparent)]
35    pub project: Token<'t>,
36    #[cmake(positional, transparent)]
37    pub source_dir: Token<'t>,
38    pub binary_dir: Option<Token<'t>>,
39    pub target: Option<Token<'t>>,
40    pub log_description: Option<Token<'t>>,
41    pub no_cache: bool,
42    pub no_log: bool,
43    pub cmake_flags: Option<Vec<Token<'t>>>,
44    pub output_variable: Option<Token<'t>>,
45}
46
47#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
48#[cmake(pkg = "crate", default = "target")]
49pub struct TryCompileProjectAlt<'t> {
50    #[cmake(positional)]
51    pub compile_result_var: Token<'t>,
52    #[cmake(positional)]
53    pub source_dir: Token<'t>,
54    #[cmake(positional)]
55    pub binary_dir: Token<'t>,
56    #[cmake(positional)]
57    pub project: Token<'t>,
58
59    #[cmake(rename = "")]
60    pub target: Option<Token<'t>>,
61    pub cmake_flags: Option<Vec<Token<'t>>>,
62    pub output_variable: Option<Token<'t>>,
63}
64
65#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
66#[cmake(pkg = "crate", default = "sources")]
67pub struct TryCompileProjectSources<'t> {
68    #[cmake(positional)]
69    pub compile_result_var: Token<'t>,
70
71    #[cmake(rename = "")]
72    pub sources: Vec<Source<'t>>,
73
74    pub log_description: Option<Token<'t>>,
75    pub no_cache: bool,
76    pub no_log: bool,
77    pub cmake_flags: Option<Vec<Token<'t>>>,
78    pub compile_definitions: Option<Vec<Token<'t>>>,
79    pub link_options: Option<Vec<Token<'t>>>,
80    pub link_libraries: Option<Vec<Token<'t>>>,
81    pub output_variable: Option<Token<'t>>,
82    pub copy_file: Option<CopyFile<'t>>,
83    pub lang_standard: Option<LangStandard<'t>>,
84    pub lang_standard_required: Option<LangStandardRequired<'t>>,
85    pub lang_extensions: Option<LangExtensions<'t>>,
86}
87
88#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
89#[cmake(pkg = "crate", default = "sources")]
90pub struct TryCompileProjectSourcesAlt<'t> {
91    #[cmake(positional)]
92    pub compile_result_var: Token<'t>,
93
94    #[cmake(positional)]
95    pub binary_dir: Token<'t>,
96
97    #[cmake(rename = "")]
98    pub sources: SourceAlt<'t>,
99
100    pub cmake_flags: Option<Vec<Token<'t>>>,
101    pub compile_definitions: Option<Vec<Token<'t>>>,
102    pub link_options: Option<Vec<Token<'t>>>,
103    pub link_libraries: Option<Vec<Token<'t>>>,
104    pub output_variable: Option<Token<'t>>,
105    pub copy_file: Option<CopyFile<'t>>,
106    pub lang_standard: Option<LangStandard<'t>>,
107    pub lang_standard_required: Option<LangStandardRequired<'t>>,
108    pub lang_extensions: Option<LangExtensions<'t>>,
109}
110
111#[cfg(test)]
112mod tests {
113    use super::*;
114    use crate::command::common::source::SourceFromContent;
115    use crate::doc::cmake_parse::tests::{quoted_token, quoted_tokens_vec, token, tokens_vec};
116    use crate::*;
117    use pretty_assertions::assert_eq;
118
119    #[test]
120    fn try_compile() {
121        let src = include_bytes!("../../../../../fixture/commands/project/try_compile");
122        let cmakelists = parse_cmakelists(src).unwrap();
123        let doc = Doc::from(cmakelists);
124        assert_eq!(
125            doc.commands(),
126            Ok(vec![
127                Command::TryCompile(Box::new(TryCompile::SourcesAlt(
128                    TryCompileProjectSourcesAlt {
129                        compile_result_var: token(b"HAVE_PLWID"),
130                        binary_dir: quoted_token(b"${CMAKE_BINARY_DIR}/temp"),
131                        sources: SourceAlt::Source(quoted_token(
132                            b"${CMAKE_SOURCE_DIR}/tests/test_plwid.c"
133                        )),
134                        cmake_flags: Some(quoted_tokens_vec([
135                            b"-DINCLUDE_DIRECTORIES=${PLPLOT_INCLUDE_PATH}",
136                            b"-DLINK_DIRECTORIES=${PLPLOT_LIB_PATH}"
137                        ])),
138                        compile_definitions: None,
139                        link_options: None,
140                        link_libraries: Some(tokens_vec([b"${PLPLOT_LIBRARY}"])),
141                        output_variable: None,
142                        copy_file: None,
143                        lang_standard: None,
144                        lang_standard_required: None,
145                        lang_extensions: None,
146                    }
147                ))),
148                Command::TryCompile(Box::new(TryCompile::Sources(TryCompileProjectSources {
149                    compile_result_var: token(b"HAVE_PLWID"),
150                    sources: vec![
151                        Source::SourceFromContent(SourceFromContent {
152                            name: token(b"aaa"),
153                            content: token(b"bbb")
154                        }),
155                        Source::Sources(tokens_vec([b"ccc", b"ddd"]))
156                    ],
157                    log_description: Some(token(b"my log description")),
158                    no_cache: true,
159                    no_log: true,
160                    cmake_flags: Some(quoted_tokens_vec([
161                        b"-DINCLUDE_DIRECTORIES=${PLPLOT_INCLUDE_PATH}",
162                        b"-DLINK_DIRECTORIES=${PLPLOT_LIB_PATH}"
163                    ])),
164                    compile_definitions: Some(tokens_vec([b"cd1", b"cd2"])),
165                    link_options: Some(tokens_vec([b"opt1", b"opt2"])),
166                    link_libraries: Some(tokens_vec([b"${PLPLOT_LIBRARY}", b"lib2"])),
167                    output_variable: Some(token(b"VARIABLE1")),
168                    copy_file: Some(CopyFile {
169                        file_name: token(b"file1"),
170                        copy_file_error: Some(token(b"fileError1"))
171                    }),
172                    lang_standard: None,
173                    lang_standard_required: None,
174                    lang_extensions: None,
175                }))),
176            ])
177        )
178    }
179}