我在一个有很多配置选项的项目上工作。目前,代码期望它们通过命令行在命令行上传递-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>
)
好像行得通,但是我需要写FOO1三遍,而且看起来比较难看。然后在代码中可以#ifdef FOO1用来检查。
对于有价值的选择,我有以下几点:
set(BAR1 default_value CACHE STRING "")
set(BAR2 default_value CACHE STRING "")
target_compile_definitions(
mylib
PRIVATE
BAR1=${BAR1}
BAR2=${BAR2}
)
再次,我需要写BAR1三遍。至少在代码中我可以只使用定义而不必再次明确定义它们。
我愿意为此使用 a config.h.in。但是在那里我必须写FOO1 = "@FOO1@"or FOO1 = "${FOO1}",再次必须再声明两次选项。
有没有更聪明的方法来定义一堆编译定义?