2014-12-26 3 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 оценивается как выражение, это семантика ключевого слова if. Поэтому, если вы положили APPLE, он получает оценку как имя переменной и дает правильный результат.

Теперь, если вы поставите ${APPLE} там, ${} оценит его содержание до тогоif оценивает выражение. Таким образом, это то же самое, как если бы вы написали

if (1 AND) 

(в том случае, если переменная APPLE не установлено, что имеет место в системах, не OSX). Это недопустимый синтаксис и дает ошибку. Вы должны написать:

if (FOO AND APPLE) 

Цитирование из CMake Documentation:

Условной команда была написано очень рано в истории CMake, в предшествовавших $ {} синтаксис переменной оценки, а также для удобства оценивает переменные, названный его как показано в приведенных выше подписях. Обратите внимание, что обычная оценка переменных с помощью $ {} применяется до того, как команда if даже примет аргументы. Поэтому код, как:

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

появляется в команде, если как:

if(var1) 

и оценивается в зависимости от случая, если() документированной выше. Результатом является значение OFF, которое является ложным. Однако, если мы удалим $ {} из примера, то команда видит:

if(var2) 

, которое истинно, потому что var2 определяется «var1», которая не является ложной постоянной.

2

Не на 100% актуально, но когда поиск в Google для проверки OSx в CMake это верхний пост. Для других, кто приземляется здесь, задавая один и тот же вопрос, это сработало для меня.

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 
    set(MACOSX TRUE) 
endif() 
Смежные вопросы