您的位置:

distclean——清理规则之王

一、作用

distclean是指清理Makefile生成的中间文件以及目标文件,包括生成的动态库和静态库等。通常使用make distclean命令将代码目录还原到干净的状态,方便进行下一次编译。

distclean是整个清理规则中最严格、最全面的,几乎可以把所有的编译生成物全部删除。

distclean实际上是clean和mrproper的结合体,它不但清理已生成的二进制文件和中间编译文件,还会清除软件生成的配置文件,以及一些可能会改变编译结果的文件。

二、翻译

'clean'是干净的意思,'dist'代表distribution,即发布版本。所以distclean就是将发布版本还原到编译前的干净状态。

三、指令

使用distclean指令时需要注意的是,它会将除原始代码外所有文件都删除,包括可执行文件、obj文件以及库文件等。为确保安全,很多程序在执行distclean指令时会出现提示,要求用户手动确认。

四、由来

distclean最早出现在Unix的make工具中,主要作用是用来删除编译过程中生成的文件以及编译出错后的文件。后来,随着软件发布的需求增加,distclean逐渐演变成了清理整个代码目录的通用规则。如今,distclean已经成为了许多开源软件项目清理的必备规则,包括Linux内核、Python等。

五、使用例子

以CMake为例:

cmake_minimum_required(VERSION 2.6)
project(test)

add_executable(test main.c)

# 添加distclean指令
add_custom_target(distclean
                  COMMAND ${CMAKE_BUILD_TOOL} clean
                  COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/clean-all.cmake
                  )

# 清理脚本
file(WRITE ${CMAKE_SOURCE_DIR}/clean-all.cmake
  "
  # 清理编译生成的文件
  file(REMOVE \${CMAKE_BINARY_DIR}/CMakeCache.txt)
  file(REMOVE \${CMAKE_BINARY_DIR}/Makefile)
  file(REMOVE \${CMAKE_BINARY_DIR}/cmake_install.cmake)
  file(REMOVE \${CMAKE_BINARY_DIR}/CMakeFiles)
  
  # 清除生成的结果文件
  file(GLOB_RECURSE files_to_remove
       \${CMAKE_BINARY_DIR}/
       facit-*
       *.nav
       *.aux
       *.toc
       *.out
       *.log
       *.blg
       *.bbl
       *.dvi
       *.pdf
      )
  if(files_to_remove)
    message(\"Distclean running: removing generated results\")
    file(REMOVE \${files_to_remove})
  endif()

  # 清理生成的测试文件
  file(REMOVE \${CMAKE_BINARY_DIR}/testoutput_*.txt)
  "
)

上述CMakeLists.txt中定义了一个名为distclean的自定义指令,它主要执行以下操作:

  • 清理编译生成的文件(CMakeCache.txt、Makefile、cmake_install.cmake、CMakeFiles)
  • 清除编译过程中生成的结果文件(facit-*、.nav、.aux、.toc、.out、.log、.blg、.bbl、.dvi、.pdf)
  • 清除生成的测试输出文件(testoutput_*.txt)

执行make distclean指令时,会按照上述规则进行清理,确保代码目录干净,除非重新编译,否则不会有残留文件。

六、总结

distclean作为清理规则之王,不仅广泛运用于开源软件项目的编译和部署中,也给我们的编程工作带来了很大的方便。不过,要注意在使用distclean指令时,一定要谨慎操作,否则可能会导致数据丢失甚至系统崩溃。