修改make distclean,使其删除.deps或*~备份文件

vy3*_*y32 2 automake autoconf autotools

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

我想扩充我的“Makefile.am in 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)
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 6

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

AutoTools 实现的一般规则是

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

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

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

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

distclean-local:
        rm *~
Run Code Online (Sandbox Code Playgroud)

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

autom4te.cache目录及其内容则有些不同。这主要是由 AutoTools 本身创建和使用的-autoconfautomake等等。——所以自然不会被清理干净。相反,根据规则,它是由 清理的。不过,这有点模糊,因为在某些情况下,会重新运行这些工具。然而,当它这样做时,它是在这些工具的输入( 、 、 ...)已被修改的上下文中的,这是项目维护者活动,而不是项目构建者活动,因此将清理责任分配给 仍然是合理的。make distcleanmake maintainer-cleanmakeMakefile.amconfigure.acmaintainer-clean

不过,如果您想distclean清理autom4te.cache,则可以采用与编辑器备份文件所述相同的方法,尽管它仅在顶级Makefile.am. 例如,

distclean-local:
        rm -rf autom4te.cache
Run Code Online (Sandbox Code Playgroud)

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

最后,清理因失败make distmake distcheck运行而产生的分发目录。准备发行版是维护者的活动,尽管这些工件是通过该make工具生成的,但它们不是由默认make运行生成的。我会将这些的清理责任放在 上maintainer-clean,但我不确定它是否真正处理它们。您绝对可以按照针对其他工件描述的相同方法来distclean删除它们。但请注意,

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

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