【问题标题】:What are the differences between make clean, make clobber, make distclean, make mrproper and make realclean?make clean、make clobber、make distclean、make mrproper 和 make realclean 有什么区别?
【发布时间】:2019-01-21 02:09:10
【问题描述】:

我并不总是编写 make 文件,但是当我这样做时,我喜欢尝试把它们写好。试图使界面与其他开发人员可能期望的一致始终是一项艰巨的任务。我正在寻找的是所有常见的 make things clean (GNU) make 目标的总结。

常见的清洁目标有哪些?

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

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


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

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

make realclean 对我来说是全新的,当我在 GNU Make Goals manual page 上发现它时。正如它与distcleanclobber 一起列出的,我猜它有类似的效果。我从来没有遇到过它,因为它是一件历史文物,或者只是我必须从事的一组项目的特定项目?


对不起,这有点漫无边际。我发现了各种问题和答案,可以将一个目标与另一个目标进行比较,但似乎没有一个可以很好地概述。

【问题讨论】:

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


    【解决方案1】:

    试图根据一些研究形成我自己的答案。我认为严重程度的大致顺序是; mostlycleancleanmaintainer-cleanmrproperdistclean,最后是clobber(结合了distcleanuninstall)。

    清理

    make clean 是最基本的级别。它会清理大多数生成的文件,但不会清理任何记录配置的文件。 GNU Make Manual's Goals page 状态:

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

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

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

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

    尽量干净

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

    GNU Make Manual's Standard Targets page 阶段:

    类似于“干净”,但可能会避免删除一些人们通常不想重新编译的文件。例如,GCC 的“mostlyclean”目标不会删除 libgcc.a,因为很少需要重新编译它并且需要很长时间。

    使 distclean

    make distclean 是许多 GNU Make 系统上基本make clean 的第一步。在许多但不是所有情况下,它似乎是假名或至少与make realcleanmake clobber 非常相似。它将删除make clean 所做的一切并删除配置。

    在 Linux 系统中,这比make mrpropper 更进一步,详情请参阅下面的部分。

    我不确定这个名字是否暗示事情已经变得足够干净以便分发(形成一个 tar 存档),或者该过程正在将它们返回到与分发的状态相同的状态(就像事情紧随其后一样解压 tar 档案)。

    GNU Make Manual's Goals page 状态:

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

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

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

    进行卸载

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

    GNU Make Manual's Standard Targets page 阶段:

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

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

    使维护者干净

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

    GNU Make Manual's Standard Targets page 阶段:

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

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

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

    使先生正确

    make mrproper 似乎是make distcleanmake clobber 的Linux 内核版本。 这停止了​​删除备份和补丁文件。它完成了make clean 目标所做的所有事情并去除了配置。

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

    Linux Kernel 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
    

    制作破坏者

    make clobberWikipedia article for Clobbering 上也有提及。这也表明它比make clean 更严重,甚至可能会卸载软件。可能是make uninstallmake distclean 的组合。


    make clean 关卡没有单一来源。由于事情随着时间的推移而演变,术语和行为是不一致的。以上是迄今为止我设法拼凑的最好的。

    【讨论】:

    • 恕我直言,希望这些升级步骤能够说明一切,或者传输正确的信息,甚至指示正确的用法,这种希望非常渺茫。看看 Linux 内核,即使是这个软件项目的利维坦也只经历了三个阶段。
    • @Vroomfondel 我不希望或建议所有这些都将或应该立即使用。我试图弄清楚使用了哪些常见的术语集,以及它们周围是否存在大致商定的含义。 make cleanmake clobber 对我来说有些道理,但这只是因为我以前和他们一起处理过代码库。差异是什么的答案,也许是历史上的怪事,人们的暴露程度会千差万别。
    • 我的经验也是。要对此事有完全不同的看法,请记住所有clean 命令只是软件项目中缺少的依赖信息的残酷替代品。依赖信息的另一半存在于原始开发人员的头脑中——或者更糟的是,它不存在,从事该项目的每个人都可能掌握这些命令的错误依赖。
    • @Vroomfondel 我基本同意,但在准备补丁以在某处提交或生成没有生成内容的干净存档文件时,make clean 或类似的用途。现在,一些严格的目录结构可能会取代它,并让您认为仅作为缺失依赖项的记录是绝对的。
    • 好问题和好答案。令人震惊的是——也许是在说明 2019 年 Linux 的状态——它的一些最常见和最具破坏性的命令的权威文档是如此难以获得。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 2014-06-07
    • 2010-10-20
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多