cmake_parser/doc/command/project/
try_run.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 compiling and then running some code.
12///
13/// Reference: <https://cmake.org/cmake/help/v3.26/command/try_run.html>
14#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
15#[cmake(pkg = "crate", untagged)]
16pub enum TryRun<'t> {
17    Regular(TryRunRegular<'t>),
18    Alt(TryRunAlt<'t>),
19}
20
21impl<'t> ToCommandScope for TryRun<'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", default = "sources")]
29pub struct TryRunRegular<'t> {
30    #[cmake(positional)]
31    pub run_result_var: Token<'t>,
32    #[cmake(positional)]
33    pub compile_result_var: Token<'t>,
34
35    #[cmake(rename = "")]
36    pub sources: Vec<Source<'t>>,
37
38    pub log_description: Option<Token<'t>>,
39    pub no_cache: bool,
40    pub no_log: bool,
41    pub cmake_flags: Option<Vec<Token<'t>>>,
42    pub compile_definitions: Option<Vec<Token<'t>>>,
43    pub link_options: Option<Vec<Token<'t>>>,
44    pub link_libraries: Option<Vec<Token<'t>>>,
45    pub compile_output_variable: Option<Token<'t>>,
46    pub copy_file: Option<CopyFile<'t>>,
47    pub lang_standard: Option<LangStandard<'t>>,
48    pub lang_standard_required: Option<LangStandardRequired<'t>>,
49    pub lang_extensions: Option<LangExtensions<'t>>,
50
51    pub run_output_variable: Option<Token<'t>>,
52    pub run_output_stdout_variable: Option<Token<'t>>,
53    pub run_output_stderr_variable: Option<Token<'t>>,
54    pub working_directory: Option<Token<'t>>,
55    pub args: Option<Vec<Token<'t>>>,
56}
57
58#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
59#[cmake(pkg = "crate", default = "sources")]
60pub struct TryRunAlt<'t> {
61    #[cmake(positional)]
62    pub run_result_var: Token<'t>,
63    #[cmake(positional)]
64    pub compile_result_var: Token<'t>,
65    #[cmake(positional)]
66    pub binary_dir: Token<'t>,
67
68    #[cmake(rename = "")]
69    pub sources: SourceAlt<'t>,
70
71    pub cmake_flags: Option<Vec<Token<'t>>>,
72    pub compile_definitions: Option<Vec<Token<'t>>>,
73    pub link_options: Option<Vec<Token<'t>>>,
74    pub link_libraries: Option<Vec<Token<'t>>>,
75    pub compile_output_variable: Option<Token<'t>>,
76    pub copy_file: Option<CopyFile<'t>>,
77    pub lang_standard: Option<LangStandard<'t>>,
78    pub lang_standard_required: Option<LangStandardRequired<'t>>,
79    pub lang_extensions: Option<LangExtensions<'t>>,
80
81    pub run_output_variable: Option<Token<'t>>,
82    pub output_variable: Option<Token<'t>>,
83    pub working_directory: Option<Token<'t>>,
84    pub args: Option<Vec<Token<'t>>>,
85}
86
87#[cfg(test)]
88mod tests {
89    use super::*;
90    use crate::doc::cmake_parse::tests::token;
91    use crate::*;
92    use pretty_assertions::assert_eq;
93
94    #[test]
95    fn try_run() {
96        let src = include_bytes!("../../../../../fixture/commands/project/try_run");
97        let cmakelists = parse_cmakelists(src).unwrap();
98        let doc = Doc::from(cmakelists);
99        assert_eq!(
100            doc.commands(),
101            Ok(vec![Command::TryRun(Box::new(TryRun::Alt(TryRunAlt {
102                run_result_var: token(b"test_run_result"),
103                compile_result_var: token(b"test_compile_result"),
104                binary_dir: token(b"${CMAKE_CURRENT_BINARY_DIR}/"),
105                sources: SourceAlt::Source(token(b"${CMAKE_CURRENT_SOURCE_DIR}/test.cpp")),
106                cmake_flags: None,
107                compile_definitions: None,
108                link_options: None,
109                link_libraries: None,
110                compile_output_variable: Some(token(b"test_compile_output")),
111                copy_file: None,
112                lang_standard: None,
113                lang_standard_required: None,
114                lang_extensions: None,
115                run_output_variable: Some(token(b"test_run_output")),
116                output_variable: None,
117                working_directory: None,
118                args: None,
119            }))),])
120        )
121    }
122}