如何创建一个 configure 脚本?

107

虽然这个问题听起来很泛泛,但是还是让我来回答。

我有一个需求需要为我的应用程序创建一个配置脚本,该配置的结果将会生成一个makefile(基本的configuremakemake install)。我的问题是,我要从哪里开始构建这个?是否有我可以跟随的示例?


6
你是在问是否指的是Autoconf吗? - chrisaycock
这是我开始学习autotools的方式 --> autobook - Shawn Chin
也许可以参考这个视频介绍 http://www.dwheeler.com/autotools/ 和这本书 http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool。 - Jichao
4个回答

100
要创建标准的“配置”脚本,您需要GNU autoconf。您可能还需要GNU automake和libtool。
有大量的文档和教程。搜索类似于“autoconf automake howto”的内容。好的文档在官方手册页中。
- Autoconf: http://www.gnu.org/software/autoconf/ - Automake: http://www.gnu.org/software/automake/automake.html - Libtool: http://www.gnu.org/software/libtool/libtool.html Autoconf将从“configure.ac”文件创建您的配置脚本。“Makefile.am”文件将指示automake如何通过配置字符串创建您的makefile。Libtool用于简化围绕您的代码的库处理。
您可以手动开始创建configure.ac文件,也可以使用“autoscan”助手为您创建半自动化的东西。
然后,当您准备好时,这个会做魔法:
autoreconf -i

建议按照 https://unix.stackexchange.com/questions/18673/some-m4-macros-dont-seem-to-be-defined 的提示,仅返回已翻译的文本。 - Trevor Boyd Smith
GNU文档暗示可能存在其他配置脚本工具:https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html,除了手动操作之外还有其他工具吗? - Evan Benn

54

9
有时软件产品没有配备configure脚本。查找一个名为autogen.sh的脚本。它可能会运行:
aclocal || die "aclocal failed"
automake --add-missing --force-missing --copy --foreign || die "automake failed"
autoreconf || die "autoreconf failed"

4
所有这些答案都是关于 GNU 工具 autoconf 的。然而,在 GNU 之前,configure shell 脚本就已经存在于 UNIX 中,并且可以手动创建或以其他方式创建。 configure 做了什么? configure 只是一个 shell 脚本。它的工作是生成一组配置变量,这些变量是 makefile 在特定系统上构建软件所需的。例如,它可能确定链接器标志和头文件搜索路径,以包含特定库。 configure 还可以接受用户的选项,例如控制是否在调试或发布模式下构建。
通常,configure 将这些变量写入名为 config.mk 的文件中,该文件由 makefile 包含。它还可能生成一个带有一些预处理器定义的头文件 config.h。请注意,configure 只是用于自动生成这些内容的有用自动化工具。用户始终可以手动编辑 config.mk(特别是在不常见的系统上)。 configure 如何检测功能? “配置”使用多种技术来定位依赖项并检测系统或硬件功能。最不稳定的(但有时必要的方法)是检查“uname”以检测操作系统。一个有用的工具是“pkg-config”,它可以告诉您在哪里找到各种已安装的库。
最后,配置脚本总是可以生成小的代码片段,然后尝试编译它们以查看某个功能是否可用。
Joe Nelson有一篇很棒的文章,其中包含每个想法的示例。
“我应该编写自己的配置还是使用autoconf?”
大多数程序只需要检测1或2个小东西就能正常工作。在这些情况下,我认为编写一个配置脚本是有意义的,而不是尝试弄清楚autotools这个庞大软件的边角情况。如果您产生一个简单的“config.mk”,它总是可以手动修复,并且各种系统的用户将帮助您正确地使您的“配置”工作。
对于更复杂的依赖关系,autoconf 可能会很有用。
为了公正地考虑所有方面,让我们引用 autoconf文档 中提出的论点:

Autoconf 的主要目标是使用户的生活更轻松;使维护者的生活更轻松只是次要目标。

Autoconf 在实现其目标方面非常成功——大多数针对 Autoconf 列表的投诉都是关于编写 Autoconf 输入时遇到的困难,而不是关于生成的 configure 的行为。即使不使用 Autoconf 的软件包通常也会提供一个 configure 脚本,而这些自制脚本最常见的投诉是它们未能满足用户从 Autoconf 生成的 configure 脚本中期望的 GNU 编码标准之一(请参见 GNU 编码标准中的配置)。

总结一下:

你的配置可能没有一些用户期望的所有命令。例如,你可能会错误地检测到某些功能或使用不正确的假设,比如 if macOS { use mac commands } else { use linux commands },而不是 if gnuTools { use gnu commands } else { use bsd/posix commands }
你需要确定这对你是否重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接