Ответ 1
Правильный способ проверить, существует ли файл, если вы уже знаете полное имя пути к файлу, просто:
if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
...
else()
...
endif()
В моем 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?
Правильный способ проверить, существует ли файл, если вы уже знаете полное имя пути к файлу, просто:
if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
...
else()
...
endif()
Вы должны просто использовать
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)
Я считаю, что 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, когда файл не существует.