检查本地文件是否存在

在我的 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 中是否存在文件的正确方法是什么?

97455 次浏览

你应该可以只用

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

来自 医生:

if(<constant>)

如果常数为1、 ON、 YES、 TRUE、 Y 或非零数,则为 TRUE。如果常数为0、 OFF、 NO、 FALSE、 N、 IGNORE、“”或以后缀’-NOTFOUND’结尾,则为 FALSE。

但是,如果使用 find_file找到的文件 ,则该值将被缓存,并且随后运行的 CMake 将不会尝试再次找到它。在执行 find_file调用之前,在每次运行时强制重新检查:

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

如果您已经知道文件的完整路径名,那么检查文件是否存在的正确方法很简单:

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

我相信 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()

编辑 : 在 execute_process中添加 ERROR_QUIET,否则当文件不存在时,您将从 ls 获得错误消息。

来自条件语法 医生:

if(EXISTS path-to-file-or-directory)

如果指定的文件或目录存在,则为。行为仅在完整路径中定义良好.解析符号链接,即如果指定的文件或目录是符号链接,则如果符号链接的目标存在,则返回 true。

如果您要查找的文件位于当前 cmakelist 文件中,那么一个解决方案可能是:

if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE_WORKING_ON}) ...