6

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

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

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

4

3 回答 3

18

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

所以你的命令会是这样的:

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()
于 2013-09-14T10:20:36.250 回答
3

类似的想法

你会需要add_custom_command,但如果你愿意稍微了解一下 Unix,你总是可以使用test

set(FileToCheck "/the/file")
add_custom_command( OUTPUT output.txt
    COMMAND test -e output.txt || echo "Do something meaningful"
    COMMENT "Checking if ${FileToCheck} exists...")
于 2018-03-19T13:12:32.043 回答
1

如果您需要在 if(EXISTS) 中添加自定义逻辑,[@Frazers] 答案非常好。但是,如果您只需要在缺少单个文件的情况下使构建失败,则可以使用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"
)
于 2021-07-14T17:35:34.097 回答