【发布时间】:2011-03-18 12:39:02
【问题描述】:
我现在觉得有点傻。在最近将一些较小的项目转换为使用 CMake 之后,我决定也摆脱一些“Platform_Config.h”文件。这些文件包含一些预处理指令,如#define USE_NEW_CACHE 和控制编译。
我将如何“转换”这些定义以使用 CMake 进行控制?理想情况下,通过使用这些“缓存”变量,用户可以轻松编辑。
【问题讨论】:
标签: cmake
我现在觉得有点傻。在最近将一些较小的项目转换为使用 CMake 之后,我决定也摆脱一些“Platform_Config.h”文件。这些文件包含一些预处理指令,如#define USE_NEW_CACHE 和控制编译。
我将如何“转换”这些定义以使用 CMake 进行控制?理想情况下,通过使用这些“缓存”变量,用户可以轻松编辑。
【问题讨论】:
标签: cmake
有两种选择。您可以使用 add_definitions 方法将定义作为编译器标志传递:例如在你的项目 cmakelists.txt 的某处:
add_definitions( -DUSE_NEW_CACHE )
CMake 将确保将 -D 前缀转换为编译器的正确标志(/D 用于 msvc,-D 用于 gcc)。
或者,查看configure_file。它更复杂,但可能更适合您使用 Platform_Config 文件的原始方法。
您可以创建一个类似于原始 Platform_Config.h 的输入文件,并在其中添加“#cmakedefine”行。
让我们在 Platform_Config.h.in 中调用:
// In Platform_Config.h.in
#cmakedefine USE_NEW_CACHE
// end of Platform_Config.h.in
然后运行时
configure_file( ${CMAKE_SOURCE_DIR}/Platform_Config.h.in ${CMAKE_BINARY_DIR}/common/Platform_Config.h )
它将在您的构建目录中生成一个新的 Platform_Config 文件。 cmake 中那些也是 cmakedefine 的变量将出现在生成的文件中,其他变量将被注释掉或取消定义。
当然,您应该确保在将实际生成的文件包含在源文件中时正确找到它。
【讨论】:
option 命令可能会提供您正在寻找的内容。
将它与目标上的 COMPILE DEFINITIONS 属性一起使用,我认为你已经完成了。
要在目标上设置属性,请使用命令 set target properties
option(DEBUGPRINTS "Prints a lot of debug prints")
target(myProgram ...)
if(DEBUGPRINTS)
set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS "DEBUGPRINTS=1")
endif()
编辑:
我在示例中编写的选项在 CMake GUI 中显示为复选框。
【讨论】:
如果您想为每个目标设置定义:从 2.8.11 开始,您可以使用 target_compile_definitions。
在早期版本中,您可能不想按原样使用set_target_properties,因为它会覆盖您之前设置的任何定义。请先调用get_target_property,然后与之前的值合并。见add_target_definitionshere。
【讨论】:
使用 target_compile_options。不要引用您的定义,否则它不会被检测为定义。 CMake 解析 /define 并将实际定义添加到 csproj 的 DefineConstants 部分,如果有引号,它将把整个带引号的字符串放在 csproj 的 AdditionalOptions 部分中。
我的一个项目中使用生成器表达式的示例:
target_compile_options( ${LIBRARY_NAME} PRIVATE
$<${IS_ART_ITERATION_BUILD}:/define:ART_ITERATION_BUILD>
)
一个没有生成器表达式的例子:
target_compile_options( ${LIBRARY_NAME} PRIVATE
/define:GRAPHICS_VULKAN
)
【讨论】: