在CMake中,仅当需要重建任何子目录时,才如何运行自定义命令

时间:2020-10-15 20:47:41

标签: 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行并提供适当的公共包含目录等。

如果我在“ root”的自定义目标的DEPENDS行中显式列出每个子项目,则可以得到我想要的行为,但这很乏味且容易出错。在实际的项目中,有数十个子库和可执行文件。

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

如果(且仅当)根项目的任何子项目或其子代已更改时,如何重建归档文件?

1 个答案:

答案 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。而是考虑仅在实际需要时(在部署时)构建存档。

相关问题