将 CMake BOOL 转发到 C++
Forward CMake BOOL to C++
我希望能够在调用 CMake 时设置一堆布尔标志,这些标志稍后会在 C++ 代码中使用。类似于:
set(DEBUG_ENABLE false CACHE BOOL "enable debugging")
target_compile_definitions(target PRIVATE DEBUG_ENABLE=${DEBUG_ENABLE})
这实际上工作正常并产生等同于:
#define DEBUG_ENABLE false
但是,BOOL
的原生 CMake 字面值是 ON
/OFF
并且 CMake GUI 等工具将使用这些值,导致定义不在 C++ 中运行良好:
#define DEBUG_ENABLE OFF
将此类布尔变量从 CMake 转发到 C++ 的最佳方法是什么?
我能想到几点:
- CMake 中的转换函数,导致每个布尔值三行
- 使用
STRING
代替BOOL
- 让它在 C++ 中工作:
#define ON true
None 这些选项对我来说特别好。
我会使用 configure_file
。它不会直接为您提供 C++ bool
,但它实际上会随着时间的推移而扩展。
你需要制作一个配置文件模板供cmake修改,在这个例子中config.hpp.in
。
#cmakedefine01 DEBUG_ENABLE
接下来,将 configure_file
行添加到您的 CMakeLists.txt
。
configure_file(config.hpp.in "${CMAKE_BINARY_DIR}/config.hpp")
配置模板中的任何变量都将根据 cmake 中的值替换为 0/1。
工作输出:
(after configuring)
$ cat config.hpp
#define DEBUG_ENABLE 0
$ cmake -DDEBUG_ENABLE=ON .
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/so/cmake-bool/build
$ cat config.hpp
#define DEBUG_ENABLE 1
这也完全消除了对 target_compile_definitions
行的需要,前提是您 #include "config.hpp"
在适当的位置。
我希望能够在调用 CMake 时设置一堆布尔标志,这些标志稍后会在 C++ 代码中使用。类似于:
set(DEBUG_ENABLE false CACHE BOOL "enable debugging")
target_compile_definitions(target PRIVATE DEBUG_ENABLE=${DEBUG_ENABLE})
这实际上工作正常并产生等同于:
#define DEBUG_ENABLE false
但是,BOOL
的原生 CMake 字面值是 ON
/OFF
并且 CMake GUI 等工具将使用这些值,导致定义不在 C++ 中运行良好:
#define DEBUG_ENABLE OFF
将此类布尔变量从 CMake 转发到 C++ 的最佳方法是什么?
我能想到几点:
- CMake 中的转换函数,导致每个布尔值三行
- 使用
STRING
代替BOOL
- 让它在 C++ 中工作:
#define ON true
None 这些选项对我来说特别好。
我会使用 configure_file
。它不会直接为您提供 C++ bool
,但它实际上会随着时间的推移而扩展。
你需要制作一个配置文件模板供cmake修改,在这个例子中config.hpp.in
。
#cmakedefine01 DEBUG_ENABLE
接下来,将 configure_file
行添加到您的 CMakeLists.txt
。
configure_file(config.hpp.in "${CMAKE_BINARY_DIR}/config.hpp")
配置模板中的任何变量都将根据 cmake 中的值替换为 0/1。
工作输出:
(after configuring)
$ cat config.hpp
#define DEBUG_ENABLE 0
$ cmake -DDEBUG_ENABLE=ON .
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/so/cmake-bool/build
$ cat config.hpp
#define DEBUG_ENABLE 1
这也完全消除了对 target_compile_definitions
行的需要,前提是您 #include "config.hpp"
在适当的位置。