【问题标题】:Generating a 'clean' target for a subdirectory in CMake为 CMake 中的子目录生成“干净”目标
【发布时间】:2011-11-15 07:02:45
【问题描述】:

我想为子目录生成一个 clean 目标。

我的项目结构是这样的:

app/
  A
  B

lib/
   A
   B
   C

有时我只想在 app/A 上运行 clean 而不想清理库。

是否可以告诉 CMake 为每个目录生成一个 clean 目标?

或者像 app-clean 这样的自定义目标会在每个应用程序子目录上调用 clean?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您可以直接 cd 到 ${CMAKE_BINARY_DIR}/app/A 并在那里运行make clean

    当然,你可以 add_custom_target(app-A-clean ...) 来为你做这件事。

    macro(add_clean_target dir)
    add_custom_target(clean-${dir} COMMAND ${CMAKE_MAKE_PROGRAM} clean WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${dir})
    endmacro(add_clean_target)
    

    现在你可以这样使用它了:

    add_clean_target(app-A)
    

    【讨论】:

    • app-A-clean 目标添加 add_cutoms_target 是否有任何快捷方式
    • 不,但我已经用代码 sn-p 更新了我的答案。不过,它可能需要一些改进。
    • 感谢您的有用回答!对于每个平台上的 ${CMAKE_BUILD_TOOL}(现在使用它代替 ${CMAKE_MAKE_PROGRAM})的每个可能值,“${CMAKE_BUILD_TOOL} clean”是一个有效的命令吗?或者,如果我们想要一个独立于平台的解决方案,我们是否需要区分不同的构建工具?
    • @PiQuer 感谢您的评论,我已经更新了我的答案。
    • 是的,这行不通 =\ 那么,没有可移植的方式来做这样的事情。
    【解决方案2】:

    也许尝试将您的 CMakeLists.txt 设置为在每个目录中都有一个 project,以及一个“根”CMakeLists.txt,它只是为所有子项目执行 add_subdirectory...然后 CMake 将生成一个每个项目目录中的解决方案文件或生成文件。然后,您可以“进入”这样一个目录并构建和清理一个项目。

    例如,在我的一个项目中,我的结构如下:

    projectroot/
      applications/
        appA
      libraries/
        libA
        libB
    

    在 projectroot 中,我设置了一个 CMakeLists.txt,如下所示:

    project(MyProject)
    add_subdirectory(libraries)
    add_subdirectory(applications)
    

    libraries/ 中,我执行以下操作:

    project(Libraries)
    add_subdirectory(libA)
    add_subdirectory(libB)
    add_subdirectory(libC)
    

    然后在applications/:

    project(Applications)
    add_subdirectory(appA)
    

    在这种情况下,我可以进入projectroot/applications/appA 并调用makemsbuild appA.sln,它将开始构建libA、B、C,然后是appA。同样,您可以致电make cleanmsbuild /t:Clean appA.sln

    为所有库提供额外目录的额外好处是,我可以通过在 libraries/ 目录中运行 makemsbuild libraries.sln 来一次构建它们。

    【讨论】:

    • 我很抱歉。你在使用 MSVC 吗?当我写答案时,我用 MinGW 而不是 MSVC 测试了它。我刚刚在我的 MVSC 2010 设置上再次测试了它,它确实清除了依赖项......
    • 没有。我在 linux 上并使用 cmake 的 Make 目标。我认为它只适用于 MVSC 2010
    • @Vivek:太糟糕了,那么我建议做类似arrowdodger的事情:为每个项目添加一个自定义的清洁目标。我将把我的答案“记录在案”......
    猜你喜欢
    • 2015-02-13
    • 2011-09-20
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2022-12-21
    • 1970-01-01
    相关资源
    最近更新 更多