链接我的程序后,我需要对其执行一些后处理。我添加了一个 add_custom_command(TARGET ...
),效果很好。但是,这个额外的自定义命令运行一个脚本(不是生成的;它已 checkin 代码库),我希望目标是如果该脚本发生更改,则被认为已过时,因此它将被正确重建。
add_dependency
规则似乎只在顶级元素之间起作用,但这不是(它只是一个脚本),并且这种形式中没有 DEPENDS
元素我可以使用的 add_custom_command
。
我该怎么做?
最佳答案
不幸的是,这有点复杂,但您可以使用 add_custom_target
通过 -P
以脚本处理模式调用 CMake .
您需要在此处使用 add_custom_target
,因为即使所有内容都是最新的,它也会始终执行。
做出此决定后,我们需要让自定义目标执行命令,该命令将检查后处理脚本文件的新版本(我们将其称为“my_script”并假设它位于您的根目录中),并且如果它是更改会导致您的依赖目标过时。
这将包括:
- 将“my_script”的先前副本与源树中的当前“my_script”进行比较。如果当前的“my_script”不同,或者副本不存在(即这是第一次运行 CMake),那么...
- 将“my_script”从源代码树复制到构建树,然后...
- 触摸依赖目标的源文件,使其过期。
CMake 脚本内所需的所有命令都可以使用 execute_process
来实现调用cmake -E
.
因此 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 脚本需要通过 -D
传入所需的变量args 在调用 -P
之前,因此调用 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})
这将导致可执行文件的完全重建,因为它认为源文件已被修改。如果您只需要强制重新链接,可能有更好的方法来实现此目的。
关于cmake - 如何将脚本的依赖项添加到 CMake 中的目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408060/