如何配置 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_command
在 mylib.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)
你可以在最后一行交换 main
和 custom
,这取决于你想要的依赖顺序(主要取决于自定义或相反)。
另请参阅我的其他答案:
如果 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)
如果我们看下面的最小示例,
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_command
在 mylib.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)
你可以在最后一行交换 main
和 custom
,这取决于你想要的依赖顺序(主要取决于自定义或相反)。
另请参阅我的其他答案:
如果 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)