Autotools 的全部意义在于提供一种基于 M4 宏的神秘语言,该语言最终编译为名为 ./configure 的 shell 脚本。您可以将此编译后的 shell 脚本与源代码一起发布,并且该脚本应该做所有事情来检测环境并准备构建程序。只有想要调整测试并刷新 shell 脚本的人才需要使用 Autotools。
如果必须在系统上安装 GNU This 和 GNU That 以使其工作,它就违背了 Autotools 的意义。最初,它的发明是为了简化程序到各种 Unix 系统的移植,不能指望这些系统上有任何东西。即使是 ./configure 中生成的 shell 代码所使用的结构,也必须非常仔细地选择,以确保它们几乎可以在每个损坏的旧 shell 上工作。
您遇到的问题是由于根本不了解 Autotools 的用途以及最终 ./configure 脚本的作用的人发明的一些损坏的 Makefile 步骤。
作为一种解决方法,您可以进入 Makefile 并进行一些更改以解决此问题。例如,我正在构建 GNU Awk 的 Git 头并遇到同样的问题。但是,我将此补丁应用于Makefile.in,并且我可以成功make gawk:
diff --git a/Makefile.in b/Makefile.in
index 5585046..b8b8588 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -312,12 +312,12 @@ distcleancheck_listfiles = find . -type f -print
# Directory for gawk's data files. Automake supplies datadir.
pkgdatadir = $(datadir)/awk
-ACLOCAL = @ACLOCAL@
+ACLOCAL = true
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
+AUTOCONF = true
+AUTOHEADER = true
+AUTOMAKE = true
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
基本上,我改变了一些东西,以便用无害的true shell 命令代替所有的 Auto-stuff 程序。
Gawk 的实际构建步骤不需要 Auto-stuff!它仅涉及在部分 Auto-stuff 已更改并需要重新处理时调用的某些规则。但是,Makefile 的结构是这样的,如果工具不存在,它就会失败。
上述补丁之前:
$ ./configure
[...]
$ make gawk
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /home/kaz/gawk/missing aclocal-1.15 -I m4
/home/kaz/gawk/missing: line 81: aclocal-1.15: command not found
WARNING: 'aclocal-1.15' is missing on your system.
You should only need it if you modified 'acinclude.m4' or
'configure.ac' or m4 files included by 'configure.ac'.
The 'aclocal' program is part of the GNU Automake package:
<http://www.gnu.org/software/automake>
It also requires GNU Autoconf, GNU m4 and Perl in order to run:
<http://www.gnu.org/software/autoconf>
<http://www.gnu.org/software/m4/>
<http://www.perl.org/>
make: *** [aclocal.m4] Error 127
补丁后:
$ ./configure
[...]
$ make gawk
CDPATH="${ZSH_VERSION+.}:" && cd . && true -I m4
CDPATH="${ZSH_VERSION+.}:" && cd . && true
gcc -std=gnu99 -DDEFPATH='".:/usr/local/share/awk"' -DDEFLIBPATH="\"/usr/local/lib/gawk\"" -DSHLIBEXT="\"so"\" -DHAVE_CONFIG_H -DGAWK -DLOCALEDIR='"/usr/local/share/locale"' -I. -g -O2 -DNDEBUG -MT array.o -MD -MP -MF .deps/array.Tpo -c -o array.o array.c
[...]
gcc -std=gnu99 -g -O2 -DNDEBUG -Wl,-export-dynamic -o gawk array.o awkgram.o builtin.o cint_array.o command.o debug.o dfa.o eval.o ext.o field.o floatcomp.o gawkapi.o gawkmisc.o getopt.o getopt1.o int_array.o io.o main.o mpfr.o msg.o node.o profile.o random.o re.o regex.o replace.o str_array.o symbol.o version.o -ldl -lm
$ ./gawk --version
GNU Awk 4.1.60, API: 1.2
Copyright (C) 1989, 1991-2015 Free Software Foundation.
[...]
我们去吧。如您所见,CDPATH= 命令行是调用 Auto-stuff 的位置,您可以在其中看到 true 命令。这些报告成功终止,因此它只是通过那个垃圾来进行该死的构建,这是完美配置的。
我做了make gawk 因为有一些子目录构建失败;必须为各自的 Makefile 重复该技巧。
如果您在使用来自其开发人员的原始官方 tarball 程序时遇到这种情况,请投诉。它应该只是解压缩,./configure 和 make,而无需您修补任何东西或安装任何 Automake 或 Autoconf 材料。
理想情况下,拉动他们的 Git 头也应该是这样。