2014-12-26 71 views
3

我想檢查我是否在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}以及我們什麼時候不應該?

在此先感謝。

回答

4

簡而言之:如果將括號內的所有內容評估爲表達式,則這是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(var1) 

,並根據上述記錄的,如果()的情況下進行評價。結果是關閉,這是錯誤的。但是,如果我們從示例刪除$ {}然後命令看到:

​​

因爲VAR2被定義爲「VAR1」,這是不是假的常數,是真實的。

2

不是100%相關的,但是如何在CMake中檢查OSx的Google搜索時,這是最重要的帖子。對於其他在這裏登陸的人提出同樣的問題,這對我來說很有效。

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