如果 configure.ac 可用,是不是应该分发“配置”脚本?

Posted

技术标签:

【中文标题】如果 configure.ac 可用,是不是应该分发“配置”脚本?【英文标题】:Should a "configure" script be distributed if configure.ac is available?如果 configure.ac 可用,是否应该分发“配置”脚本? 【发布时间】:2012-02-10 12:19:42 【问题描述】:

目前,我们的安装说明是:

autoreconf -fi
./configure
...

autoreconf 步骤从configure.ac 生成configure 文件,从Makefile.in 生成Makefile.in。如果未安装其中一个依赖项(例如 pkg-config),configureautoreconf 都会失败,尽管后者会打印一条神秘的错误消息。

在发布源码包时,是否应该在包中提供configure 脚本?如果必须分发,还需要包含哪些其他文件?还创建了目录build-auxautom4te.cache 以及文件aclocal.m4

【问题讨论】:

在 SCM 存储库中,不应存在任何自动生成的内容(包括配置); tarball 应该包含 autoreconf -fi/autogen.sh/bootstrap 之后的状态(或者只使用make dist)。 @jørgensen 回答这个问题,我没有完全意识到make dist 是这里的关键 我也很好奇为什么分发配置脚本很好。对我来说,运行autogen.sh 似乎同样容易(而且更干净)。 @LeifGruenwoldt autogen.sh(通常称为autoreconf -fi)需要存在依赖项。如果它们丢失,您可能会收到隐秘的错误。另一个原因是configure 脚本的生成需要autoconf(通常也是automake),一旦你有了configure 脚本,就不再需要了。 @Lekensteyn 谢谢。我想我希望如果有人安装了编译项目的工具,他们也可以只安装 autotools,但也许并不是每个人都可以使用。啊,现代发行版的便利。 【参考方案1】:

在 SCM 存储库中,不应存在任何自动生成的内容(包括配置——但开发人员的意见在这里偏离了主题)。 tarball 应该包含autoreconf -fi 和/或autogen.sh(或您为其选择的任何名称)之后的状态。第三,您也可以使用make dist,尽管它要求所有应出现在 tarball 中的文件也必须在 Makefile 中列出。

【讨论】:

你错了,最终用户不需要安装自动工具来构建你的软件。 @MoDJ 请注意:使用此解决方案,最终用户无需安装自动工具(但开发人员需要)。【参考方案2】:

您的安装说明严重损坏。用户不需要安装自动工具链来构建您的软件。您必须在 tarball 中分发配置脚本。请注意,您不应在版本控制系统中包含配置脚本。 (您不应该将您的版本控制系统用作分发系统。)

【讨论】:

感谢您的回复,我现在知道应该使用make dist(它非常适合生成configure 文件等)。 @Lekensteyn -- 实际上,您应该始终使用make distcheck 很高兴知道,autotools 有很多选择,但您只需要了解它,因为文档并不简洁。 gnu.org/software/automake/manual/html_node/…【参考方案3】:

配置脚本应由维护者构建并分发在 tarball 中。最终用户永远不必触摸它,如果您使用的是 automake,最好通过AM_MAINTAINER_MODE 确保这一点。如果没有,请确保您的 Makefile.in 在为最终用户运行时不会重新生成 configure

如果你想知道还有什么属于那里,让automake 为你生成一个分布。辅助目录build-auxaclocal.m4 可以,automat4e.cache 不行。

【讨论】:

啊,我刚刚查看了 php 存储库,似乎包含来自 git 的源代码的 tarball 不应该用于分发。如果我发布一个包含configure 脚本的压缩包(就像从 PHP 下载的一样),我需要使用make dist吗? AM_MAINTAINER_MODE 一直是个坏主意。它的作者几年前就同意了。它现在被认为(大部分)已弃用,并且有人说要从 automake 中删除它。不要使用它。 @Lekensteyn:make dist 非常适合制作分发压缩包,毕竟这是它的工作。 @WilliamPursell:虽然关于AM_MAINTAINER_MODE 敏感性的讨论在automake 用户手册(第28.2 节)中,并且宏被称为“臭名昭著”,但它并未标记为已弃用。在至少一个用户构建由于不同的 libtool 版本和损坏的时间戳而中断后,我仍然认为这是明智的。 @thiton 是分发压缩包中的“损坏的时间戳”吗? make distcheck 应该能捕捉到这样的错误。

以上是关于如果 configure.ac 可用,是不是应该分发“配置”脚本?的主要内容,如果未能解决你的问题,请参考以下文章

autoreconf:需要“configure.ac”或“configure.in”

如何使用 configure.ac 来包含 AC_INCLUDES_DEFAULT 的内容?

configure.ac中如何处理多个版本的Automake

如何执行 shell 命令,并将输出分配给 configure.ac 中的 AC_DEFINE 变量

自定义 .m4 宏不适用于 configure.ac

autotools:将常量从 configure.ac 传递给 python 脚本