正如make clean删除makefile生成的所有文件一样,我想对CMake做同样的事情。我经常发现自己手动地在目录中删除像cmake_install这样的文件。cmake和CMakeCache.txt,以及CMakeFiles文件夹。

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


当前回答

有趣的是,这个问题得到了如此多的关注和复杂的解决方案,这确实表明了cmake没有一个干净的方法的痛苦。

好吧,你当然可以cd build_work来做你的工作,然后在你需要清理的时候做一个rm -rf *。然而,rm -rf *是一个危险的命令,因为许多人通常不知道他们在哪个目录中。

如果你cd .., rm -rf build_work,然后mkdir build_work,然后CD build_work,输入太多了。

所以一个好的解决方案是远离build文件夹,告诉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 3。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中没有cmake clean。X

我通常在一个类似“build”的文件夹中构建项目。如果我想弄清楚,我可以rm -rf构建。

在与根目录“CMakeLists.txt”相同的目录中的“build”文件夹通常是一个不错的选择。要构建你的项目,你只需要把CMakeLists.txt文件的位置作为参数给cmake。例如:cd <location-of-cmakelists>/build && cmake…(从@ComicSansMS)

简单地发布rm CMakeCache.txt也适用于我。

你可以这样使用:

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)

我通常创建一个“make clean-all”命令,在前面的例子中添加一个调用“make clean”:

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
)

因为“干净”在CMake中不是一个真正的目标,这是行不通的。

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

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   DEPENDS clean-cmake-files
)

因为,如果你这样做,所有的CMake文件将在clean-all完成之前被擦除,make将抛出一个搜索“CMakeFiles/clean-all.dir/build.make”的错误。因此,在任何情况下,都不能在"anything"前面使用clean-all命令:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)

这也不行。

cmake主要生成一个Makefile文件,可以将rm添加到干净的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

当你在生成build文件时将-D参数传递给CMake,并且不想删除整个build/目录时:

简单地删除构建目录中的CMakeFiles/目录。

rm -rf CMakeFiles/
cmake --build .

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