cmake_parser/doc/command/project/
try_compile.rs1use 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#[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}