【问题标题】:Get CMake to declare a target phony让 CMake 声明一个目标虚假
【发布时间】:2021-06-02 18:32:00
【问题描述】:

我想生成一些编译时间常数。另一个问题的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)

没有效果。

【问题讨论】:

    标签: makefile cmake compile-time


    【解决方案1】:

    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无条件更新这个header,所以每次都会重建库。

    【讨论】:

    • 根据documentation,当你使用DEPENDS时,这也将是PHONY。它说:目标没有输出文件,即使命令尝试使用目标名称创建文件,也总是被认为是过时的。
    • 感谢您的通知。不知道为什么我添加了关于缺少DEPENDS 的概念,但“没有OUTPUT”似乎更好地描述了这种情况。现在答案已经确定了。
    • 不幸的是,事实证明 cmake 不会创建真正的 .PHONY 目标,并且没有办法让它这样做。它所做的是为OUTPUT 文件创建一个规则,然后从不创建该文件,因此它“总是过时”。如果创建了所述文件,cmake 将再次将其删除。我认为这是一个糟糕的选择,因为它阻止了我做某些事情(结果我不能使用 ExternalProject 的东西)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2016-04-25
    相关资源
    最近更新 更多