寻找一个';cmake clean';清除CMake输出的命令
正如寻找一个';cmake clean';清除CMake输出的命令,cmake,Cmake,正如makeclean删除makefile生成的所有文件一样,我也希望对CMake执行同样的操作。我经常发现自己手动浏览目录删除文件,如cmake_install.cmake和CMakeCache.txt,以及CMakeFiles文件夹 是否有类似于cmake clean的命令自动删除所有这些文件?理想情况下,这应该遵循当前目录的CMakeLists.txt文件中定义的递归结构。cmake3.X CMake 3.X提供了一个“干净”的目标 cmake --build C:/foo/build/
makeclean
删除makefile生成的所有文件一样,我也希望对CMake执行同样的操作。我经常发现自己手动浏览目录删除文件,如cmake_install.cmake
和CMakeCache.txt
,以及CMakeFiles
文件夹
是否有类似于cmake clean
的命令自动删除所有这些文件?理想情况下,这应该遵循当前目录的CMakeLists.txt
文件中定义的递归结构。cmake3.X
CMake 3.X提供了一个“干净”的目标
cmake --build C:/foo/build/ --target clean
从3.0.2版的CMake文档:
--clean-first = Build target 'clean' first, then build.
(To clean only, use --target 'clean'.)
CMake 2.X
cmake 2.X版中没有cmake clean
我通常在单个文件夹中构建项目,如“build”。因此,如果我想makeclean
,我可以rm-rfbuild
与根目录“CMakeLists.txt”位于同一目录中的“build”文件夹通常是一个不错的选择。要构建项目,只需将CMakeLists.txt的位置作为参数提供给cmake即可。例如:
cd/build&&cmake..
。(来自@comicsanss)我在谷歌上搜索了大约半个小时,唯一有用的方法是调用查找实用程序:
# Find and then delete all files under current directory (.) that:
# 1. contains "cmake" (case-&insensitive) in its path (wholename)
# 2. name is not CMakeLists.txt
find . -iwholename '*cmake*' -not -name CMakeLists.txt -delete
另外,在调用之前,请确保调用makeclean
(或您正在使用的任何CMake生成器)
:)我同意源代码外构建是最好的答案。但是,在您必须进行源代码内构建的时候,我编写了一个可用的Python脚本,它:
运行“使干净”
删除顶级目录(如CMakeCache.txt)中特定的CMake生成的文件
对于包含CMakeFiles目录的每个子目录,它将删除CMakeFiles、Makefile、cmake_install.cmake
删除所有空的子目录
您可以使用以下内容:
add_custom_target(clean-cmake-files
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
// clean-all.cmake
set(cmake_generated ${CMAKE_BINARY_DIR}/CMakeCache.txt
${CMAKE_BINARY_DIR}/cmake_install.cmake
${CMAKE_BINARY_DIR}/Makefile
${CMAKE_BINARY_DIR}/CMakeFiles
)
foreach(file ${cmake_generated})
if (EXISTS ${file})
file(REMOVE_RECURSE ${file})
endif()
endforeach(file)
我通常创建一个“makeclean all”命令,在前面的示例中添加对“makeclean”的调用:
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
不要尝试添加“干净”目标作为依赖项:
add_custom_target(clean-all
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
DEPENDS clean
)
因为“干净”在CMake中不是一个真正的目标,这是行不通的
此外,您不应使用此“干净的cmake文件”作为任何内容的依赖:
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
DEPENDS clean-cmake-files
)
因为,如果您这样做,所有CMake文件将在“全部清除”完成之前被擦除,make将在搜索“CMakeFiles/clean all.dir/build.make”时抛出一个错误。因此,在任何上下文中,都不能在“任何内容”之前使用clean all命令:
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
那也不行。如果你跑
cmake .
它将重新生成CMake文件。例如,如果将新文件添加到由*.cc选择的源文件夹中,则这是必需的
虽然这本身不是“清理”,但它通过重新生成缓存来“清理”CMake文件。我成功地解决了以下问题:
我有在多台主机上构建的源代码(在Raspberry Pi Linux板上,在VMware Linux虚拟机上,等等)
我有一个Bash脚本,它根据机器的主机名创建临时目录,如下所示:
# Get hostname to use as part of directory names
HOST_NAME=`uname -n`
# Create a temporary directory for cmake files so they don't
# end up all mixed up with the source.
TMP_DIR="cmake.tmp.$HOSTNAME"
if [ ! -e $TMP_DIR ] ; then
echo "Creating directory for cmake tmp files : $TMP_DIR"
mkdir $TMP_DIR
else
echo "Reusing cmake tmp dir : $TMP_DIR"
fi
# Create makefiles with CMake
#
# Note: switch to the temporary dir and build parent
# which is a way of making cmake tmp files stay
# out of the way.
#
# Note 2: to clean up cmake files, it is OK to
# "rm -rf" the temporary directories
echo
echo Creating Makefiles with cmake ...
cd $TMP_DIR
cmake ..
# Run makefile (in temporary directory)
echo
echo Starting build ...
make
只需发布rm cmakcache.txt
对我来说也很有效。在Git无处不在的今天,你可能会忘记CMake,而使用Git clean-d-f-x
,这将删除所有不受源代码管理的文件。声明:
一些使用GNU自动工具创建的构建树有一个“make distclean”
清除生成并删除makefile和其他文件的目标
生成的生成系统的一部分。CMake不会生成“make”
distclean”目标,因为CMakeLists.txt文件可以运行脚本和
任意命令;CMake无法准确跟踪哪些文件
作为运行CMake的一部分生成。提供一个干净的目标
会给用户一种错误的印象,认为它会按预期工作。
(CMake会生成一个“清除”目标来删除生成的文件
由编译器和链接器执行。)
“保持距离清洁”目标仅适用于
如果用户执行源代码内生成,则需要。CMake支持
在源代码构建中,但我们强烈鼓励用户采用这个概念
一个源代码外的构建。使用独立于
源目录树将阻止CMake生成目录中的任何文件
源树。因为CMake不会更改源树,所以
不需要一个干净的目标。一个人可以开始一个新的建设
删除生成树或创建单独的生成树
创建临时生成目录,例如,build\u cmake
。因此,所有生成文件都将位于该文件夹中
然后在主CMake文件中添加以下命令
add_custom_target(clean-all
rm -rf *
)
因此,在编译do时
cmake ..
清洁工作:
make clean-all
我最近发现的一个解决方案是将源代码外构建概念与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
目标,我们调用$(MAKE)-C build
,其中$(MAKE)
是为MAKE
自动生成的Makefile变量<代码>生成-C
在执行任何操作之前更改目录。因此,使用$(MAKE)-C
mkdir build
cd build
cmake ..
make
#!/bin/bash
for fld in $(find -name "CMakeLists.txt" -printf '%h ')
do
for cmakefile in CMakeCache.txt cmake_install.cmake CTestTestfile.cmake CMakeFiles Makefile
do
rm -rfv $fld/$cmakefile
done
done
t-cmake-clean() {
local BUILD=$(basename $(pwd))
cd ..
rm -rf $BUILD
mkdir $BUILD && cd $BUILD
}
rm -rf CMakeFiles/
cmake --build .
$ cat ~/bin/cmake-clean-build
#!/bin/bash
if [ -d ../build ]; then
cd ..
rm -rf build
mkdir build
cd build
else
echo "build directory DOES NOT exist"
fi
. cmake-clean-build
sed -ne '/variable specified on the command line/{n;s/.*/-D \0 \\/;p}' CMakeCache.txt
find . -name 'CMakeCache.txt' -o -name '*.cmake' -o -name 'Makefile' -o -name 'CMakeFiles' -exec rm -rf {} +
rm -rf **/CMakeCache.txt **/*.cmake **/Makefile **/CMakeFiles
[root@localhost hello]# ls
CMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt hello Makefile test
[root@localhost hello]# vi Makefile
clean:
$(MAKE) -f CMakeFiles/Makefile2 clean
rm -rf *.o *~ .depend .*.cmd *.mod *.ko *.mod.c .tmp_versions *.symvers *.d *.markers *.order CMakeFiles cmake_install.cmake CMakeCache.txt Makefile