cmake:检查文件是否在构建时存在,而不是在cmake配置期间

时间:2013-09-13 11:25:27

标签: file cmake exists

我有一个自定义构建命令,需要检查某个文件是否存在。我尝试使用

IF(EXISTS "/the/file")
...
ELSE()
...
ENDIF()

但该测试仅评估一个;当cmake第一次运行时。每次制作完成后我都需要它来执行测试。什么是在制作时检查的方法?感谢。

3 个答案:

答案 0 :(得分:10)

您可以使用add_custom_command使用-P命令行选项以脚本模式调用CMake本身。

所以你的命令就像:

set(FileToCheck "/the/file")
add_custom_command(TARGET MyExe
                   POST_BUILD
                   COMMAND ${CMAKE_COMMAND}
                       -DFileToCheck=${FileToCheck}
                       -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake
                   COMMENT "Checking if ${FileToCheck} exists...")

和您的脚本文件“check.cmake”类似于:

if(EXISTS ${FileToCheck})
  message("${FileToCheck} exists.")
else()
  message("${FileToCheck} doesn't exist.")
endif()

答案 1 :(得分:0)

类似的想法

您需要set(FileToCheck "/the/file") add_custom_command( OUTPUT output.txt COMMAND test -e output.txt || echo "Do something meaningful" COMMENT "Checking if ${FileToCheck} exists...") ,但如果您愿意特定于Unix,则可以始终使用test

xhttp.open("GET", "http://example.com/XML/someXMLfile.xml", true);

答案 2 :(得分:0)

[@Frazers] 如果您需要在 if(EXISTS) 中添加自定义逻辑,答案会很棒。 但是,如果您只需要在缺少单个文件的情况下构建失败,您可以使用 cmake -E 命令行模式将文件与其自身进行比较。

如果提供的文件不存在,这将确保构建总是停止,它是跨平台安全的,并且可以在自 3.0 以来的每个版本的 cmake 中工作。

set(_fileToCheck "foo.txt")
add_custom_command(TARGET YourTarget
  PRE_BUILD
  COMMAND ${CMAKE_COMMAND} -E compare_files ${_fileToCheck} ${_fileToCheck}
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  COMMENT "Checking if ${_fileToCheck} exists, build will fail if it doesn't"
)