寻找'cmake clean'命令来清除CMake输出

Bil*_*ham 373 cmake

就像make clean删除makefile生成的所有文件一样,我想对CMake做同样的事情.很多时候,我发现自己在目录删除文件,如手动去cmake_install.cmakeCMakeCache.txtCMakeFiles文件夹.

是否有cmake clean自动删除所有这些文件的命令?理想情况下,这应遵循当前目录CMakeLists.txt文件中定义的递归结构.

zsx*_*ing 444

没有cmake clean.

我通常在像"build"这样的单个文件夹中构建项目.所以,如果我愿意make clean,我可以rm -rf build.

与根"CMakeLists.txt"位于同一目录中的"build"文件夹通常是一个不错的选择.要构建项目,只需将cakeke作为参数提供给CMakeLists.txt的位置即可.例如:cd <location-of-cmakelists>/build && cmake ...(来自@ComicSansMS)

  • 这被称为"out of source build",应该是首选方式.它避免了名称冲突等 (94认同)
  • 真的应该是一个干净的cmake.每个曾经使用过cmake的人,即使他们习惯于使用源代码构建,也会在错误的目录中意外地运行cmake,并且手动清理是一个巨大的麻烦. (53认同)
  • @DevSolar但反过来却不是真的; 仅仅因为文件不受版本控制并不意味着它是由cmake生成的并且可以安全地吹走.找出你需要保留的哪些无版本文件正在进行中以及哪些是cmake cruft是一种痛苦,特别是当大多数cmake文件是复制/类似地命名为你的文件时. (22认同)
  • +1用于源外构建.这在构建多个体系结构时变得至关重要.例如,您无法使用源内构建构建64位和32位二进制文​​件,因为这需要两个单独的CMake缓存层次结构. (15认同)
  • 您可以将文件夹放在任何您想要的位置,但与根CMakeLists.txt位于同一目录中的构建文件夹通常是一个不错的选择.要构建您,只需将cakeke作为参数提供给CMakeLists.txt的位置.例如:`cd <location-of-cmakelists>/build && cmake ..` (8认同)
  • 当我打算直接删除构建时,我实际上删除了我的源目录一次。之后,我编写了一个脚本来仔细检查正在删除的内容。但实际上,cmake 应该只有一个只写模式的缓存,它会解决很多问题。 (3认同)
  • @pavon:CMake生成*的任何文件*不应*受版本控制.从源目录中删除不受版本控制的任何文件都很容易. (2认同)
  • 当然,源代码外构建是 Unix Makefile 的首选方法,但如果您使用其他生成器(例如 Eclipse CDT),它更喜欢您在源代码中构建。现在怎么办?`shopt -s globstar &amp;&amp; rm -r **/CMakeCache.txt **/*.cmake **/Makefile **/CMakeFiles`?确实应该有一个“cmake clean”。 (2认同)
  • 我不小心在源目录而不是build目录中启动了cmake,并且它充满了生成的文件和目录.我真的非常希望"撤消". (2认同)
  • CMake 3.24 不理解 MacOS 上的 `--target clean` 或 `--clean-first` (2认同)

Pet*_*ter 82

CMake官方常见问题解答说:

使用GNU autotools创建的一些构建树具有"make distclean"目标,用于清除构建并删除Makefile和生成的构建系统的其他部分.CMake不会生成"make distclean"目标,因为CMakeLists.txt文件可以运行脚本和任意命令; CMake无法准确跟踪在运行CMake时生成哪些文件.提供一个干净的目标会给用户一个错误的印象,即它会按预期工作.(CMake确实生成了一个"make clean"目标来删除编译器和链接器生成的文件.)

只有在用户执行源内构建时,才需要"make distclean"目标.CMake支持源内构建,但我们强烈建议用户采用源外构建的概念.使用与源树分开的构建树将阻止CMake在源树中生成任何文件.因为CMake不会更改源树,所以不需要一个distclean目标.可以通过删除构建树或创建单独的构建树来开始新构建.

  • 最初,正如 GNU 自动工具引入和使用的那样,“distclean”目标旨在使源代码树准备好 tar 并创建 tar 发行版。这样的 tar 文件用户可以下载并解压,然后运行“configure”和“make”*无需*需要自动工具(aclocal、automake、autoconf 等)如果我们将其推断为 cmake,那么“make distclean”将为我们留下无需安装 cmake 即可构建的干净源代码。但是,当生成器是单目标生成器(如“make”目标)时,这不起作用,因为使用 cmake 的配置发生在 (3认同)
  • “我们强烈鼓励用户采用外源构建的概念”——遗憾的是他们当时将其设为默认行为。(说真的,让默认行为成为你阻止用户做的事情是一个愚蠢的设计决策。) (2认同)

Jea*_*avy 55

在Git的这些日子里,你可能会忘记CMake并使用它git clean -d -f -x,这将删除所有不受源代码控制的文件.

  • 但是`-x`选项.这是'git`交易的一个很好的技巧.虽然我个人仍然首先做一个干跑,`git clean -d -f -x -n`.每隔一段时间我就会在`git`控件下的项目文件夹中保存一个用于项目的便利文件,但这不是我想与他人共享的内容,所以我不会把它添加到项目中.如果我不小心添加`-e <pattern>`选项,这会打破这种文件.在那个注释中,如果`git`有一个`.gitcleanignore`文件会很好.:) (11认同)
  • @CivFan 您可以尝试使用 `chattr +i $filename`(需要 root 权限,此后不允许修改文件)。这样 git 将无法删除该文件,即使它尝试像 `rm -f` 那样操作。 (3认同)
  • 假设源内构建,这本身就是要避免的. (3认同)
  • 嗯,但是用户忘记了`git add`的新添加的文件呢? (2认同)

