如果更新了依赖脚本,如何强制重建目标?

How to force a target to be rebuilt if a dependent script is updated?

我编写了一些自定义脚本,这些脚本在 CMake 目标的自定义命令中调用。如果更新了任何脚本(例如 touch script.sh),我希望重建目标。我已经使用 DEPENDS 参数尝试了几种变体,但我尝试过的都不起作用。

这是我的简化版本:

function(run_my_special_rule target)

set (script_to_run ${CMAKE_SOURCE_DIR}/scripts/script.sh)

add_custom_command(
    TARGET ${target} PRE_BUILD
    COMMAND find ${CMAKE_CURRENT_SOURCE_DIR} -name "*.hpp" -exec ${script_to_run} {} +
    DEPENDS ${script_to_run}
)

endfunction()

您在这里混合了两个不同的函数签名。查看官方文档:

  1. https://cmake.org/cmake/help/latest/command/add_custom_command.html#generating-files
  2. https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events

前者可以有一个DEPENDS语句,而后者可以有一个TARGET语句。两者不能混用。

在您的情况下,DEPENDS 将被忽略,自定义命令将仅在构建原始目标时 运行。

您必须创建一个额外的文件来比较时间戳。这个最小的例子应该让你开始:

cmake_minimum_required(VERSION 3.20)
project(custom_file_target VERSION 1.0.0)

add_executable(main main.cpp) # main target

add_custom_target(
    custom
    DEPENDS ${CMAKE_BINARY_DIR}/output.txt
)

add_custom_command(
    OUTPUT ${CMAKE_BINARY_DIR}/output.txt
    COMMAND echo your actual custom command
    COMMAND touch ${CMAKE_BINARY_DIR}/output.txt
    DEPENDS ${CMAKE_SOURCE_DIR}/dependency.txt
)

add_dependencies(main custom)

附带说明:您必须确保您的 main 目标实际上依赖于正确的文件(即也依赖于脚本生成的文件 - output.txt 除外)。