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

Yin*_*ong 6 cmake

我想检查一下我是否在Mac OS X中,并且具有以下代码

cmake_minimum_required (VERSION 3.0)
project (test)
set (FOO 1)
if (${FOO} AND ${APPLE})
  message ("MAC OS X")
endif ()
Run Code Online (Sandbox Code Playgroud)

它在非OSX系统上失败并显示错误消息

CMake Error at CMakeLists.txt:4 (if):
  if given arguments:

    "1" "AND"

  Unknown arguments specified
Run Code Online (Sandbox Code Playgroud)

如果我更换${APPLE}APPLE,错误就走开了.但我有点困惑.什么时候应该引用变量${VAR}?何时不应该?

提前致谢.

Mat*_*gan 20

不是100%相关,但是当谷歌搜索如何在CMake中检查OSx时,这是最高职位.对于那些在这里问同样问题的人来说,这对我有用.

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    set(MACOSX TRUE)
endif()
Run Code Online (Sandbox Code Playgroud)

  • CMake 邮件列表提到,这在技术上并不是万无一失的:*“Darwin 是 OS X 的 Unix 基础,并且它是开源的。我可以运行 Darwin 系统,但它不是 OS X。”*。除了“APPLE”之外,我找不到任何强有力的替代品。 (3认同)
  • 谢谢,这就是我正在寻找的! (2认同)

fly*_*lyx 8

简而言之:if括号内的所有内容都被计算为表达式,这是if关键字的语义.因此,如果您放在APPLE那里,它将被评估为变量名称并产生正确的结果.

现在,如果你放在${APPLE}那里,${} if评估表达式之前评估其内容.因此,它就像你写的一样

if (1 AND )
Run Code Online (Sandbox Code Playgroud)

(如果APPLE未设置变量,则在非OSX系统上就是这种情况).这是无效的语法并产生您得到的错误.你应该写:

if (FOO AND APPLE)
Run Code Online (Sandbox Code Playgroud)

引用CMake文档:

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

set(var1 OFF)
set(var2 "var1")
if(${var2})
Run Code Online (Sandbox Code Playgroud)

if命令看起来像:

if(var1)
Run Code Online (Sandbox Code Playgroud)

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

if(var2)
Run Code Online (Sandbox Code Playgroud)

这是真的,因为var2被定义为"var1",它不是假常量.


小智 5

这也适用于 Windows、Mac 和 *Nix 的测试

if(WIN32)
   message("https://cmake.org/cmake/help/latest/variable/WIN32.html?highlight=win32")
elseif(APPLE)
   message("https://cmake.org/cmake/help/latest/variable/APPLE.html?highlight=apple")
elseif(UNIX)
    message("https://cmake.org/cmake/help/latest/variable/UNIX.html?highlight=unix")
endif()
Run Code Online (Sandbox Code Playgroud)

APPLE应先进行测试,UNIX因为UNIX设置true为 Mac OS。

正如@Matthew Hogan 所建议的那样,测试CMAKE_SYSTEM_NAME变量可以让您测试更具体的内容。