如何将脚本的依赖项添加到 CMake 中的目标?

2024-05-05

链接我的程序后,我需要对其执行一些后处理。我添加了一个add_custom_command(TARGET ...效果很好。但是,这个额外的自定义命令运行一个脚本(未生成;它已签入代码库),并且我希望如果该脚本发生更改,目标将被视为过时,以便正确重建它。

The add_dependencies规则似乎只在顶级元素之间起作用,但这不是(它只是一个脚本),并且没有DEPENDS这种形式的元素add_custom_command我可以使用。

我该怎么做呢?


不幸的是有点复杂,但你可以使用add_custom_target http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command%3aadd_custom_target通过以下方式在脚本处理模式下调用 CMake-P http://www.cmake.org/cmake/help/v2.8.10/cmake.html#opt%3a-Pfile.

你需要使用add_custom_target在这里,因为它会always执行,即使一切都是最新的。

做出此决定后,我们需要让自定义目标执行命令,该命令将检查后处理脚本文件的新版本(我们称其为“my_script”并假设它位于您的根目录中),如果它发生更改,则会导致您的依赖的目标已经过时。

这将包括:

  1. 将“my_script”的先前副本与源树中的当前“my_script”进行比较。如果当前的“my_script”不同,或者副本不存在(即这是 CMake 的第一次运行),那么...
  2. 将“my_script”从源代码树复制到构建树,然后...
  3. 触摸依赖目标的源文件,使其过期。

CMake 脚本中所需的所有命令都可以使用以下命令来实现execute_process http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command%3aexecute_process调用cmake -E http://www.cmake.org/cmake/help/v2.8.10/cmake.html#opt%3a-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 http://www.cmake.org/cmake/help/v2.8.10/cmake.html#opt%3a-Dvar%3atypevalue args before呼叫-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})

这将导致可执行文件的完全重建,因为它认为源文件已被修改。如果您只需要强制重新链接,可能有更好的方法来实现此目的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将脚本的依赖项添加到 CMake 中的目标? 的相关文章

随机推荐