2016-09-21 13 views
0

환경 변수에 지정할 변수가 필요합니다. 건물이 없으면 건물을 중지해야합니다.설정해야하고 cmake에 존재해야하는 변수를 지정하는 방법

예를

내가 스크립트에 어디 에나 if (defined VARMUSTEXIST)을 넣어하지 않으
if ("${VARMUSTEXIST}" STREQUAL "ON") 
    message(STATUS is ON) 
elif ("${VARMUSTEXIST}" STREQUAL "OFF") 
    message(STATUS is OFF) 
endif() 

. bash에는 "set -u"옵션이 있습니다.

+0

역 참조 할 때 CMake는 정의되지 않은 모든 변수를 빈 값으로 처리합니다. 내가 아는 한이 동작에 영향을 줄 수있는 방법은 없습니다. 그런데 간단한 if (VARMUSTEXIST)는 변수가 정의되어 있지 않으면 * false *로 취급됩니다. "ON"과 "OFF"중 하나를 선택하는 데에도 같은 조건이 사용될 수 있습니다.이 문자열은 [if] (https://cmake.org/cmake/help/v3.0/command/if.html) 명령에 특별한 의미가 있습니다. – Tsyvarev

답변

1

일부 예비 점 : cmake에서 일반적으로

  • if ("${VARMUSTEXIST}" STREQUAL "ON") [...] elif(AGAIN LONG EXPRESSION) [...] endif()
    는 단순히 :
    if (VARMUSTEXIST) [...] else() [...] endif()
  • 명령 if (DEFINED VARMUSTEXIST)DEFINED 필요는 대문자로한다.
  • 당신은 bash는 환경 변수를 언급 :
    환경 변수 환경 변수의 $ENV{VARIABLE_NAME}
  • 를 사용하여 읽기 당신이 할 것입니다 :

    if(NOT DEFINED ENV{VARMUSTEXIST}) 
        message(FATAL_ERROR "You must set VARMUSTEXIST environment variable") 
    endif() 
    

당신은 말 :

I don't want to put an if (defined VARMUSTEXIST) everywhere in the script

이가 나에게 명확하지 않다 : 각 변수에 대해, CMakeLists.txt 메인 메뉴에서 한 번만 검사하면된다. 물론 NOT을 추가해야합니다. if (NOT DEFINED VARMUSTEXIST) [stop]

문제를보다 정확하게 파악할 수 있다면 변수 또는 변수 그룹이 정의되어 있는지 확인하는 매크로를 설계 할 수 있습니다.

+0

변수 목록을 확인하기 위해 cmake 스크립트의 시작 부분에 매크로를 사용하는 것이 좋지만 개발자가 실수를해서 변수 이름이 잘못 입력 된 경우를 포착하지 못합니다. Cmake는 자동으로 계속됩니다. 내가하고 싶은 것은 말하는 cmake가 변수의 값을 읽을 때 변수가 정의되어 있는지 항상 확인하고 그렇지 않으면 실패해야한다는 것입니다. 호환성을 위해 현재 cmake-file에 대해서만이 옵션을 사용 가능하게 설정해야합니다. 그렇지 않으면 기존 cmake-file을 손상시키지 않고 포함시킬 수 없습니다. –

+0

bash는 모든 변수를 정의해야한다는 특성 때문에 언급했습니다. !/bash' '-u' 설정 'VAR는 = Y' '에코 $ {VA가}' 가지고 멋진 것 '#/빈 : 예를 들어 다음과 같은 bash는 스크립트 오류가 발생합니다 가능성과 같이 작성 : 'cmake_policy (SET가 OFF READ_UNDEFINED_VARIABLES)' '메시지 ​​(STATUS을 $ {VA})' 메시지 라인은 지금 실패 곳. 존재를 확인하기 전에'if (DEFINED VA)'를 사용하여 그것을 사용할 수 있습니다. –

+1

@ D.Alex 개발자의 철자 오류에 대해 몇 년 전 정확히 동일한 문제가 제기되었습니다. [here] (http://public.kitware.com/pipermail/cmake/2008-November/025421.html)를 참조하십시오.불행히도 해결 방법은 없습니다. 어쩌면 기능 요청을 내고 싶을 수도 있습니다. C에서조차도 [해결 방법]이 있습니다 (http://stackoverflow.com/questions/33759787/generating-an-error-if-checked-boolean-macro-is-not- 한정된)). 그런데 이전 버전과의 호환성을 위해 도입 된 정책은 이러한 목적에 적합하지 않습니다. [doc] (https://cmake.org/cmake/help/v3.5/manual/cmake-policies.7.html)을 참조하십시오. – Antonio