[英]Confused about configure script and Makefile.in
我目前正在学习如何使用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
的开发人员,除非您先运行autogen.sh
否则configure
实际上不会运行。 所以我觉得这很令人困惑,因为我认为最终用户不应该运行autogen.sh
。
那么为什么我必须先运行autogen.sh
- 为了让配置脚本找到Makefile.in
? 为什么配置脚本不简单地生成它?
为了真正理解 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.ac
和Makefile.am
,并检查他们要建立从源代码控制检出的项目,以使autoconf去生成。 configure
从configure.ac
。 运行Automake生成Makefile.in
从Makefile.am
。 运行configure生成Makefile
从Makefile.in
。 运行 make 来构建产品。
当你想发布源代码时(如果你正在开发一个发布源代码的开源产品),你运行 autoconf 和 automake,然后将源代码与configure
和Makefile.in
文件捆绑在一起,以便人们构建你的源代码发布只需要 make 和编译器,不需要任何自动工具。
因为运行 autoconf 和 automake(和 libtool,如果你使用它)的顺序可能很棘手,所以有像 autogen.sh 和 autoreconf 等脚本,它们被签入源代码管理,供开发人员从源代码管理中使用,但这些是从源代码发布 tar 文件等构建的人不需要/使用。
Autoconf 和 automake 通常一起使用,但如果您想编写自己的Makefile.in
,则可以使用 autoconf 而不使用 automake。
对于这个错误:
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 subdirectories automake manual 中找到。 https://www.gnu.org/software/automake/manual/automake.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.