cmake:如何检查是否定义了预处理器

时间:2016-01-22 01:47:32

标签: cmake preprocessor

我无法让cmake测试是否已经定义了预处理器。例如:

cmake_minimum_required(VERSION 2.8.9)
project (cmake-test)
add_definitions(-DOS=LINUX)

if(NOT <what condition goes here?>)
    message(FATAL_ERROR "OS is not defined")
endif()

以下测试不起作用:

if (NOT COMMAND OS)
if (NOT DEFINED OS)
if (NOT OS)

我可以使用set()来测试常规cmake变量,然后定义预处理器宏。例如:

set(OS LINUX)
if (OS)
    add_definitions(-DOS=${OS})
else()
    message(FATAL_ERROR "OS is not defined")
endif()

万一,你想知道为什么我需要测试它,如果变量/预处理器在相同的文件中,那是因为在最终实现中这些将来自一个外部文件{在主CMakeFile.txt中编辑{1}}例如:

include

2 个答案:

答案 0 :(得分:2)

通常,传递给编译器的所有定义都由CMake控制。也就是说,使用

创建一个CMake变量
option(SOMEFEATURE "Feature description" ON)

set(OS "" CACHE STRING "Select your OS")

用户通过cmake -D OS=DOS或CMake GUI设置它们。然后,您可以使用if()运算符有条件地add_definitions()到编译器命令行。

<强>更新

如果您确实想要访问预处理程序标志,则会有COMPILE_DEFINITIONS目标属性。你可以这样访问它:

get_target_property(OUTVAR target COMPILE_DEFINITIONS)

答案 1 :(得分:2)

这是用箭头完成答案。

我也尝试了上面提到的COMPILE_DEFINITIONS选项,但未成功。

根据CMake的文档,至少对于版本3.x,结果是当你在CMake中调用add_definitions()时,它会将定义添加到COMPILE_DEFINITIONS 目录 属性。

因此,假设您根据代码定义了以下内容:

add_definitions(-DOS=LINUX)

检索带有添加到变量&#34; MYDEFS&#34;中的定义的字符串。你可以在CMake中使用以下几行:

get_directory_property(MYDEFS COMPILE_DEFINITIONS)
MESSAGE( STATUS "Compile defs contain: " ${MYDEFS} )

然后,您可以检查${MYDEFS}中是否存在您要查找的定义。例如

if(MYDEFS MATCHES "^OS=" OR MYDEFS MATCHES ";OS=")
    MESSAGE( STATUS "OS defined" )
else()
    # You can define your OS here if desired
endif()