cmake检查Mac OS X,使用APPLE或$ {APPLE}

时间:2014-12-26 17:33:18

标签: cmake

我想检查一下我是否使用的是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}来引用变量,何时不应该?

提前致谢。

2 个答案:

答案 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)

引用CMake Documentation

  

if命令是在CMake的历史中很早就编写的,早于$ {}变量评估语法,为了方便起见,评估由其参数命名的变量,如上面的签名所示。请注意,在if命令甚至接收参数之前,使用带有$ {}的常规变量求值。因此代码如下:

set(var1 OFF)
set(var2 "var1")
if(${var2})
  

在if命令中显示为:

if(var1)
  

并根据上面记录的if()案例进行评估。结果是OFF,这是错误的。但是,如果我们从示例中删除$ {},那么命令会看到:

if(var2)
  

这是真的,因为var2被定义为“var1”,它不是假常量。