小智 50

我用谷歌搜索了半个小时,我想出的唯一有用的东西是调用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
Run Code Online (Sandbox Code Playgroud)

此外,一定要调用make clean(或任何CMake的生成您正在使用)之前这一点.

:)

  • 如果您正在使用的目录处于版本控制之下,我建议不要使用此方法:当我使用svn尝试此方法时,它删除了一些存储库工作文件. (34认同)
  • 可能还有其他文件与*cmake*匹配,所以这真的不是一种通用方法.这应该做:rm -rf CMakeFiles; rm -rf CMakeCache.txt; rm -rf cmake_install.cmake; (8认同)
  • Downvoted,因为此命令可能会删除一些用户文件.我更喜欢honza_p命令,不是更长,更简单,风险更低. (3认同)
  • @AdrienDescamps:除了它仍然在子目录中留下与 cmake 相关的垃圾。我在做 `rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles` 仍然没有完成... (2认同)

Per*_*-lk 33

您可以使用以下内容:

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)
Run Code Online (Sandbox Code Playgroud)

我通常创建一个"make clean-all"命令,为前一个例子添加一个"make clean"调用:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
Run Code Online (Sandbox Code Playgroud)

不要试图将"干净"目标添加为依赖:

add_custom_target(clean-all
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
   DEPENDS clean
)
Run Code Online (Sandbox Code Playgroud)

因为"干净"不是CMake的真正目标,这不起作用.

此外,你不应该使用这个"clean-cmake-files"作为任何东西的依赖:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   DEPENDS clean-cmake-files
)
Run Code Online (Sandbox Code Playgroud)

因为,如果你这样做,所有CMake文件将在clean-all完成之前被删除,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
)
Run Code Online (Sandbox Code Playgroud)

这也行不通.


Skr*_*ptX 26

CMake 3.24开始,存在--fresh每次都会重建整个构建树的命令行选项:

--fresh

3.24 版本中的新功能。

对构建树执行全新配置。这将删除任何现有的 CMakeCache.txt 文件和关联的 CMakeFiles/ 目录,并从头开始重新创建它们。

https://cmake.org/cmake/help/latest/manual/cmake.1.html#options


use*_*788 18

只是rm CMakeCache.txt为我发行作品.

  • @nenchev你需要再次运行`cmake /build-path`。 (2认同)
  • @nenchev我明白你的意思,我同意. (2认同)

小智 17

也许它有点过时了,但由于这是您 google 时的第一次命中cmake clean,我将添加以下内容:

由于您可以使用指定的目标在构建目录中启动构建

cmake --build . --target xyz

你当然可以跑

cmake --build . --target clean

clean在生成的构建文件中运行目标。


小智 7

我同意源外构建是最好的答案.但是,在你必须进行源内构建的时候,我已经在这里编写了一个Python脚本,其中:

  1. 运行"干净"
  2. 删除顶级目录中的特定CMake生成的文件,例如CMakeCache.txt
  3. 对于包含CMakeFiles目录的每个子目录,它会删除CMakeFiles,Makefile,cmake_install.cmake.
  4. 删除所有空子目录.


nen*_*hev 7

如果您在-D生成构建文件时将参数传递到 CMake 并且不想删除整个 build/ 目录:

只需删除构建目录中的 CMakeFiles/ 目录即可。

rm -rf CMakeFiles
cmake --build .
Run Code Online (Sandbox Code Playgroud)

这会导致 CMake 重新运行,并重新生成构建系统文件。您的构建也将从头开始。


jpr*_*r42 7

CMake 3.X

CMake 3.0 及更高版本提供了“干净”的目标。这会删除任何工件,例如目标文件、库文件、可执行文件、生成的文件等。

cmake --build C:/foo/build/ --target clean
Run Code Online (Sandbox Code Playgroud)

您还可以清理构建,然后运行构建。在 1 个命令中。

cmake --build C:/foo/build --clean-first
Run Code Online (Sandbox Code Playgroud)

但是,这不会清理诸如CMakeCache.txt相关CMakeFiles/目录之类的内容。你可能想做的事。您只需删除构建文件夹即可。

# Just delete the build folder
rm C:/foo/build -rf

# You can also just let git delete the build folder as well
git clean -d -f -x
Run Code Online (Sandbox Code Playgroud)

CMake 3.24

现在,在 CMake 3.24 中,您可以执行新的configuration的构建树。这将删除任何现有的 CMakeCache.txt 文件和关联的 CMakeFiles/ 目录,并从头开始重新创建它们。

通常,您希望在以下情况下执行此操作:

  • 您想要清除 CMakeCache.txt 中的缓存变量
  • 你想改变编译器
  • 与 CMake 缓存相关的任何其他操作
cmake -B C:/foo/build --fresh
Run Code Online (Sandbox Code Playgroud)


赏心悦*_*心悦目 5

尝试使用: cmake --clean-first path-of-CMakeLists.txt-file -B output-dir

--clean-first:首先构建目标clean,然后构建。
(要仅清洁,请使用 --target clean。)


fra*_*ank 5

看到这个问题得到如此多的关注和复杂的解决方案,这确实很有趣,这确实显示了没有使用 cmake 的干净方法的痛苦。

嗯,你绝对cd build可以做你的工作,然后rm -rf *在你需要清洁的时候做一个。然而,rm -rf *鉴于许多人通常不知道他们在哪个目录中,这是一个危险的命令。

如果你cd ..rm -rf build然后mkdir build然后cd build,那就是打字太多了。

所以一个好的解决方案是远离构建文件夹并告诉cmake路径:
配置:cmake -B build
构建:cmake --build build
清理:rm -rf build
重新创建构建文件夹:你甚至不需要mkdir build,只需配置它,cmake -B buildcmake就会创建它