让 CMake 声明目标虚假

Get CMake to declare a target phony

我想生成一些编译时间常数。另一个问题的 first answer 让我很接近。来自我的 CMakeLists.txt:

add_library(${PROJECT_NAME} STATIC ${CXX_SRCS} compile_time.hpp)
add_custom_command(OUTPUT compile_time.hpp
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/compile_time.cmake)

这在我第一次 运行 make 时产生 compile_time.hpp 的意义上起作用,因此当我 运行 时定义变量的值make 而不是 cmake。但是当我重新 运行 make 甚至 cmake 重做 makefile 时,compile_time.hpp 并没有被重新制作。

如何让目标 compile_time.cpp 被标记为 phony 以便它总是被重制?我试过了

add_custom_target(compile_time.hpp)

没有效果。

add_custom_target 创建一个 "phony" 目标:它没有输出并且总是被构建。为了让一些目标依赖于 "phony" 一个,使用 add_dependencies() 调用:

add_custom_target(compile_time
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/compile_time.cmake
)
# Because we use *target-level* dependency, there is no needs in specifying
# header file for 'add_library()' call.
add_library(${PROJECT_NAME} STATIC ${CXX_SRCS})
add_dependencies(${PROJECT_NAME} compile_time)

库对 header compile_time.h 的依赖将通过 headers 扫描自动检测。因为脚本compile_time.cmake无条件更新这个header,所以每次都会重建库。