以非重复的方式在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()