2014-09-12 1 views
15

왜 나는 CMake의 변수들이 달러 기호와 중괄호로 싸여 있는지 궁금합니다. 예를 들어이 전화는 in a CMake tutorial입니다.

include_directories(${PROJECT_BINARY_DIR}) 

하지만 내가 시도한 것에서도 마찬가지입니다.

include_directories(PROJECT_BINARY_DIR) 

${...}의 포장은 언제 무엇입니까? 차이가 없다고하더라도 변수가 종종이 래핑되는 이유는 무엇입니까? the CMake documentation을 인용

답변

14

:

변수 참조${variable_name}을 가지며 인용 인수 나 인용되지 않은 인자 내부를 평가 하였다. 변수 참조 은 변수 값으로 대체되거나 변수가 설정되지 않은 경우 빈 문자열로 대체됩니다.

즉, PROJECT_BINARY_DIR은 글자 그대로 "PROJECT_BINARY_DIR"문자열을 나타냅니다. ${...}에 캡슐화하면 이라는 내용이 PROBECT_BINARY_DIR이라는 변수의이됩니다.

고려 : 당신은 아마 이미 짐작으로

set(FOO "Hello there!") 
message(FOO)  # prints FOO 
message(${FOO}) # prints Hello there! 

, include_directories(PROJECT_BINARY_DIR) 단순히 포함 디렉토리 이름 PROJECT_BINARY_DIR의 하위 디렉토리를 추가하려고 시도합니다. 대부분의 빌드 시스템에서 그러한 디렉토리가 존재하지 않는다면 명령을 무시하기 때문에 명령이 예상대로 작동한다는 인상을 줄 수 있습니다. 상수가 1이면

if(<constant>)

사실 : 다시 the documentation explains this behavior

set(FOO TRUE) 
if(FOO) 
    message("Foo was set!") 
endif() 

:

혼란의 인기 소스는 if() 변수를 명시 적으로 역 참조를 필요로하지 않는다는 사실에서 온다 , ON, YES, TRUE, Y 또는 0이 아닌 숫자. 상수가 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, 빈 문자열이거나 접미사 -NOTFOUND로 끝나는 경우 False입니다. 명명 된 부울 상수 은 대소 문자를 구분하지 않습니다. 인수가 이러한 상수 중 하나가 아니면 변수로 처리됩니다.

if(<variable>)

참 변수가 거짓 일정하지 않은 값으로 정의되는 경우. 그렇지 않으면 거짓. (매크로 인수는 변수가 아닙니다.변수 경우에 TRUE 지점, 그리고 일정한 경우에 FALSE 분기를 취할 것

unset(BLA) 
set(FOO "BLA") 
if(FOO) 
    message("if(<variable>): True") 
else() 
    message("if(<variable>): False") 
endif() 
if(${FOO}) 
    message("if(<constant>): True") 
else() 
    message("if(<constant>): False") 
endif() 

:) 특히

, 하나는 같은 이상한 예를 가지고 올 수 있습니다. 이것은 상수 인 경우 CMake가 변수 BLA을 찾아 (정의되지 않았기 때문에 FALSE 브랜치로 끝납니다) 체크를 수행하기 때문입니다.

+0

어떻게하면 if (SFML_FOUND)와 같은 것이 작동합니까? – danijar

+2

'if()'는 변수와 값 모두에서 작동하므로 특별한 경우입니다. 'if (SFML_FOUND)'와'if ($ {SFML_FOUND}) '가 모두 작동하는 동안 그들은 실제로 다른 일을합니다 : [if'에 대한 문서]를 확인하십시오 (http://www.cmake.org/cmake/help /v3.0/command/if.html),'if ()'와'if ()'의 차이에 특별한주의를 기울이십시오. 그에 따라 답변을 업데이트하겠습니다. – ComicSansMS

관련 문제