make clean、make clobber、make distclean、make mrproper 和 make realclean 之间有什么区别?

Taf*_*afT 6 packaging makefile compilation code-cleanup gnu-make

我并不总是写 make 文件,但是当我这样做时,我喜欢尝试把它们写好。试图使界面与其他开发人员可能期望的一致总是很困难的。我正在寻找的是所有常见的 make something clean (GNU) make 目标的摘要。

常见的清洁目标有哪些?

每个目标通常什么时候使用?

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


我曾使用make clean,make clobbermake mrproper之前的系统。那些变得越来越极端;make clean只整理临时文件,make clobber摆脱大部分配置,make mrproper几乎回到刚刚签出的状态。这是正常的秩序吗?应该make mrproper始终删除生成的二进制文件和共享库以进行部署吗?

阅读建议将make distclean事情整理到准备制作分发包的程度。我想这会留下一些自动生成的版本标记文件、文件清单和共享库,但可能会删除您不想存档的临时文件?

make realclean当我在GNU MakeGoals 手册页上看到它时,它对我来说是全新的。正如它列出的那样distcleanclobber我猜它有类似的效果。我是否从未遇到过它,因为它是一个历史文物,或者只是我必须从事的一组项目的特定内容?


抱歉,这有点啰嗦。我找到了将一个目标与另一个目标进行比较的各种问题和答案,但似乎没有一个可以很好地概述。

Taf*_*afT 9

试图根据一些研究形成我自己的答案。我认为严重程度的大致顺序是;mostlyclean, clean, maintainer-clean, mrproper,distclean和 finally clobber(结合distcleanuninstall)。

清洁

make clean是最基本的层次。它会清理大多数生成的文件,但不会清理任何记录配置的文件。 GNU Make 手册的目标页面指出:

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

此外,GNU Make 手册的标准目标页面阶段:

删除当前目录中通常通过构建程序创建的所有文件。如果其他目录中的文件是由这个 makefile 创建的,也删除它们。但是,不要删除记录配置的文件。还保留可以通过构建生成的文件,但通常不是因为分发随附。无需删除使用“mkdir -p”创建的父目录,因为它们本来可以存在的。

如果 .dvi 文件不是发行版的一部分,请在此处删除它们。

使大部分清洁

make mostlyclean 是我发现的唯一一种更温和的 clean 形式,它的行为类似于 clean 但留下的文件需要很长时间才能编译并且通常不需要重新生成。

GNU Make使用手册的标准瞄准页面阶段:

像'clean',但可能不会删除一些人们通常不想重新编译的文件。例如,GCC 的“mostlyclean”目标不会删除 libgcc.a,因为很少需要重新编译它并且需要很多时间。

使 distclean

make distcleanmake clean在许多 GNU Make 系统上,这是从基础开始的第一步。它似乎是匿名的,或者至少与 withmake realcleanmake clobber在许多但并非所有情况下非常相似。它将删除所做的一切make clean并删除配置。

在 Linux 系统中,这是一个超越的步骤make mrpropper,请参阅下面的部分了解详细信息。

我不确定这个名字是否意味着事情已经足够干净以进行分发(形成 tar 存档),或者该过程正在将它们返回到与分发内容相同的状态(就像解压 tar 后的情况一样)档案)。

GNU Make 手册的目标页面指出:

这些目标中的任何一个都可能被定义为删除比“clean”更多的文件。例如,这会删除您通常为编译而创建的配置文件或链接,即使 makefile 本身无法创建这些文件。

此外,GNU Make 手册的标准目标页面阶段:

删除当前目录中(或由此生成文件创建的)中通过配置或构建程序创建的所有文件。如果您解压了源代码并构建了程序而不创建任何其他文件,'make distclean' 应该只保留发行版中的文件。但是,不需要删除使用“mkdir -p”创建的父目录,因为它们本来可以存在的。

进行卸载

make uninstall将卸载通过make install或其中一种install-*变体安装的软件。这类似于make clobber某些系统上的部分行为,但make uninstall不应随意接触构建区域make clobber

GNU Make使用手册的标准瞄准页面阶段:

删除所有已安装的文件 - 'install' 和 'install-*' 目标创建的副本。

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

使维护者干净

make maintainer-clean似乎是从更常见的退一步make distclean。除了配置之外,它几乎删除了所有内容。这使它非常类似于make clean.

GNU Make使用手册的标准瞄准页面阶段:

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

还强调的是,这不是一个常用的目标,因为它适用于特定的一组用户:

'maintainer-clean' 目标旨在由包的维护者使用,而不是由普通用户使用。

使先生正确

make mrproper似乎是一个Linux内核版本make distcleanmake clobber。这还不够删除备份和补丁文件。它完成make clean目标所做的一切并去除配置。

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

Linux内核的Makefile状态:

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

搞砸

make clobberWikipedia 文章中也提到了 Clobbering。这也表明它比make clean甚至可能卸载软件更严重。make uninstall和的组合是可能的make distclean


make clean 级别没有单一来源。随着事物随着时间的推移而发展,术语和行为是不一致的。以上是迄今为止我设法拼凑的最好的。

  • @Vroomfondel 我不期望或建议所有这些都将或应该一次使用。我试图找出正在使用的常用术语集,以及它们是否有大致的商定含义。`make clean` 和 `make clobber` 对我来说有些意义,但这只是因为我之前和他们一起研究过代码库。区别是什么的答案,也许是历史上的怪事,人们的接触面会千差万别。 (3认同)
  • 我的经历也是。如果对此事有完全不同的看法,请记住,所有“干净”命令都只是软件项目中缺失的依赖信息的残酷替代品。依赖信息的另一半存在于原始开发人员的头脑中 - 或者更糟糕的是,它无处可寻,并且参与该项目的每个人都可能错误地依赖这些命令。 (2认同)