2012-10-25 3 views
32

제 CMake 스크립트에서 필자는 시스템에 파일이 있는지보고 싶습니다. 그리고 거기에 파일이 있다면, 그렇지 않으면 기본 파일로 무언가를하십시오. 코드는 다음과 같습니다.CMake 로컬 파일이 존재하는지 확인하십시오.

find_file(
      ${project_name}_${customer}_config 
      ${ROOT}/configuration/${customer}/configuration.${project_name}.xml 
) 

if(NOT ${${project_name}_${customer}_config} STREQUAL 
    ${project_name}_${customer}_config-NOTFOUND) 
     configure_file(${ROOT}/configuration/${customer}/configuration.${project_name}.xml 
         ${CMAKE_CURRENT_BINARY_DIR}/conf/configuration.xml) 
else() 
    configure_file(${FAPP_ROOT}/configuration/Default/configuration.${project_name}.xml 
        ${CMAKE_CURRENT_BINARY_DIR}/conf/configuration.xml) 
endif() 

하지만 이것은 작동하지 않는 것 같습니다.

파일이 CMake에 있는지 확인하는 적절한 방법은 무엇입니까?

답변

89

적절한 방법은, 확인하는 것은 단순히 :

if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml") 
    ... 
else() 
    ... 
endif() 
+0

[문서는 여기입니다.] (https://cmake.org/cmake/help/v3.5/command/if.html?highlight=EXISTS) – teivaz

7

당신은 단지 docs에서

if(NOT ${project_name}_${customer}_config) 

을 사용할 수 있어야합니다 : 상수는, YES, ON, Y TRUE 일 경우

if(<constant>)

사실, 또는 0이 아닌 숫자. 상수가 0, OFF, NO, FALSE, N, IGNORE, ""또는 접미사 '-NOTFOUND'로 끝나는 경우 False입니다. 파일 find_file 사용하여 발견 경우

그러나, 값은 캐시 및 CMake의 후속 실행은 다시 찾으려고하지 않습니다. find_file 호출하기 전에, 모든 실행에 다시 검사를 강제로 수행 파일이 존재하는 경우 이미 파일의 전체 경로 이름을 알고있는 경우

unset(${project_name}_${customer}_config CACHE) 
2

저는 if (EXISTS <path>)이 좋은 해결책이라고 생각합니다. 최근에 발생한 시나리오를 공유하고 싶습니다. 대부분의 경우이 시나리오를 신경 쓰지 않을 것입니다.

유효 사용자가 파일에 액세스 할 수없는 경우이 솔루션은 true를 반환하지 않습니다. 파일은 존재하지만 읽을 수는 없습니다.

이 같은 result 확인 후 해당 파일이 실제로 존재 여부, execute_process(COMMAND ls /dev/fb0 RESULT_VARIABLE result OUTPUT_QUIET ERROR_QUIET)를 호출하는 것입니다 여부를 걱정하고 경우이 시나리오에 대한 해결 방법 :

if (result) 
    message("/dev/fb0 doesn't exist.") 
endif() 

편집가 : execute_processERROR_QUIET를 추가하거나 파일이 존재하지 않으면 ls에서 오류 메시지를받습니다.