2012-11-27 14 views
7

같은 사이 cmake의 차이, 무엇인가

set(any_new_var ${old_var}) 

set(any_new_var "${old_var}") 

중요한 차이점은? 언제 내가 하나 또는 다른 양식을 사용합니까?

예를 들어, 내가 (때문에 'A'정의되지 않은) 다음 미니 테스트

# test.cmake 

# Variable 'a' isn't defined. 
set(hola "${a}") 

# message(${hola}) 
message("${hola}") 

이 미니 테스트의 출력 (cmake -P test.cmake) 빈 라인이 함께 시도 .

CMake Error at prueba.cmake:6 (message): 
    message called with incorrect number of arguments 

왜 두 번째 경우에는 포기하지 않고 오류 만 빈 줄 : 나는 첫 번째 메시지의 주석을 해제하면, cmake는 메시지 오류가 발생합니다?

+1

나중에 참조 할 수있는 유용한 구문 설명 : http://www.cmake.org/Wiki/CMake/Language_Syntax – raek

+0

해당 페이지에서 매우 유용합니다. 나를위한 newcommers에 대한 주요 참고 자료 : –

답변

8

In CMake 문자열은 목록으로 해석 될 수 있습니다. 규칙은 간단합니다. 목록을 작성하려면 문자열을 세미콜론으로 분리하십시오. 예를 들어 문자열 값 one;two;threeone, twothree의 세 가지 요소 목록으로 생각할 수 있습니다.

명령을 호출하려면 명령 이름과 일부 단어를 괄호 안에 씁니다. 그러나이 단어들은 이 아니며은 명령이 일대일 방식으로받는 인수에 해당합니다. 각 단어는 0 개 이상의 인수가되고 모든 인수는 함께 연결됩니다. 단어가 인용되어 있지 않으면 단어가 목록으로 취급되고 여러 개의 인수로 확장됩니다. 인용 된 단어는 항상 하나의 인수가됩니다. 예를 들어

Xone;two;three에, Y가 빈 문자열에 바인딩 바인딩 및 Zfoo에 바인딩되어 있다고 가정합니다. 다음 명령 호출은 세 단어를 가지고 있지만,이 명령은 네 개의 인수를받습니다 원래로 돌아가려면

some_command("${X}" "${Y}" "${Z}") 
# The command receives three arguments: 
# 1. one;two;three 
# 2. (the empty list) 
# 3. foo 

: 우리가 말씀을 인용했을 경우, 명령이 세 개의 인수를받은 것

some_command(${X} ${Y} ${Z}) 
# The command receives four arguments: 
# 1. one 
# 2. two 
# 3. three 
# 4. foo 

질문 : message 명령은 다양한 수의 인수를 수신 할 수 있습니다. 그것은 모든 인수를 취해이를 하나의 문자열로 결합한 다음 해당 문자열을 인쇄합니다. 어떤 알려지지 않은 이유로 그것은 제로 인수를 받아들이지 않습니다. 당신이 단일 인용 인수를 사용하는 경향이 있으므로

message 여러 인수와 함께이 동작은 매우 유용되지 않습니다 : set 여러 인수를받을 때 또한

set(SOURCES foo.c hoo.h) 
message(${SOURCES}) # prints foo.cfoo.h 
message("${SOURCES}") # prints foo.c;foo.h 

를, 그것은 분리 된 인수의 문자열을 구축 세미콜론으로. 변수는 그 문자열로 설정됩니다.

+0

$ {...} 구문은 문자열 대체를 의미하며 거의 모든 곳에서 사용할 수 있습니다 (심지어 중첩 할 수도 있음).CMake는 문자열 중심 언어입니다. – raek