【发布时间】:2013-09-18 01:46:05
【问题描述】:
我有一个自定义构建命令需要检查某个文件是否存在。我尝试使用
IF(EXISTS "/the/file")
...
ELSE()
...
ENDIF()
但该测试仅评估一次;当 cmake 首次运行时。每次制作完成时,我都需要它来执行测试。制作时检查的方法是什么?谢谢。
【问题讨论】:
-
显示自定义构建命令的其余部分。
我有一个自定义构建命令需要检查某个文件是否存在。我尝试使用
IF(EXISTS "/the/file")
...
ELSE()
...
ENDIF()
但该测试仅评估一次;当 cmake 首次运行时。每次制作完成时,我都需要它来执行测试。制作时检查的方法是什么?谢谢。
【问题讨论】:
您可以使用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()
【讨论】:
您将需要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...")
【讨论】:
COMMAND test -e output.txt || echo "Do something if file does not exist" COMMAND test ! -e output.txt || echo "Do something if file exist"
[@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"
)
【讨论】: