脏生成 header 不重建从属目标

Dirty generated header doesn't rebuild dependant target

我有一个目标,它的 SOURCES 中有一些 header;这些是使用 add_custom_command 生成的。这是摘录

set(MY_SOURCES
  a.txt
  b.txt)

set(MY_HEADERS)
foreach (TXT ${MY_SOURCES})
  add_custom_command(OUTPUT ${TXT}.h
    COMMAND txt2h
    -i "${CMAKE_CURRENT_SOURCE_DIR}/${TXT}"
    -o "${TXT}.h"
    MAIN_DEPENDENCY ${TXT}
    COMMENT "Generating header from ${TXT}"
    VERBATIM)
  list(APPEND MY_HEADERS "${CMAKE_CURRENT_BINARY_DIR}/${TXT}.h")
endforeach ()

add_executable(exe main.cpp ${MY_HEADERS})
target_include_directories(exe PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

这生成 (cmake -B build) 并构建 (cmake --build build) 很好。

当我编辑 a.txt 和 运行 cmake --build build 时。它重新生成 a.txt.h 因为我看到

Generating header from a.txt

但是,未构建 exe 目标。由于生成的 header 被列为 exe 的来源,我希望它也应该使 exe 变脏并重建它。我错过了什么?

我验证了 a.txta.txt.h 的时间戳匹配并且比 exe 的时间戳新。

参考资料

  1. Adding a custom command and generated file(CMake官方教程)
  2. Generated sources in CMake builds

Header 个文件未编译。可执行文件依赖于 object 个文件,这些文件是从 cpp 个文件生成的。只有当cpp个文件中有一个包含header时,才需要在header改变时重新编译,那么当header改变时会重新编译可执行文件。

将header添加到add_executable中只会使其在某些IDE中显示,没有任何效果。