我想检查一下我是否使用的是Mac OS X,并拥有以下代码
cmake_minimum_required (VERSION 3.0)
project (test)
set (FOO 1)
if (${FOO} AND ${APPLE})
message ("MAC OS X")
endif ()
在非OSX系统上失败并显示错误消息
CMake Error at CMakeLists.txt:4 (if):
if given arguments:
"1" "AND"
Unknown arguments specified
如果我将${APPLE}
替换为APPLE
,则错误就会消失。但我有点困惑。我们何时应该使用${VAR}
来引用变量,何时不应该?
提前致谢。
答案 0 :(得分:12)
不是100%相关但是当谷歌搜索如何在CMake中检查OSx时,这是最重要的帖子。对于那些在这里问同样问题的人来说,这对我有用。
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(MACOSX TRUE)
endif()
答案 1 :(得分:7)
简单地说:if括号内的所有内容都被评估为表达式,这是if
关键字的语义。因此,如果您将APPLE
放在那里,它将被评估为变量名称并产生正确的结果。
现在,如果您将${APPLE}
放在那里,${}
将在 if
评估表达式之前评估其内容。因此,它就像你写的一样
if (1 AND )
(在没有设置变量APPLE
的情况下,非OSX系统就是这种情况)。这是无效的语法并产生您得到的错误。你应该写:
if (FOO AND APPLE)
if命令是在CMake的历史中很早就编写的,早于$ {}变量评估语法,为了方便起见,评估由其参数命名的变量,如上面的签名所示。请注意,在if命令甚至接收参数之前,使用带有$ {}的常规变量求值。因此代码如下:
set(var1 OFF)
set(var2 "var1")
if(${var2})
在if命令中显示为:
if(var1)
并根据上面记录的if()案例进行评估。结果是OFF,这是错误的。但是,如果我们从示例中删除$ {},那么命令会看到:
if(var2)
这是真的,因为var2被定义为“var1”,它不是假常量。