对配置脚本和 Makefile.in 感到困惑

Posted

技术标签:

【中文标题】对配置脚本和 Makefile.in 感到困惑【英文标题】:Confused about configure script and Makefile.in 【发布时间】:2015-01-06 01:49:14 【问题描述】:

我目前正在学习如何使用autoconf/automake 工具链。我似乎对这里的工作流程有一个大致的了解——基本上你有一个configure.ac 脚本,它生成一个可执行的configure 文件。生成的configure脚本然后由最终用户执行以生成Makefiles,因此可以构建/安装程序。

所以典型的最终用户的安装基本上是:

./configure
make
make install
make clean

好的,现在我很困惑:

作为开发人员,我注意到自动生成的配置脚本有时无法运行,并且会出现以下错误:

config.status: error: cannot find input file: `somedir/Makefile.in' 

这让我很困惑,因为我认为配置脚本应该生成Makefile.in。所以谷歌搜索了一些答案,我发现这可以用autogen.sh 脚本来解决,它基本上“重置”了autoconf 环境的状态。典型的autogen.sh 脚本类似于:

aclocal \
&& automake --add-missing \
&& autoconf

好吧好吧。但作为终生下载无数压缩包的最终用户,我从未不得不使用autogen.sh 脚本。我所做的只是解压缩 tarball,然后执行通常的 configure/make/make install/make clean 例程。

但作为现在使用 autoconf 的开发人员,除非您先运行autogen.sh,否则configure 似乎不会真正运行。所以我觉得这很令人困惑,因为我认为最终用户不应该运行autogen.sh

那么为什么我必须先运行autogen.sh 才能让配置脚本找到Makefile.in?为什么配置脚本不直接生成它?

【问题讨论】:

GNU Autoconf(或者可能是 GNU Automake)带有一个方便的 autoreconf 脚本,它与 autogen.sh 做同样的事情等等。至于为什么需要运行它,在somedir子目录下有Makefile.am供Automake查找somedir/Makefile.am并从中生成somedir/Makefile.in吗? 如果有autoreg.sh 脚本,则运行它。如果没有,则运行autoupdate && autoreconf -f -i。两者都应该生成一个configure 供您运行。遗憾的是 Autotools 手册中没有明确说明,但它与 Autotools 的课程相当。顺便说一句,我相信autogen.shautoreconf -f -i 的包装脚本(可能带有详细选项)。 【参考方案1】:

为了真正了解 autotools 实用程序,您必须记住它们来自哪里:它们来自一个开源世界,其中 (a) 开发人员在源代码存储库(CVS、Git 等)中工作。并创建包含源代码的 tar 文件或类似文件并将该 tar 文件放在下载站点上,以及 (b) 获取源代码 tar 文件的最终用户,在其系统上编译该源代码并使用生成的二进制文件。显然 (a) 组中的人也编译代码并使用生成的二进制文件,但 (b) 组中的人通常没有或不需要 (a) 组中的人需要的所有开发工具。

因此,工具的使用是针对这种分裂的,即 (b) 组中的人无法访问 autoconf、automake 等。

使用 autoconf 时,人们通常将 configure.ac 文件(autoconf 的输入)签入源代码控制,但不签入 autoconf 的输出,configure 脚本(某些项目确实签入 configure 脚本当然:这取决于你)。

在使用automake时,人们一般会签入Makefile.am文件(automake的输入)但不签入automake的输出:Makefile.in

configure 脚本基本上会在您的系统中查看软件包可能需要或可能不需要的各种可选元素,在哪里可以找到它们等。一旦找到这些信息,它就可以使用它来转换各种 XXX.in文件(通常但不仅限于 Makefile.in)转换为 XXX 文件(例如 Makefile)。

所以步骤通常是这样的:写configure.acMakefile.am并签入。要从源代码控制签出构建项目,运行autoconf从configure.ac生成configure。运行 automake 从Makefile.am 生成Makefile.in。运行 configure 以从 Makefile.in 生成 Makefile。运行 make 来构建产品。

当您想要发布源代码时(如果您正在开发一个发布源代码的开源产品)您运行 autoconf 和 automake,然后将源代码与 configureMakefile.in 文件捆绑在一起,这样构建您的源代码版本的人只需要 make 和编译器,而不需要任何自动工具。

因为运行 autoconf 和 automake(以及 libtool,如果你使用它)的顺序可能很棘手,所以有一些脚本,如 autogen.sh 和 autoreconf 等,它们被检入到源代码控制中,以供开发人员从源代码​​控制构建使用,但是从源代码发布 tar 文件等构建的人不需要/使用这些。

Autoconf 和 automake 经常一起使用,但如果你想编写自己的 Makefile.in,你可以不使用 automake 使用 autoconf。

【讨论】:

【参考方案2】:

对于这个错误:

config.status: error: cannot find input file: `somedir/Makefile.in'

在makefile.am中configure.ac所在的目录下添加一行子目录somedir

SUBDIRS = somedir

somedir 中放置一个带有所有描述的Makefile.am。然后运行automaker --add-missing

可以在 7.1 递归子目录 automake 手册中找到更好的描述。 https://www.gnu.org/software/automake/manual/automake.html

【讨论】:

以上是关于对配置脚本和 Makefile.in 感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对使用 SSL 支持配置 Apache 感到茫然和困惑

iTunes 连接:对 Bundle ID 感到困惑

对java属性文件位置感到困惑

对服务器发送的事件感到困惑

对 robocopy 的工作方式感到困惑

对如何在 Blazor App 中从 B2C 获取访问令牌感到困惑