困惑于配置脚本和Makefile.in文件

56

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

因此,典型终端用户的安装步骤基本上是:

./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

好的,没问题。但作为一个下载过无数tar包的终端用户,我从来没有使用过autogen.sh脚本。我只是解压tar包,然后按照通常的configure/make/make install/make clean流程操作。

但作为一个现在正在使用autoconf的开发人员,似乎除非你首先运行autogen.sh,否则configure实际上不会运行。所以我觉得这很令人困惑,因为我原以为终端用户不需要运行autogen.sh

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


3
GNU Autoconf(或者也许是GNU Automake)附带有一个方便的autoreconf脚本,它可以执行与autogen.sh相同的操作,并且功能更强大。至于为什么需要运行它,是因为在somedir子目录中是否有一个Makefile.am文件供Automake查找,以生成somedir/Makefile.in文件? - user539810
如果有一个名为autoreg.sh的脚本,则运行它。如果没有,则运行autoupdate && autoreconf -f -i命令。两者都应该生成一个configure文件,供您运行。很遗憾,Autotools手册中没有清楚说明这一点,但这是Autotools的惯常做法。顺便说一句,我相信autogen.shautoreconf -f -i的包装脚本(也许带有详细选项)。 - jww
2个回答

89
为了真正理解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和编译器即可,不需要任何autotools。

由于运行autoconf和automake(以及如果使用了libtool则是libtool)的顺序可能比较棘手,因此有像autogen.sh和autoreconf等脚本被加入到版本控制中供从源代码控制构建的开发人员使用,但这些对于从源代码发布tar文件等构建的人来说并不需要/使用。

Autoconf和automake经常一起使用,但您也可以单独使用Autoconf,如果您想编写自己的Makefile.in文件。


根据你的描述,在dist tarball中不需要 Makefile.am。我刚试图从其 dist 构建程序,我 rm Makefile.am 但是 make 退出,并出现错误 make: *** No rule to make target 'Makefile.am', needed by 'Makefile.in'. Stop. - Rick
我不知道你从哪里得到这个想法,认为它是不必要的。Autoconf是为自由软件包创建的,自由软件包的dist tarball应该包含所有需要修改和重建的文件,包括Makefile.am。如果用户想要修改代码,他们将安装autotools,进行更改并重新构建,因此他们需要dist tarball中的所有这些额外文件。目标是确保他们不必安装autotools,如果他们不想修改软件。 - MadScientist

3

对于这个错误:

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

在configure.ac所在的目录中,在Makefile.am文件中添加一行代码:somedir,作为子目录。
SUBDIRS = somedir

somedir 目录下放置一个包含所有描述的 Makefile.am 文件,然后运行 automaker --add-missing 命令。更详细的描述请参见 7.1 Recursing subdirectories automake manual:https://www.gnu.org/software/automake/manual/automake.html

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