选项 1:使用生成器表达式
这是使用目标属性和生成器表达式的一个选项:
option(SOME_OPT1 "Some option 1" ON)
option(SOME_OPT2 "Some option 2" OFF)
option(SOME_OPT3 "Some option 3" ON)
target_compile_definitions(my_app PRIVATE
$<$<BOOL:${SOME_OPT1}>:SOME_IDENTIFIER_HERE_RELATED_TO_OPT1>
$<$<BOOL:${SOME_OPT2}>:SOME_IDENTIFIER_HERE_RELATED_TO_OPT2>
$<$<BOOL:${SOME_OPT3}>:SOME_IDENTIFIER_HERE_RELATED_TO_OPT3>
)
$<BOOL:${var}> 舞蹈对于将真/假 CMake 值转换为 1 或 0 是必要的,正如生成器表达式迷你语言所期望的那样。
选项 2:生成的“配置文件”
如果您有很多这样的选项,另一种选择是使用configure_file 命令创建包含相关信息的标题。创建一个名为 config.h.in 的标头(作为示例),其内容如下:
#ifndef MYPROJ_CONFIG_H
#define MYPROJ_CONFIG_H
#cmakedefine SOME_IDENTIFIER_HERE_RELATED_TO_OPT1
#cmakedefine SOME_IDENTIFIER_HERE_RELATED_TO_OPT2
#cmakedefine01 SOME_IDENTIFIER_HERE_RELATED_TO_OPT3
#endif
#cmakedefine VAR 指令由 configure_file 处理以设置 VAR 如果在 CMakeLists.txt 中将 VAR 定义为真实值,则注释掉该行。 01 变体始终定义 VAR,但将其设置为 0 或 1。
然后在你的 CMakeLists.txt 你可以写:
option(SOME_OPT1 "Some option 1" ON)
option(SOME_OPT2 "Some option 2" OFF)
option(SOME_OPT3 "Some option 3" ON)
# Setting these variables exposes them to configure_file below
set(SOME_IDENTIFIER_HERE_RELATED_TO_OPT1 "${SOME_OPT1}")
set(SOME_IDENTIFIER_HERE_RELATED_TO_OPT2 "${SOME_OPT2}")
set(SOME_IDENTIFIER_HERE_RELATED_TO_OPT3 "${SOME_OPT3}")
configure_file(config.h.in config.h)
target_include_directories(my_app PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")
然后您的源文件可以#include <config.h>,默认情况下是:
#ifndef MYPROJ_CONFIG_H
#define MYPROJ_CONFIG_H
#define SOME_IDENTIFIER_HERE_RELATED_TO_OPT1
/* #undef SOME_IDENTIFIER_HERE_RELATED_TO_OPT2 */
#define SOME_IDENTIFIER_HERE_RELATED_TO_OPT3 1
#endif
这两个选项每个选项都会花费一行开销,尽管第一种方法有点吵,而第二种方法会花费一个文件。但是,第二种方法也允许您添加额外的预处理器代码,这些代码可能更好地放在配置文件中。它还可以通过 @VAR@ 语法替换 CMake 变量 values。有关详细信息,请参阅文档:https://cmake.org/cmake/help/latest/command/configure_file.html