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

问题描述 投票:36回答:2

我目前正在学习如何使用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包,所以我never不得不使用autogen.sh脚本。我所做的只是解压缩tarball,并执行通常的configure / make / make install / make clean例程。

但是作为现在成为[[using autoconf的开发人员,似乎configure实际上不会运行,除非您先运行autogen.sh。因此,我觉得这很令人困惑,因为我认为最终用户不必运行autogen.sh

所以为什么我必须首先运行autogen.sh-为了使配置脚本找到Makefile.in?为什么配置脚本不能简单地生成它?
makefile configure autoconf
2个回答
54
投票
为了真正了解自动工具实用程序,您必须记住它们的来源:它们来自开源世界,那里有(a)个开发人员正在源代码存储库(CVS,Git等)中工作,并且创建包含源代码的tar文件或类似文件,并将该tar文件放置在下载站点上,以及(b)最终用户,他们正在获取源代码tar文件,在其系统上编译该源代码并使用生成的二进制文件。显然,(a)组中的人员也可以编译代码并使用生成的二进制文件,但是(b)组中的人员通常并不需要或不需要(a)组中的所有开发工具。

因此,工具的使用适用于此拆分,在该拆分中,(b)组中的人无权使用autoconf,automake等。

[使用autoconf时,人们通常将configure.ac文件(输入到autoconf中)检入到源代码管理中,但不检入autoconf(configure脚本)的输出中(某些项目确实检入了[...]当然:这取决于您)。

[使用自动制作时,人们通常检入configure文件(自动制作的输入),但不检入自动制作的输出:Makefile.am

Makefile.in脚本基本上会在系统中查找程序包可能需要或可能不需要的各种可选元素,可以在何处找到的等等。一旦找到此信息,它就可以使用它来转换各种configure文件(通常(但非唯一)XXX.in)放入Makefile.in文件(例如XXX)。

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

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

因为运行autoconf和automake(如果使用libtool,则使用libtool)的顺序可能会很棘手,有一些脚本(例如autogen.sh和autoreconf等)被检入源代码管理中,以供从源代码管理构建的开发人员使用,通过源代码发布tar文件等进行构建的人员不需要/使用这些。

Autoconf和automake通常一起使用,但是如果要编写自己的Makefile.in,则可以不使用automake而使用autoconf。


0
投票
为此:

Makefile.in

在configure.ac位于Makefile.am中的目录中,在子目录config.status: error: cannot find input file: `somedir/Makefile.in'
中添加一行

somedir

SUBDIRS = somedir
内放有所有说明的somedir。然后运行Makefile.am

7.1递归子目录自动制作手册中提供了更好的描述。automaker --add-missing

© www.soinside.com 2019 - 2024. All rights reserved.