78

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

4

4 回答 4

172

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

if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
   ...
else()
   ...
endif()
于 2012-10-26T14:59:52.773 回答
9

你应该可以使用

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

文档

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)
于 2012-10-25T12:29:42.263 回答
7

我相信这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 收到错误消息。

于 2016-06-16T03:49:10.220 回答
4

从条件语法文档

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

如果指定的文件或目录存在,则为真。行为仅对完整路径进行了明确定义。解析符号链接,即如果指定的文件或目录是符号链接,如果符号链接的目标存在,则返回 true。

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

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

于 2019-12-30T09:45:07.770 回答