就像make clean
会删除Makefile生成的所有文件一样,我希望在CMake中也能做到同样的事情。经常需要手动浏览目录并删除类似cmake_install.cmake
、CMakeCache.txt
和 CMakeFiles
等文件。
是否有像cmake clean
这样的命令可以自动删除所有这些文件?理想情况下,这应该遵循当前目录下的CMakeLists.txt
文件定义的递归结构。
就像make clean
会删除Makefile生成的所有文件一样,我希望在CMake中也能做到同样的事情。经常需要手动浏览目录并删除类似cmake_install.cmake
、CMakeCache.txt
和 CMakeFiles
等文件。
是否有像cmake clean
这样的命令可以自动删除所有这些文件?理想情况下,这应该遵循当前目录下的CMakeLists.txt
文件定义的递归结构。
这个问题比较老了,但是如果你完全删除cmake-build-debug文件夹,在使用cmake编译时它应该会自动创建一个新的cmake-build-debug文件夹,并包含你需要的所有内容。在CLion中特别有效。
sed -ne '/variable specified on the command line/{n;s/.*/-D \0 \\/;p}' CMakeCache.txt
然后创建一个新的构建目录(或删除旧的构建目录并重新创建它),最后使用上面脚本中获取的参数运行cmake
。
这是我使用的代码。它被封装在一个函数中,跨平台,并演示了如何查找匹配的文件名或文件夹名称,以防您想要进行任何简单的调整。每次构建我的脚本时,此函数都会运行,并且对我的需求完美地发挥作用。
function(DELETE_CACHE)
if(CMAKE_HOST_WIN32)
execute_process(COMMAND cmd /c for /r %%i in (CMakeCache.*) do del "%%i" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
execute_process(COMMAND cmd /c for /d /r %%i in (*CMakeFiles*) do rd /s /q "%%i" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
else()
execute_process(COMMAND find . -name "CMakeCache.*" -delete WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
execute_process(COMMAND "rm -rf `find . -type d -name CMakeFiles`" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()
endfunction()
cmake
主要是生成一个 Makefile
,可以将 rm
添加到 clean PHONY 中。
例如:
[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
我成功地使用zsxwing的答案解决了以下问题:
我有源代码需要在多个主机上构建(例如树莓派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
创建一个临时的构建目录,例如build_cmake
。因此,所有的构建文件都将在这个文件夹内。
然后在你的主CMake文件中添加以下命令。
add_custom_target(clean-all
rm -rf *
)
cmake ..
清理操作如下:
make clean-all
cmake --build <build-dir> --target clean
来清除构建目录。 - Sean Francis N. Ballais