Der Sinn von Autotools besteht darin, eine arkane M4-Makro-basierte Sprache bereitzustellen, die letztendlich zu einem Shell-Skript namens kompiliert wird ./configure
. Sie können dieses kompilierte Shell-Skript mit dem Quellcode versenden. Dieses Skript sollte alles tun, um die Umgebung zu erkennen und das Programm für die Erstellung vorzubereiten. Autotools sollten nur von jemandem benötigt werden, der die Tests optimieren und das Shell-Skript aktualisieren möchte.
Es besiegt den Punkt von Autotools, wenn GNU This und GNU That auf dem System installiert sein müssen, damit es funktioniert. Ursprünglich wurde es erfunden, um die Portierung von Programmen auf verschiedene Unix-Systeme zu vereinfachen, auf die man sich nicht verlassen konnte. Sogar die Konstrukte, die vom generierten Shell-Code in verwendet wurden, ./configure
mussten sehr sorgfältig ausgewählt werden, um sicherzustellen, dass sie auf jeder kaputten alten Shell fast überall funktionieren.
Das Problem, auf das Sie stoßen, ist auf einige fehlerhafte Makefile-Schritte zurückzuführen, die von Leuten erfunden wurden, die einfach nicht verstehen, wofür Autotools gedacht sind und welche Rolle das endgültige ./configure
Skript spielt.
Um dieses Problem zu umgehen, können Sie in das Makefile gehen und einige Änderungen vornehmen, um dies aus dem Weg zu räumen. Als Beispiel baue ich den Git-Kopf von GNU Awk und stoße auf dasselbe Problem. Ich habe diesen Patch Makefile.in
jedoch angewendet und kann erfolgreich 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@
Grundsätzlich habe ich die Dinge so geändert, dass der harmlose true
Shell-Befehl alle Auto-Stuff-Programme ersetzt.
Die eigentlichen Build-Schritte für Gawk benötigen kein Auto-Zeug! Es ist nur an einigen Regeln beteiligt, die aufgerufen werden, wenn Teile des Auto-Materials geändert wurden und erneut verarbeitet werden müssen. Das Makefile ist jedoch so strukturiert, dass es fehlschlägt, wenn die Tools nicht vorhanden sind.
Vor dem obigen Patch:
$ ./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:
It also requires GNU Autoconf, GNU m4 and Perl in order to run:
<http:
<http:
<http:
make: *** [aclocal.m4] Error 127
Nach dem Patch:
$ ./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.
[...]
Na, bitte. Wie Sie sehen können, CDPATH=
befinden sich in den Befehlszeilen dort, wo das Auto-Zeug aufgerufen wurde, die true
Befehle. Diese melden eine erfolgreiche Beendigung, und so fällt es einfach durch diesen Müll, um den verdammten Build auszuführen, der perfekt konfiguriert ist.
Ich habe make gawk
es getan, weil einige Unterverzeichnisse erstellt werden, die fehlschlagen. Der Trick muss für die jeweiligen Makefiles wiederholt werden.
Wenn Sie auf solche Dinge mit einem makellosen, offiziellen Tarball des Programms von seinen Entwicklern stoßen, dann beschweren Sie sich. Es sollte nur auspacken, ./configure
und make
ohne dass Sie etwas zu flicken oder irgendwelche Automake- oder Autoconf Materialien zu installieren.
Idealerweise sollte sich auch ein Ziehen des Git-Kopfes so verhalten.