cmake_parser/doc/command/project/
build_command.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    doc::command_scope::{CommandScope, ToCommandScope},
5    Token,
6};
7
8/// Get a command line to build the current project.
9///
10/// Reference: <https://cmake.org/cmake/help/v3.26/command/build_command.html>
11#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cmake(pkg = "crate", untagged)]
13pub enum BuildCommand<'t> {
14    Variable(VariableBuildCommand<'t>),
15    CacheVariable(CacheVariableBuildCommand<'t>),
16}
17
18impl<'t> ToCommandScope for BuildCommand<'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 VariableBuildCommand<'t> {
27    #[cmake(positional)]
28    pub variable: Token<'t>,
29    pub configuration: Option<Token<'t>>,
30    pub parallel_level: Option<Token<'t>>,
31    pub target: Option<Token<'t>>,
32    pub project_name: Option<Token<'t>>,
33}
34
35#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
36#[cmake(pkg = "crate", positional)]
37pub struct CacheVariableBuildCommand<'t> {
38    pub cachevariable: Token<'t>,
39    pub makecommand: Token<'t>,
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45    use crate::*;
46
47    #[test]
48    fn build_command() {
49        let src = include_bytes!("../../../../../fixture/commands/project/build_command");
50        let cmakelists = parse_cmakelists(src).unwrap();
51        let doc = Doc::from(cmakelists);
52        assert_eq!(
53            doc.commands(),
54            Ok(vec![
55                Command::BuildCommand(Box::new(BuildCommand::Variable(VariableBuildCommand {
56                    variable: b"var1".into(),
57                    configuration: Some(b"cfg1".into()),
58                    parallel_level: Some(b"plevel2".into()),
59                    target: Some(b"target3".into()),
60                    project_name: Some(b"project_name4".into())
61                }))),
62                Command::BuildCommand(Box::new(BuildCommand::CacheVariable(
63                    CacheVariableBuildCommand {
64                        cachevariable: b"cachevar1".into(),
65                        makecommand: b"makecommand1".into(),
66                    }
67                ))),
68            ])
69        );
70    }
71}