我想检查一下我是否在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)
简而言之: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变量可以让您测试更具体的内容。
| 归档时间: |
|
| 查看次数: |
8000 次 |
| 最近记录: |