Celem Autotools jest dostarczenie tajemniczego języka opartego na makrach M4, który ostatecznie kompiluje się do skryptu powłoki o nazwie ./configure
. Możesz wysłać ten skompilowany skrypt powłoki z kodem źródłowym, który powinien zrobić wszystko, aby wykryć środowisko i przygotować program do zbudowania. Narzędzia automatyczne powinny być wymagane tylko przez kogoś, kto chce poprawić testy i odświeżyć skrypt powłoki.
To pokonuje sens Autotools, jeśli GNU This i GNU That muszą być zainstalowane w systemie, aby działały. Pierwotnie został wymyślony, aby uprościć przenoszenie programów na różne systemy uniksowe, na które nie można było liczyć, że coś na nich będzie. Nawet konstrukcje używane przez wygenerowany kod powłoki w programie ./configure
musiały być bardzo starannie dobrane, aby mieć pewność, że będą działać na każdej uszkodzonej starej powłoce prawie wszędzie.
Problem, na który się natkniesz, jest spowodowany błędnymi krokami Makefile wymyślonymi przez ludzi, którzy po prostu nie rozumieją, do czego służy Autotools i jaką rolę odgrywa ostateczny ./configure
skrypt.
Aby obejść ten problem, możesz przejść do pliku Makefile i wprowadzić pewne zmiany, aby usunąć to z drogi. Jako przykład buduję głowę Git GNU Awk i napotykam ten sam problem. Makefile.in
Jednak zastosowałem tę poprawkę do i mogę z powodzeniem 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@
Zasadniczo zmieniłem rzeczy tak, że nieszkodliwe true
polecenie powłoki zostało zastąpione przez wszystkie programy Auto-stuff.
Rzeczywiste kroki budowania Gawk nie wymagają elementów Auto! Dotyczy to tylko niektórych reguł, które są wywoływane, jeśli części elementów automatycznych uległy zmianie i wymagają ponownego przetworzenia. Jednak Makefile jest tak skonstruowany, że zawodzi, jeśli nie ma narzędzi.
Przed powyższą łatką:
$ ./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
Po patchu:
$ ./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.
[...]
No to jedziemy. Jak widać, CDPATH=
wiersze poleceń są tam, gdzie wywoływano funkcję Auto-stuff, gdzie widzisz true
polecenia. Zgłaszają pomyślne zakończenie, więc po prostu wypada przez te śmieci, aby zrobić cholerną kompilację, która jest doskonale skonfigurowana.
Zrobiłem to, make gawk
ponieważ są budowane podkatalogi, które nie działają; tę sztuczkę trzeba powtórzyć dla odpowiednich plików Makefile.
Jeśli napotkasz tego typu rzeczy z nieskazitelnym, oficjalnym plikiem tar programu od jego twórców, to narzekaj. Powinien po prostu rozpakować ./configure
i make
bez konieczności łatania czegokolwiek lub instalowania jakichkolwiek materiałów Automake lub Autoconf.
Idealnie byłoby, gdyby pociągnięcie głowy Gita również zachowywało się w ten sposób.