让CMake声明一个虚拟目标

9

我想生成一些编译时常量。另一个问题的第一个回答让我接近目标。这是我的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时,变量的值已经定义好了。但是compile_time.hpp在重新运行make甚至cmake以重新制作makefile时并不会被重新生成。

我该如何将目标compile_time.cpp标记为phony,以便它总是被重新生成?我尝试过

add_custom_target(compile_time.hpp)

没有效果。

1个回答

9

add_custom_target创建一个“虚假”目标:它没有输出并且总是被构建。如果要使一些目标依赖于“虚假”目标,请使用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)

头文件compile_time.h对库的依赖将通过扫描头文件自动检测。由于脚本compile_time.cmake无条件更新此头文件,因此每次都会重新构建库。


根据文档的说明,即使您使用了DEPENDS,这也将是虚假的。它说:该目标没有输出文件,即使命令尝试创建与目标名称相同的文件,该目标始终被视为过时。 - Carlo Wood
感谢您的通知。我不确定为什么会加入关于缺少“DEPENDS”的概念,但“没有输出”似乎更能描述这种情况。答案现在已经修复。 - Tsyvarev
不幸的是,事实证明cmake并没有创建真正的.PHONY目标,并且没有办法让它这样做。它所做的是为OUTPUT文件创建一个规则,然后从未创建该文件,以使其"始终过时"。如果创建了该文件,cmake会将其删除。我认为这是一个糟糕的选择,因为它阻止我做某些事情(结果我无法使用ExternalProject)。 - Carlo Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接