【问题标题】:cmake check if Mac OS X, use APPLE or ${APPLE}cmake 检查 Mac OS X,使用 APPLE 或 ${APPLE}
【发布时间】:2022-01-09 17:32:14
【问题描述】:

我想检查我是否在 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} 来引用变量,什么时候不应该?

提前致谢。

【问题讨论】:

标签: cmake


【解决方案1】:

不是 100% 相关,但是当谷歌搜索如何在 CMake 中检查 OSx 时,这是最重要的帖子。对于其他来到这里提出相同问题的人来说,这对我有用。

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    set(MACOSX TRUE)
endif()

【讨论】:

  • 谢谢,这就是我要找的!
  • CMake 邮件列表提到这在技术上并非万无一失:“Darwin 是 OS X 的 Unix 基础,它是开源的。我可以运行 Darwin 系统,但它不是 OS十。”。除了APPLE,我找不到任何强有力的替代品。
【解决方案2】:

简而言之: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”,这不是一个假常数。

【讨论】:

    【解决方案3】:

    这也适用于测试 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()
    

    APPLE 应在 UNIX 之前测试,因为对于 Mac OS,UNIX 设置为 true

    按照@Matthew Hogan 的建议测试CMAKE_SYSTEM_NAME 变量可以让您测试更具体的内容。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2010-12-05
      • 2012-03-15
      • 2011-12-29
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 2013-01-26
      • 2016-07-05
      相关资源
      最近更新 更多