如何使用CMake为特定目标创建C #define?

时间:2011-03-18 12:39:03

标签: cmake

我现在觉得有点蠢。在最近将一些较小的项目转换为使用CMake之后,我决定还删掉一些“Platform_Config.h”文件。这些文件包含一些预处理指令,如#define USE_NEW_CACHE和控制编译。

我如何'转换'这些定义用CMake控制?理想情况下,通过使用这些“缓存”变量,用户可以轻松编辑。

3 个答案:

答案 0 :(得分:22)

有两种选择。您可以使用add_definitions方法将定义作为编译器标志传递:例如。你项目中的某个地方cmakelists.txt:

add_definitions( -DUSE_NEW_CACHE )

CMake将确保将-D前缀转换为编译器的右侧标志(/ D表示msvc,-D表示gcc)。

或者,查看configure_file。它更复杂,但可能更适合使用Platform_Config文件的原始方法。

您可以创建一个输入文件,类似于原始的Platform_Config.h,并为其添加“#ckekedefine”行。

让我们在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 )

它将在build-dir中生成一个新的Platform_Config文件。 cmake中的那些变量也是一个cmakedefine,它们将出现在生成的文件中,其他变量将被注释掉或取消。

当然,在将源文件包含在源文件中时,应确保正确找到实际生成的文件。

答案 1 :(得分:13)

选项命令可能会提供您要查找的内容 将它与目标上的 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 :(得分:3)

如果您想为每个目标设置定义:从2.8.11开始,您可以使用target_compile_definitions

在早期版本中,您可能不希望按原样使用set_target_properties,因为它会覆盖您之前设置的任何定义。首先调用get_target_property,然后与之前的值合并。请参阅add_target_definitions here