修改从属文件后,如何使CMake重新运行add_custom_command?

时间:2020-05-22 03:46:43

标签: cmake

我希望每次提供的列表中的文件被修改时都重新运行自定义命令。

我的示例:我的项目包含以下文件:

  • main.cpp
  • CMakeLists.txt
  • dep1.txt
  • dep2.txt
cmake_minimum_required(VERSION 3.17)

project(dummy)
set(DummyFiles dep1.txt, dep2.txt)

add_executable(test_dummy main.cpp)

add_custom_command(TARGET test_dummy
COMMENT "ran custom command on file change"
DEPENDS ${DummyFiles}
)

我的期望是,之后,我已经配置了该项目,每次我修改dep1.txt或dep2.txt并重新配置时,CMake将打印出上面的COMMENT部分。但是事实并非如此。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

命令add_custom_command两个流程:“生成文件”和“构建事件”。

选项DEPENDS仅适用于第一个流程-“生成文件”,它要求将OUTPUT作为第一个选项。

您将TARGET用作命令的第一个选项,表示“构建事件”命令流。此命令流不支持DEPENDS选项(此命令流的摘要中没有这样的选项)。

我希望每次提供的列表中的文件被修改时都重新运行自定义命令。

为此,您需要将add_custom_command第一流程OUTPUT选项一起使用。

您可以将虚拟文件用作OUTPUT,因此构建系统可以比较此文件的时间戳和DEPENDS节中文件的时间戳。每当发现OUTPUT的时间戳早于DEPENDS之一的时间戳时,该命令将重新运行。

set(DummyFiles dep1.txt dep2.txt)

add_custom_command(OUTPUT dummy.txt
  COMMENT "ran custom command on file change"
  DEPENDS ${DummyFiles}
)

# Need to create a custom target for custom command to work
add_custom_target(my_target ALL
  # Use absolute path for the DEPENDS file.
  # Relative paths are interpreted relative to the source directory.
  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dummy.txt
)
相关问题