make clean,make clobber,distdist,mrproper和realclean之间有什么区别?

时间:2018-08-14 09:06:02

标签: makefile compilation gnu-make packaging code-cleanup

我并不总是写make文件,但是当我这样做时,我想尝试并很好地编写它们。试图使接口与其他开发人员所期望的保持一致始终是一件困难的事情。我要寻找的是所有更清洁的通用(GNU)制造目标的摘要。

常见的清洁目标是什么?

每个目标何时正常使用?

每个目标与其他目标相比如何?


我以前曾使用过make cleanmake clobbermake mrproper的系统。那些人变得越来越坚决; make clean仅整理临时文件,make clobber读取大多数配置,而make mrproper几乎回到刚刚签出的状态。这是正常的事情吗? make mrproper是否应始终删除生成的二进制文件和共享库以进行部署?

通读建议make distclean整理事物,直到准备好分发软件包为止。我会留下一些自动生成的版本标记文件,文件清单和共享库的图像,但可能会删除不想存档的临时文件吗?

当我在GNU Make Goals manual page上监视时,

make realclean对我来说是全新的。由于它是用distcleanclobber列出的,我想它具有相似的效果。我从来没有遇到过它,因为它是历史性的人工产物,或者只是针对我必须从事的一系列项目而特定?


对不起,这有点杂乱无章。我发现了将一个目标与另一个目标进行比较的各种问题和答案,但是似乎没有一个很好的概述。

1 个答案:

答案 0 :(得分:2)

根据一些研究试图形成自己的答案。我认为严重程度的大致顺序是: mostlycleancleanmaintainer-cleanmrproperdistclean,最后是clobber(由distclean和{{1}合并而成) }。

清洁

uninstall是最基本的级别。它清除大多数生成的文件,但不清除任何记录配置的文件。 GNU Make Manual's Goals page声明:

  

删除通常通过运行make创建的所有文件。

另外,GNU Make Manual's Standard Targets page个阶段:

  

删除当前目录中通常通过构建程序创建的所有文件。如果此makefile创建了其他目录中的文件,也请删除它们。但是,请勿删除记录配置的文件。还保留可以通过构建生成的文件,但通常不是因为发行版附带了这些文件。无需删除使用“ mkdir -p”创建的父目录,因为它们可能仍然存在。

     

如果不在发行版中,请在此处删除.dvi文件。

基本清洁

make clean是我发现的唯一较温和的清理形式,它的行为像clean一样,但是留下了需要很长时间才能编译且不需要经常重新生成的文件。

GNU Make Manual's Standard Targets page阶段:

  

类似于“干净”,但可能会删除一些人们通常不希望重新编译的文件。例如,GCC的“基本清理”目标不会删除libgcc.a,因为很少需要重新编译它,而且会花费很多时间。

进行distclean

make mostlyclean是许多GNU Make系统上从基本make distclean开始的第一步。在许多情况下,但并非所有情况下,它似乎都是make cleanmake realclean的化名或至少非常相似。它将删除make clobber所做的所有操作并删除配置。

在Linux系统中,这是make clean之后的一步,有关详细信息,请参见以下部分。

我不确定该名称是否暗示已对事物进行了足够清洁以进行分发(形成tar归档文件),或者该过程是否将其恢复为与已分发状态相同的状态(就像事物在紧随其后一样)解压缩tar存档)。

GNU Make Manual's Goals page状态:

  

所有这些目标都可能定义为比“干净”删除更多文件。例如,即使makefile本身无法创建这些文件,它也会删除通常为编译准备而创建的配置文件或链接。

另外,GNU Make Manual's Standard Targets page个阶段:

  

删除当前目录中(或由此Makefile创建的)通过配置或构建程序创建的所有文件。如果您解压缩了源代码并在不创建任何其他文件的情况下构建了程序,则“ make distclean”应仅保留分发中的文件。但是,无需删除使用“ mkdir -p”创建的父目录,因为它们可能仍然存在。

进行卸载

make mrpropper将卸载通过make uninstallmake install变体之一安装的软件。这类似于某些系统上install-*的部分行为,但是make clobber不应像make uninstall那样触及构建区域。

GNU Make Manual's Standard Targets page阶段:

  

删除所有已安装的文件,即“安装”和“安装-*”目标创建的副本。

     

此规则不应修改完成编译的目录,而只能修改安装文件的目录。

使维护者保持清洁

make clobber似乎比更常见的make maintainer-clean后退了一步。除了配置,它几乎删除所有内容。这使其与make distclean非常相似。

GNU Make Manual's Standard Targets page阶段:

  

删除几乎可以使用此Makefile重建的所有内容。这通常包括distclean删除的所有内容,以及更多内容:Bison生成的C源文件,标签表,Info文件等。

还需要强调的是,这并不是针对特定用户的常用目标:

  

“维护者清洁”目标旨在由软件包的维护者使用,而不是普通用户使用。

制造恰当

make clean似乎是make mrpropermake distclean的Linux内核版本。  在删除备份和补丁文件之前就停止了。它完成make clobber目标所做的所有工作,并去除配置。

我相信这个名字来自于一种清洁产品,在美国被称为Mr. Clean,在英国被称为Flash(这就是为什么我没有听说过这种产品的原因)。芬兰裔美国人Linus Torvalds大概对Propper先生的品牌熟悉。

Linux Kernel Makefile指出:

make clean

制造障碍物

# Cleaning is done on three levels. # make clean Delete most generated files # Leave enough to build external modules # make mrproper Delete the current configuration, and all generated files # make distclean Remove editor backup files, patch leftover files and the like 也被Wikipedia article for Clobbering提及。这也说明它比make clobber更严重,甚至可能甚至卸载了该软件。 make cleanmake uninstall可以组合使用。


没有任何一种清洁标准的来源。随着时间的流逝,术语和行为变得不一致。以上是我到目前为止所设法做到的最好。