CMake检查是否存在本地文件

时间:2012-10-25 11:17:06

标签: 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()

但似乎这不起作用。

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

4 个答案:

答案 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}) ...