Подтвердить что ты не робот

CMake проверить, существует ли локальный файл

В моем CMake script Я хочу посмотреть, есть ли у меня файл в моей системе, и если он там что-то делает с ним, в противном случае что-то делает с файлом по умолчанию. Вот код:

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?

4b9b3361

Ответ 1

Правильный способ проверить, существует ли файл, если вы уже знаете полное имя пути к файлу, просто:

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

Ответ 2

Вы должны просто использовать

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

В docs:

if(<constant>)

Истинно, если константа равна 1, ON, YES, TRUE, Y или ненулевому числу. False, если константа равна 0, OFF, NO, FALSE, N, IGNORE, "или заканчивается в суффиксе" -NOTFOUND".

Однако, если файл найден с помощью find_file, значение кэшируется, а последующие прогоны CMake не будут пытаться найти его снова. Чтобы принудительно выполнить повторную проверку при каждом запуске, перед вызовом find_file выполните следующие действия:

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

Ответ 3

Я считаю, что 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_QUIET в execute_process или вы получите сообщения об ошибках от ls, когда файл не существует.