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

Man*_*dhu 6 preprocessor cmake

我无法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()
Run Code Online (Sandbox Code Playgroud)

以下测试不起作用:

if (NOT COMMAND OS)
if (NOT DEFINED OS)
if (NOT OS)
Run Code Online (Sandbox Code Playgroud)

我可以通过使用set()并测试常规cmake变量然后定义预处理器宏来使其工作.例如:

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

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

include(project_defs.txt)
if (OS)
    ....
Run Code Online (Sandbox Code Playgroud)

arr*_*owd 2

通常,传递给编译器的所有定义均由 CMake 控制。也就是说,您使用以下命令创建一个 CMake 变量

option(SOMEFEATURE "Feature description" ON)
Run Code Online (Sandbox Code Playgroud)

或者

set(OS "" CACHE STRING "Select your OS")
Run Code Online (Sandbox Code Playgroud)

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

更新:

如果您确实想访问预处理器标志,可以使用COMPILE_DEFINITIONS目标属性。您可以通过以下方式访问它:

get_target_property(OUTVAR target COMPILE_DEFINITIONS)
Run Code Online (Sandbox Code Playgroud)