我目前正在学习如何使用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
?为什么配置脚本不能简单地生成它? 因此,工具的使用适用于此拆分,在该拆分中,(b)组中的人无权使用autoconf,automake等。
[使用autoconf时,人们通常将configure.ac
文件(输入到autoconf中)检入到源代码管理中,但不检入autoconf(configure
脚本)的输出中(某些项目确实检入了[...]当然:这取决于您)。
[使用自动制作时,人们通常检入configure
文件(自动制作的输入),但不检入自动制作的输出:Makefile.am
。
Makefile.in
脚本基本上会在系统中查找程序包可能需要或可能不需要的各种可选元素,可以在何处找到的等等。一旦找到此信息,它就可以使用它来转换各种configure
文件(通常(但非唯一)XXX.in
)放入Makefile.in
文件(例如XXX
)。
因此步骤通常是这样的:写入Makefile
和configure.ac
并签入。要通过源代码控制检出构建项目,请运行autoconf从Makefile.am
生成configure
。运行automake从configure.ac
生成Makefile.in
。运行configure从Makefile.am
生成Makefile
。运行make来构建产品。
[当您要发布源代码时(如果您正在开发发布源代码的开源产品),请运行autoconf和automake,然后将源代码与Makefile.in
和configure
文件捆绑在一起,因此那些构建您的源代码版本的人只需要make和一个编译器,不需要任何自动工具。
因为运行autoconf和automake(如果使用libtool,则使用libtool)的顺序可能会很棘手,有一些脚本(例如autogen.sh和autoreconf等)被检入源代码管理中,以供从源代码管理构建的开发人员使用,通过源代码发布tar文件等进行构建的人员不需要/使用这些。
Autoconf和automake通常一起使用,但是如果要编写自己的Makefile.in
,则可以不使用automake而使用autoconf。
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