programing

CMake는 로컬 파일이 있는지 확인합니다.

luckcodes 2021. 1. 17. 11:29

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에 파일이 있는지 확인하는 적절한 방법은 무엇입니까?


파일의 전체 경로 이름을 이미 알고있는 경우 파일이 있는지 확인하는 올바른 방법은 다음과 같습니다.

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

그냥 사용할 수 있어야합니다

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

로부터 문서 :

if(<constant>)

상수가 1, ON, YES, TRUE, Y 또는 0이 아닌 숫자이면 참. 상수가 0, OFF, NO, FALSE, N, IGNORE, ""이거나 접미사 '-NOTFOUND'로 끝나는 경우 False입니다.

그러나을 사용하여 파일 찾으면 find_file값이 캐시되고 후속 CMake 실행에서 다시 찾으려고 시도하지 않습니다. 모든 실행에 대해 강제로 다시 확인하려면 find_file호출 하기 전에 다음을 수행하십시오.

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

나는 이것이 if (EXISTS <path>)좋은 해결책 이라고 믿습니다 . 대부분의 경우이 시나리오에 관심이 없겠지만 최근에 만난 시나리오를 공유하고 싶습니다.

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

파일이 실제로 존재하는지 여부에 관심이있는 경우이 시나리오의 해결 방법은 execute_process(COMMAND ls /dev/fb0 RESULT_VARIABLE result OUTPUT_QUIET ERROR_QUIET)다음 result과 같이 호출 한 다음 확인하는 것입니다.

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

편집 : 추가 ERROR_QUIETexecute_process나 파일이 존재하지 않을 때 당신은 LS에서 오류 메시지를 받게됩니다.

참조 URL : https://stackoverflow.com/questions/13067401/cmake-check-that-a-local-file-exists