【发布时间】:2011-11-15 07:02:45
【问题描述】:
我想为子目录生成一个 clean 目标。
我的项目结构是这样的:
app/
A
B
lib/
A
B
C
有时我只想在 app/A 上运行 clean 而不想清理库。
是否可以告诉 CMake 为每个目录生成一个 clean 目标?
或者像 app-clean 这样的自定义目标会在每个应用程序子目录上调用 clean?
【问题讨论】:
标签: cmake
我想为子目录生成一个 clean 目标。
我的项目结构是这样的:
app/
A
B
lib/
A
B
C
有时我只想在 app/A 上运行 clean 而不想清理库。
是否可以告诉 CMake 为每个目录生成一个 clean 目标?
或者像 app-clean 这样的自定义目标会在每个应用程序子目录上调用 clean?
【问题讨论】:
标签: cmake
您可以直接 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)
【讨论】:
也许尝试将您的 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 并调用make 或msbuild appA.sln,它将开始构建libA、B、C,然后是appA。同样,您可以致电make clean 或msbuild /t:Clean appA.sln。
为所有库提供额外目录的额外好处是,我可以通过在 libraries/ 目录中运行 make 或 msbuild libraries.sln 来一次构建它们。
【讨论】: