我无法让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
答案 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()