如何在CMake中向脚本添加脚本依赖?

时间:2013-05-06 22:06:16

标签: cmake

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

add_dependencies规则似乎只适用于顶级元素,而这不是(它只是一个脚本),并且DEPENDS的这种形式中没有add_custom_command元素我可以使用。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

遗憾的是,有点令人费解,但您可以使用add_custom_target通过-P在脚本处理模式下调用CMake。

您需要在此使用add_custom_target,因为即使所有内容都是最新的,始终也会执行。

做出这个决定后,我们需要有自定义目标执行命令,它将检查你的后处理脚本文件的新版本(让我们称之为“my_script”并假设它在你的根目录中),如果它是改变导致您的依赖目标过时。

这包括:

  1. 将以前的“my_script”副本与源树中的当前“my_script”进行比较。如果当前的“my_script”不同,或者副本不存在(即这是第一次运行CMake)那么......
  2. 将“my_script”从源树复制到构建树,然后......
  3. 触摸相关目标的源文件,使其过期。
  4. 使用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})
    

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