就像make clean删除makefile生成的所有文件一样,我想对CMake做同样的事情.很多时候,我发现自己在目录删除文件,如手动去cmake_install.cmake和CMakeCache.txt和CMakeFiles文件夹.
是否有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)
Pet*_*ter 82
使用GNU autotools创建的一些构建树具有"make distclean"目标,用于清除构建并删除Makefile和生成的构建系统的其他部分.CMake不会生成"make distclean"目标,因为CMakeLists.txt文件可以运行脚本和任意命令; CMake无法准确跟踪在运行CMake时生成哪些文件.提供一个干净的目标会给用户一个错误的印象,即它会按预期工作.(CMake确实生成了一个"make clean"目标来删除编译器和链接器生成的文件.)
只有在用户执行源内构建时,才需要"make distclean"目标.CMake支持源内构建,但我们强烈建议用户采用源外构建的概念.使用与源树分开的构建树将阻止CMake在源树中生成任何文件.因为CMake不会更改源树,所以不需要一个distclean目标.可以通过删除构建树或创建单独的构建树来开始新构建.
Jea*_*avy 55
在Git的这些日子里,你可能会忘记CMake并使用它git clean -d -f -x,这将删除所有不受源代码控制的文件.
小智 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的生成您正在使用)之前这一点.
:)
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每次都会重建整个构建树的命令行选项:
--fresh3.24 版本中的新功能。
对构建树执行全新配置。这将删除任何现有的 CMakeCache.txt 文件和关联的 CMakeFiles/ 目录,并从头开始重新创建它们。
https://cmake.org/cmake/help/latest/manual/cmake.1.html#options
use*_*788 18
只是rm CMakeCache.txt为我发行作品.
小智 17
也许它有点过时了,但由于这是您 google 时的第一次命中cmake clean,我将添加以下内容:
由于您可以使用指定的目标在构建目录中启动构建
cmake --build . --target xyz
你当然可以跑
cmake --build . --target clean
clean在生成的构建文件中运行目标。
如果您在-D生成构建文件时将参数传递到 CMake 并且不想删除整个 build/ 目录:
只需删除构建目录中的 CMakeFiles/ 目录即可。
rm -rf CMakeFiles
cmake --build .
Run Code Online (Sandbox Code Playgroud)
这会导致 CMake 重新运行,并重新生成构建系统文件。您的构建也将从头开始。
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 中,您可以执行新的configuration的构建树。这将删除任何现有的 CMakeCache.txt 文件和关联的 CMakeFiles/ 目录,并从头开始重新创建它们。
通常,您希望在以下情况下执行此操作:
cmake -B C:/foo/build --fresh
Run Code Online (Sandbox Code Playgroud)
尝试使用: cmake --clean-first path-of-CMakeLists.txt-file -B output-dir
--clean-first:首先构建目标clean,然后构建。
(要仅清洁,请使用 --target clean。)
看到这个问题得到如此多的关注和复杂的解决方案,这确实很有趣,这确实显示了没有使用 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就会创建它