修改 make distclean 以便删除 .deps 或 *~ 备份文件

Modify make distclean so that it will delete .deps or *~ backup files

我在我的项目上做了一个 make distclean 以为它真的会删除所有内容,但它留下了一个 .deps 目录并且它留下了我所有的编辑器备份文件。

我想扩充我的``Makefile.amin my project directory so that these are also deleted, but it's not clear to me how to do that. What additional things should I put inMakefile.am`,以便删除以下内容:

.deps/
./autom4te.cache/
*~ (in every directory)
{project-name}-{majorversion}.{minorversion}.{release}. (releases that were attempted to be built)

I did a make distclean on my project thinking it would really delete everything, but it left a .deps directory and it left all of my editor backup files.

AutoTools 实施的一般规则是

  • 如果 make 创建了它,那么 make clean 应该清理它。
  • 如果 configure 创建了它,那么 make distclean 应该清理它。
  • 如果 autoconfautomake 或其他 AutoTools 之一创建了它,那么 make maintainer-clean 应该清理它。

由于您可以将任意代码注入 configure 和您的 makefile,因此 AutoTools 无法确保普遍遵守该规则,但文档确实建议您遵守它。

您的编辑器备份文件未清理是预料之中的。此类文件超出了目标清理内容的规则范围,AutoTools 不尝试猜测它们在创建或管理中没有作用的文件的重要性是正确和适当的。他们不应该 有任何关于如何处理此类文件的内置策略。

但是,如果您希望您的特定项目有这样的政策,那么这在您的控制范围内。通过添加 distclean-local 目标,您的任何或所有 Makefile.am 文件都可以添加由 make distclean 执行的额外操作。例如,

distclean-local:
        rm *~

如何对其他目录执行类似操作的详细信息取决于您的项目结构。

autom4te.cache 目录及其内容有些不同。这主要由 AutoTools 自己创建和使用——autoconfautomake。 -- 所以它自然不会被 make distclean 清除。相反,根据规则,它由 make maintainer-clean 清除。不过,这有点模糊,因为在某些情况下,make 会重新 运行 那些工具。然而,当它这样做时,它是在那些工具的输入(Makefile.amconfigure.ac、...)已被修改的上下文中,这是项目维护者 activity,而不是项目建设者activity,所以把清理责任交给maintainer-clean.

还是合理的

不过,如果您希望 distclean 清理 autom4te.cache,那么您可以采用与编辑器备份文件相同的方法,尽管它仅在顶层有用 Makefile.am.例如,

distclean-local:
        rm -rf autom4te.cache

.deps目录是第三层。它是由make创建的,所以根据规则,它应该被make clean清除,而是由make maintainer-clean清除。这是有道理的,因为依赖信息会增加您的 makefile 并通知构建,并且原则上,它可以通过其他方式生成,而不是作为构建项目的副作用。当目标文件不存在时,它当然不应该被清理,因为这可能导致后续构建无法重新制作实际上需要重建的二进制文件。但是如果无论如何都需要构建目标文件(因为它们丢失了),那么无论如何都会重建依赖信息,所以让 make distclean 完成这项工作没有什么坏处。您可以像其他人一样完成此操作。

最后,清理因 make distmake distcheck 运行 失败导致的分发目录。准备分发是维护者 activity,虽然这些工件是通过 make 工具生成的,但它们不是由默认 make 运行 生成的。我会把对这些的任何清理责任放在 maintainer-clean 上,但我不确定它是否真的处理了它们。您绝对可以按照针对其他工件所描述的相同方法来获取 distclean 来删除它们。但是请注意,

  1. 您可能需要对这些目录执行递归 chmod 以授予自己写权限,然后再实际删除它们,并且
  2. 如果您使用 glob 模式来执行此类目标的清理,您应该非常小心,因为命名的性质会产生意外匹配您想要保留的文件的特殊风险。

当然,您可以将其中的一些或全部组合起来(通过多行配方组合成一个规则),以将其中的几个行为添加到项目的构建系统中。