我有一个基于CMake的项目,如果有任何更改(包括任何子项目),则需要在构建后运行命令。
简化的结构
project_root/
CMakeLists.txt (project root)
executable_1/
CMakeLists.txt (project tool1)
library_1/
CMakeLists.txt (project lib1)
executable_2/
CMakeLists.txt (project tool2)
library_2/
CMakeLists.txt (project lib2)
library_3/
CMakeLists.txt (project lib3)
项目根目录CMakeLists.txt如下
cmake_minimum_required(VERSION 3.17)
add_subdirectory(tool1)
add_subdirectory(tool2)
add_subdirectory(lib3)
project(root C)
add_custom_target(root ALL
COMMENT
"root target"
DEPENDS
${DEPLOY_PATH}/deploy.tar.xz
)
add_custom_command(
OUTPUT
${DEPLOY_PATH}/deploy.tar.xz
COMMAND
tar cJf ${DEPLOY_PATH}/deploy.tar.xz *
COMMENT
"taring"
DEPENDS
root
)
CMakeLists.txt工具看起来像
cmake_minimum_required(VERSION 3.17)
add_subdirectory(lib1)
project(tool1 C)
add_executable(tool1
src/tool1.c
)
target_include_directories(tool1
PRIVATE
./
)
target_link_libraries(tool1
PRIVATE
lib1
lib3
)
install(TARGETS tool1 DESTINATION ${DEPLOY_PATH})
使用lib的CMakeLists.txt文件省略install
行并提供适当的公共包含目录等。
如果我在“ root”的自定义目标的DEPENDS行中显式列出每个子项目,则可以得到我想要的行为,但这很乏味且容易出错。在实际的项目中,有数十个子库和可执行文件。
我还可以轻松地每次都重新构建档案,但这很慢。
如果(且仅当)根项目的任何子项目或其子代已更改时,如何重建归档文件?
答案 0 :(得分:0)
列出该工具的实际依赖关系。
file(GLOB_RECURSE srcs *) # I hope that's correct
add_custom_command(
OUTPUT
${DEPLOY_PATH}/deploy.tar.xz
COMMAND
# * generally is invalid, * depends on shell filename expansion
tar cJf ${DEPLOY_PATH}/deploy.tar.xz *
COMMENT "taring"
DEPENDS ${srcs}
)
但是无论如何,这是错误的-cmake只能运行一次,并且会扫描您的树一次。如果添加新文件,则必须重新配置cmake。而是考虑仅在实际需要时(在部署时)构建存档。