如果更新了依赖脚本,如何强制重建目标?
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()
您在这里混合了两个不同的函数签名。查看官方文档:
- https://cmake.org/cmake/help/latest/command/add_custom_command.html#generating-files
- 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
除外)。
我编写了一些自定义脚本,这些脚本在 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()
您在这里混合了两个不同的函数签名。查看官方文档:
- https://cmake.org/cmake/help/latest/command/add_custom_command.html#generating-files
- 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
除外)。