在CMake中,如何仅在需要重建任何子目录的情况下运行自定义命令



我有一个基于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行,并提供了适当的公共包含目录等。

如果我在自定义目标"的DEPENDS行中显式列出每一个子项目,我就可以得到我想要的行为;根";,但这既乏味又容易出错。在实际项目中,有几十个子库和可执行文件。

我每次都可以轻松地重新构建归档,但这很慢。

如果(且仅当(根项目的任何子项目或其子项目发生更改,我如何重建存档?

列出该工具的实际依赖项。

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。相反,在部署时,只考虑在实际需要时构建归档。

相关内容

最新更新