对configure脚本和Makefile.in感到困惑

时间:2014-11-09 19:23:18

标签: makefile configure autoconf

我目前正在学习如何使用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

好的。但作为终身用户,我终生下载了无数的tarball,我从不必须使用autogen.sh脚本。我所做的只是解压缩tarball,并执行通常的configure / make / make install / make clean例程。

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

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

2 个答案:

答案 0 :(得分:34)

为了真正理解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脚本基本上会查看您的系统中包含可能需要或可能不需要的各种可选元素,可以找到它们的位置等。一旦找到此信息,它就可以使用它来转换各种{ {1}}文件(通常,但不仅仅是XXX.in)到Makefile.in个文件中(例如,XXX)。

所以这些步骤通常如下:写Makefileconfigure.ac并检入它们。要从源代码控制检出中构建项目,请运行autoconf从{{生成Makefile.am 1}}。运行automake以从configure生成configure.ac。运行configure以从Makefile.in生成Makefile.am。运行make来构建产品。

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

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

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

答案 1 :(得分:1)

对于此错误:

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 Recursing子目录自动制作手册中可以找到更好的描述。 https://www.gnu.org/software/automake/manual/automake.html