就像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 3.X提供了一个'clean'目标。
cmake --build C:/foo/build/ --target clean
来自CMake 3.0.2文档:
--clean-first = Build target 'clean' first, then build.
(To clean only, use --target 'clean'.)
CMake版本2.X中没有cmake clean
命令。
通常我将项目构建在一个名为"build"的文件夹中。所以如果我想要执行make clean
,我可以直接运行rm -rf build
命令。
在与根目录下的"CMakeLists.txt"相同的文件夹中创建一个名为"build"的文件夹通常是不错的选择。要构建您的项目,只需将CMakeLists.txt的位置作为参数传递给cmake。例如:cd <location-of-cmakelists>/build && cmake ..
。(来自@ComicSansMS)
cd <cmakelists的位置>/build && cmake ..
- ComicSansMS在 Git 遍地的今天,你可能会忘记 CMake,并使用 git clean -d -f -x
命令,它可以删除所有不在源代码控制下的文件。
-x
选项真的很妙。这是 git
行业的一个绝妙技巧。尽管我个人仍然会先运行一次干假操作,即 git clean -d -f -x -n
。偶尔我会在受 git
控制的项目文件夹中添加一个方便文件,但这不是我想与他人分享的东西,所以我不会将其通过 git add
添加到项目中。如果我没有小心地添加 -e <pattern>
选项,它就会将那种类型的文件删除。顺便说一下,如果 git
有 .gitcleanignore
文件就好了 :) 。 - CivFanchattr +i $filename
命令(需要root权限),这样即使像rm -f
一样被执行,git也无法删除该文件。请注意,此操作将禁止修改该文件。 - Ruslangit add
的新添加文件怎么办呢? - yugrgit clean -dfx
。这也依赖于一个良好的 .gitignore 文件。 - SethCMake官方FAQ指出:
使用GNU autotools创建的某些构建树具有“make distclean”目标,该目标会清理构建,并删除Makefiles和其他生成的构建系统的部分。 CMake不生成“make distclean”目标,因为CMakeLists.txt文件可以运行脚本和任意命令;CMake无法跟踪到确切哪些文件作为运行CMake的一部分而生成。提供distclean目标将使用户误以为它能够按预期工作。 (CMake生成一个“make clean”目标以移除由编译器和链接器生成的文件。)
只有用户执行源内构建时才需要“make distclean”目标。 CMake支持源内构建,但我们强烈建议用户采用源外构建的概念。使用与源码树分开的构建树将防止CMake在源码树中生成任何文件。因为CMake不更改源代码树,所以没有必要进行distclean。您可以通过删除构建树或创建单独的构建树来开始新的构建。
我 Google 了半个小时,唯一有用的东西是调用 find
实用程序:
# 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
make clean
(或者您正在使用的任何CMake生成器)。
:)
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles
,但还没有完成... - SF.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)
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
不要尝试将"clean"目标作为依赖项添加:
add_custom_target(clean-all
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
DEPENDS clean
)
因为“clean”不是CMake中的真正目标,所以这样做不起作用。
此外,您不应将“clean-cmake-files”用作任何东西的依赖项:
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
DEPENDS clean-cmake-files
)
因为,如果你这样做,在执行clean-all命令完成之前,所有的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
)
那也不行。
CMakeCache.txt
,也没有帮助我,但我找到了这种类似的方法来更新每个构建中的变量,因此无需删除CMakeCache.txt
:https://dev59.com/m1QJ5IYBdhLWcg3wwYv7#53159688 - Celuk对我来说,简单地执行rm CMakeCache.txt
也可以解决问题。
cmake /build-path
。 - Samaursa从 CMake 3.24 开始,存在一个名为 --fresh
的命令行选项,它会在每次构建时重建整个构建树:
--fresh
版本 3.24 中新增。
对构建树执行新的配置。这将删除任何现有的 CMakeCache.txt 文件和相关的 CMakeFiles/ 目录,并从头开始重新创建它们。
https://cmake.org/cmake/help/latest/manual/cmake.1.html#options
也许有点过时,但既然你在谷歌搜索cmake clean
时看到了这篇文章,那我会补充一下:
由于您可以使用以下命令在构建目录中启动带有指定目标的构建:
cmake --build . --target xyz
当然,您也可以运行以下命令:
cmake --build . --target clean
以在生成的构建文件中运行clean
目标。
我认为,离线源码构建是最佳答案。但对于必须进行源代码内构建的情况,我编写了一段Python脚本,可在此处下载,该脚本:
if os.path.isfile(os.path.join(directory,'Makefile')):
,当然还要缩进刚刚添加的行后面的函数体的其余部分。这将仅在当前正在清理的目录中存在Makefile时执行make ... clean
。否则,该脚本是完美的! - Michael GoldshteynExternalProject
(需要BUILD_IN_SOURCE
,意味着隐含的祭品)时就会很繁琐,并且我甚至不确定使用FetchContent
是否可能,因为它没有类似的选项。 - FeRD这个问题引起了很多关注和复杂的解决方案,实际上这表明没有一种干净的方法来使用cmake。
你可以在工作目录下执行cd build_work
,然后当需要清理时,执行rm -rf *
。然而,rm -rf *
是一个危险的命令,因为许多人经常不知道他们在哪个目录下。
如果你执行cd ..
,rm -rf build_work
,然后mkdir build_work
,接着再执行cd build_work
,那就太麻烦了。
因此一个好的解决方法是保持在源文件目录之外,并告诉cmake路径:
配置: cmake -B build_work
构建: cmake --build build_work
安装: cmake --install build_work
清理: rm -rf build_work
重新创建build文件夹:甚至不需要mkdir build_work
,只需用cmake -B build_work
来配置它。
cmake --build <build-dir> --target clean
来清除构建目录。 - Sean Francis N. Ballais