CMake检查是否存在本地文件

Fer*_*eak 56 file cmake file-exists

在我的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()
Run Code Online (Sandbox Code Playgroud)

但似乎这不起作用.

检查CMake中是否存在文件的正确方法是什么?

DLR*_*ave 128

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

if(EXISTS "${ROOT}/configuration/${customer}/configuration.${project_name}.xml")
   ...
else()
   ...
endif()
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,"EXISTS"并不是它声称要做的.如果无法读取或写入已检查的文件,则返回false,尽管文件可见.这是一个令人遗憾的错误,因为这有时可能很有用,就像存在某个设备文件一样. (4认同)
  • [文档在这里](https://cmake.org/cmake/help/v3.5/command/if.html?highlight=EXISTS) (2认同)
  • 对于最新的 cmake(至少 3.14+),这是不完整的答案。您必须另外测试非目录路径:`if (EXISTS "..." AND NOT IS_DIRECTORY "...")` 只要 `EXISTS` 在目录上也返回 true ! (2认同)

Fra*_*ser 9

你应该可以使用

if(NOT ${project_name}_${customer}_config)
Run Code Online (Sandbox Code Playgroud)

来自文档:

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)
Run Code Online (Sandbox Code Playgroud)


小智 8

来自条件语法文档

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

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

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

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


ZHA*_*kai 6

我相信这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()
Run Code Online (Sandbox Code Playgroud)

编辑:添加ERROR_QUIETexecute_process否则文件不存在时,您将从ls收到错误消息。