我想为子目录生成 clean 目标。
我的项目结构是这样的:
app/
A
B
lib/
A
B
C
有时候我想在app / A上运行干净,不想清理库。
是否可以告诉CMake为每个目录生成 clean 目标?
或者像 app-clean 这样的自定义目标会在每个应用程序子目录中调用clean吗?
答案 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
并致电make
或msbuild appA.sln
,然后它将开始构建libA,B,C,然后是appA。同样,您可以拨打make clean
或msbuild /t:Clean appA.sln
。
所有库的额外目录的额外好处是我可以通过在make
目录中运行msbuild libraries.sln
或libraries/
来一次构建它们。