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

标签 cmake

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

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

我该怎么做?

最佳答案

不幸的是,这有点复杂,但您可以使用 add_custom_target通过 -P 以脚本处理模式调用 CMake .

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

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

这将包括:

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

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/

相关文章:

cmake - 如何告诉 CMake 不要缓存变量

c++ - 生成可能更新也可能不更新的源文件

svn - 如何使用 CMake 和 SVN 对源外构建目录进行版本控制

c++ - CMake如何配置这个C++项目?

c++ - CMake:为#cmakedefine 变量设置不同的名称

c - 将 cmake 与共享(动态)库结合使用

c++ - 如何在 CMake 中从 COMPILE_FLAGS 迁移到 target_compile_options?

CMake 子目录库和主项目

c++ - 链接两个 C++ 项目的 CMakeLists 配置

c++ - CMake - 自动解析预编译头的依赖关系?