为CMake中的子目录生成“干净”目标

时间:2011-11-15 07:02:45

标签: cmake

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

我的项目结构是这样的:

app/
  A
  B

lib/
   A
   B
   C

有时候我想在app / A上运行干净,不想清理库。

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

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

2 个答案:

答案 0 :(得分:4)

你可以点击$ {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)

答案 1 :(得分:2)

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

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

projectroot/
  applications/
    appA
  libraries/
    libA
    libB

在项目中我设置了一个像这样的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

所有库的额外目录的额外好处是我可以通过在make目录中运行msbuild libraries.slnlibraries/来一次构建它们。