我目前正在学习如何使用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脚本不直接生成它呢?
autoreconf
脚本,它可以执行与autogen.sh
相同的操作,并且功能更强大。至于为什么需要运行它,是因为在somedir
子目录中是否有一个Makefile.am
文件供Automake查找,以生成somedir/Makefile.in
文件? - user539810autoreg.sh
的脚本,则运行它。如果没有,则运行autoupdate && autoreconf -f -i
命令。两者都应该生成一个configure
文件,供您运行。很遗憾,Autotools手册中没有清楚说明这一点,但这是Autotools的惯常做法。顺便说一句,我相信autogen.sh
是autoreconf -f -i
的包装脚本(也许带有详细选项)。 - jww