以非重复的方式在CMake中设置一组编译选项

以非重复的方式在CMake中设置一组编译选项,cmake,Cmake,我在一个有很多配置选项的项目上工作。此时,代码希望通过-D在命令行上传递它们。它们是在旧的构建脚本中硬编码的,我想通过CMake公开它们 对于布尔选项,我提出了以下构造: option(FOO1 "" ON) option(FOO2 "" ON) option(FOO3 "" OFF) target_compile_definitions( mylib PRIVATE $<$<

我在一个有很多配置选项的项目上工作。此时,代码希望通过
-D
在命令行上传递它们。它们是在旧的构建脚本中硬编码的,我想通过CMake公开它们

对于布尔选项,我提出了以下构造:

option(FOO1 "" ON)
option(FOO2 "" ON)
option(FOO3 "" OFF)

target_compile_definitions(
        mylib
        PRIVATE
        $<$<BOOL:${FOO1}>:FOO1>
        $<$<BOOL:${FOO2}>:FOO2>
        $<$<BOOL:${FOO3}>:FOO3>
)
同样,我需要写三次
BAR1
。至少在代码中,我可以使用这些定义,而不必再次显式定义它们

我愿意为此使用
config.h.in
。但在那里,我必须编写
FOO1=“@FOO1@”
FOO1=“${FOO1}”
,再次必须声明该选项两次以上


有没有更聪明的方法来定义一组编译定义?

只需使用循环即可:

foreach(_VAR IN ITEMS
    FOO1
    FOO2
    FOO3
    )

    if(${_VAR})
        target_compile_definitions(mylib PRIVATE "${_VAR}")
    endif()
endforeach()

foreach(_VAR IN ITEMS
    BAR1
    BAR2
    BAR3
    )

    target_compile_definitions(mylib PRIVATE "${_VAR}=${${_VAR}}")
endforeach()

不幸的是,这实际上比您的代码长,但它确实避免了重复。对于更多的选项,这将更有价值。

“但是我需要写三次
FOO1
”-你的意思是“写两次
FOO1
”?您有三行,如
$
,但每行的选项名称不同。如果您不想为不同的
选项
名称重复多次
$
,则可以为该选项创建函数/宏,并只调用该函数3次。或对每个选项名迭代(
foreach
)调用此函数。或者对函数中的选项名称执行迭代。。。方法太多了。想象一下,你打算如何使用函数/宏。考虑到我拥有的变量数量,这个选项仍然更短。最重要的是更容易维护。谢谢!
foreach(_VAR IN ITEMS
    FOO1
    FOO2
    FOO3
    )

    if(${_VAR})
        target_compile_definitions(mylib PRIVATE "${_VAR}")
    endif()
endforeach()

foreach(_VAR IN ITEMS
    BAR1
    BAR2
    BAR3
    )

    target_compile_definitions(mylib PRIVATE "${_VAR}=${${_VAR}}")
endforeach()