我的程序链接后,我需要对它进行一些后处理。我添加了一个add_custom_command(TARGET ...
并且运行正常。但是,这个额外的自定义命令会运行一个脚本(不会生成;它会被检入到代码库中),如果该脚本发生更改,我希望将目标视为过时,以便正确地重建目标。
add_dependencies
规则似乎只适用于顶级元素,而这不是(它只是一个脚本),并且DEPENDS
的这种形式中没有add_custom_command
元素我可以使用。
我该怎么做?
答案 0 :(得分:2)
遗憾的是,有点令人费解,但您可以使用add_custom_target
通过-P
在脚本处理模式下调用CMake。
您需要在此使用add_custom_target
,因为即使所有内容都是最新的,始终也会执行。
做出这个决定后,我们需要有自定义目标执行命令,它将检查你的后处理脚本文件的新版本(让我们称之为“my_script”并假设它在你的根目录中),如果它是改变导致您的依赖目标过时。
这包括:
使用execute_process
调用cmake -E
可以实现CMake脚本中所需的所有命令。
因此CMake脚本(例如“copy_script.cmake”)将类似于:
execute_process(COMMAND ${CMAKE_COMMAND} -E compare_files
${OriginalScript} ${CopiedScript} RESULT_VARIABLE Result)
if(Result)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy
${OriginalScript} ${CopiedScript})
execute_process(COMMAND ${CMAKE_COMMAND} -E touch_nocreate ${FileToTouch})
endif()
CMake脚本需要在调用-P
之前通过-D
args 传入所需的变量,因此调用CMakeLists.txt会有类似的内容:
set(FileToTouch ${CMAKE_SOURCE_DIR}/src/main.cpp)
add_custom_target(CopyScript ALL ${CMAKE_COMMAND}
-DOriginalScript=${CMAKE_SOURCE_DIR}/my_script
-DCopiedScript=${CMAKE_BINARY_DIR}/my_script
-DFileToTouch=${FileToTouch}
-P ${CMAKE_SOURCE_DIR}/copy_script.cmake)
add_executable(MyExe ${FileToTouch})
这将导致可执行文件的完全重建,因为它认为源文件已被修改。如果您只需要强制重新连接,可能有更好的方法来实现这一点。