如何配置 cmake 在修改非 .cpp 源文件时重新编译目标

How to configure cmake to recompile a target when a non .cpp source file is modified

如果我们看下面的最小示例,

cmake_minimum_required(VERSION 3.20)

project(example)

add_executable(${PROJECT_NAME} main.cpp test.txt)

构建可执行目标后,只有在 main.cpp 被修改时才会重建。如果 test.txt 被修改,它不会重建,因为尽管 test.txt 作为可执行目标的源包含在内,但它不用于编译可执行文件。有什么方法可以配置 cmake,以便在修改 test.txt 时触发重建?

我的应用程序的实际用例是我有一个与可执行目标关联的金属文件(例如 add_executable(${PROJECT_NAME} main.cpp mylib.metal)),我想生成 mylib.metallib 以及 example 在构建目标时可执行。我有类似的东西

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                   COMMAND "the command to compile .metal into .metallib")

但是这个 add_custom_command 只会在可执行目标的第一次编译期间被调用,或者每当 main.cpp 被修改时,我希望这个 add_custom_commandmylib.metal 被修改。如何做到这一点?

一种方法是创建自定义目标并向其添加自定义命令以生成您的 mylib.metallib

cmake_minimum_required(VERSION 3.20)
project(custom_file_target VERSION 1.0.0)

add_executable(main main.cpp) # main target

add_custom_target(
    custom
    DEPENDS ${CMAKE_BINARY_DIR}/mylib.metallib
)

add_custom_command(
    OUTPUT ${CMAKE_BINARY_DIR}/mylib.metallib
    COMMAND echo your command that will create mylib.metallib
    DEPENDS ${CMAKE_SOURCE_DIR}/mylib.metal
)

add_dependencies(main custom)

你可以在最后一行交换 maincustom,这取决于你想要的依赖顺序(主要取决于自定义或相反)。

另请参阅我的其他答案:

如果 mylib.metallib 实际上是可链接的,您还可以考虑创建一个 imported library 取决于您的自定义目标,即

cmake_minimum_required(VERSION 3.20)
project(custom_file_target VERSION 1.0.0)

add_executable(main main.cpp) # main target

add_custom_target(
    custom
    DEPENDS ${CMAKE_BINARY_DIR}/mylib.metallib
)

add_custom_command(
    OUTPUT ${CMAKE_BINARY_DIR}/mylib.metallib
    COMMAND echo your command that will create mylib.metallib
    DEPENDS ${CMAKE_SOURCE_DIR}/mylib.metal
)

add_library(mylib STATIC IMPORTED)
set_property(
    TARGET mylib PROPERTY
    IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/mylib.metallib
)
add_dependencies(mylib custom)

target_link_libraries(main PRIVATE mylib)