在我的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中是否存在文件的正确方法是什么?
答案 0 :(得分:119)
检查文件是否存在的正确方法,如果您已经知道文件的完整路径名,则只需:
if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
...
else()
...
endif()
答案 1 :(得分:8)
您应该可以使用
if(NOT ${project_name}_${customer}_config)
来自docs:
if(<constant>)
如果常量为1,ON,YES,TRUE,Y或非零数字,则为真。如果常量为0,OFF,NO,FALSE,N,IGNORE,“”或以后缀'-NOTFOUND'结尾,则返回false。
但是,如果使用find_file
找到 文件,则会缓存该值,并且后续运行的CMake将不会再尝试找到它。要在find_file
调用之前强制重新检查每次运行:
unset(${project_name}_${customer}_config CACHE)
答案 2 :(得分:4)
我相信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的错误消息。
答案 3 :(得分:0)
根据条件语法docs:
if(EXISTS path-to-file-or-directory)
如果命名的文件或目录存在,则为真。 行为仅针对完整路径进行了明确定义。解析符号链接,即,如果命名的文件或目录是符号链接,则如果符号链接的目标存在,则返回true。
如果您要查找的文件位于当前cmakelist文件中,则一种解决方案可能是:
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE_WORKING_ON})
...