我有一个自定义构建命令需要检查某个文件是否存在。我尝试使用
IF(EXISTS "/the/file")
...
ELSE()
...
ENDIF()
但该测试仅评估一个;当 cmake 首次运行时。每次制作完成时,我都需要它来执行测试。制作时检查的方法是什么?谢谢。
您可以使用命令行选项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()
你会需要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...")
如果您需要在 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"
)