linux下删除cmake_寻找'cmake clean'命令来清除CMake输出

我最近发现的解决方案是将源外构建概念与Makefile包装器结合起来 .

在我的顶级CMakeLists.txt文件中,我包含以下内容以防止源内构建:

if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )

message( FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt." )

endif()

然后,我创建一个顶级Makefile,并包含以下内容:

# -----------------------------------------------------------------------------

# CMake project wrapper Makefile ----------------------------------------------

# -----------------------------------------------------------------------------

SHELL := /bin/bash

RM := rm -rf

MKDIR := mkdir -p

all: ./build/Makefile

@ $(MAKE) -C build

./build/Makefile:

@ ($(MKDIR) build > /dev/null)

@ (cd build > /dev/null 2>&1 && cmake ..)

distclean:

@ ($(MKDIR) build > /dev/null)

@ (cd build > /dev/null 2>&1 && cmake .. > /dev/null 2>&1)

@- $(MAKE) --silent -C build clean || true

@- $(RM) ./build/Makefile

@- $(RM) ./build/src

@- $(RM) ./build/test

@- $(RM) ./build/CMake*

@- $(RM) ./build/cmake.*

@- $(RM) ./build/*.cmake

@- $(RM) ./build/*.txt

ifeq ($(findstring distclean,$(MAKECMDGOALS)),)

$(MAKECMDGOALS): ./build/Makefile

@ $(MAKE) -C build $(MAKECMDGOALS)

endif

通过键入 make 来调用默认目标 all ,并调用目标 ./build/Makefile .

目标 ./build/Makefile 做的第一件事是使用 $(MKDIR) 创建 build 目录,这是 mkdir -p 的变量 . 目录 build 是我们执行源外构建的地方 . 我们提供参数 -p 以确保 mkdir 不会因为尝试创建可能已存在的目录而尖叫 .

目标 ./build/Makefile 做的第二件事是将目录更改为 build 目录并调用 cmake .

回到 all target,我们调用 $(MAKE) -C build ,其中 $(MAKE) 是为 make 自动生成的Makefile变量 . make -C 在执行任何操作之前更改目录 . 因此,使用 $(MAKE) -C build 相当于 cd build; make .

总而言之,使用 make all 或 make 调用此Makefile包装器相当于:

mkdir build

cd build

cmake ..

make

目标 distclean 调用 cmake .. ,然后调用 make -C build clean ,最后删除 build 目录中的所有内容 . 我相信这正是您在问题中提出的要求 .

最后一块Makefile会评估用户提供的目标是否为 distclean . 如果没有,它会在调用之前将目录更改为 build . 这非常强大,因为用户可以键入,例如 make clean ,并且Makefile会将其转换为等效的 cd build; make clean .

总之,这个Makefile包装器与强制的源外构建CMake配置相结合,使得用户永远不必与命令 cmake 进行交互 . 此解决方案还提供了一种优雅的方法来从 build 目录中删除所有CMake输出文件 .

附:在Makefile中,我们使用前缀 @ 来抑制shell命令的输出,使用前缀 @- 来忽略shell命令中的错误 . 当 rm 作为 distclean 目标的一部分使用时,如果文件不存在,则该命令将返回错误(它们可能已使用 rm -rf build 的命令行删除,或者它们从未首先生成) . 此返回错误将强制我们的Makefile退出 . 我们使用前缀 @- 来防止这种情况 . 如果已经删除了文件,则可以接受;我们希望Makefile继续运行并删除其余部分 .

另外需要注意的是:如果使用可变数量的CMake变量来构建项目,则此Makefile可能不起作用,例如 cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar" . 此Makefile假定您以一致的方式调用CMake,方法是键入 cmake .. 或提供 cmake 一致数量的参数(可以包含在Makefile中) .

最后,信用到期的信用 . 这个Makefile包装器改编自C++ Application Project Template提供的Makefile .


版权声明:本文为weixin_39731456原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。