Obecnie uczę się korzystać z narzędzia toolchain autoconf
/automake
. Wydaje mi się, że rozumiem tutaj przepływ pracy - w zasadzie masz skrypt configure.ac
, który generuje plik wykonywalny configure
. Wygenerowany skrypt configure
jest następnie wykonywany przez użytkownika końcowego w celu wygenerowania Makefile
s, aby można było zbudować/zainstalować program.Mylić o skrypcie konfiguracyjnym i Makefile.in
Więc instalacja dla typowego użytkownika końcowego jest zasadniczo:
./configure
make
make install
make clean
Dobra, teraz tu, gdzie jestem zdezorientowany:
Jako deweloper, zauważyłem, że auto generowane skonfigurować skrypt czasami nie będzie działać i będzie Błąd:
config.status: error: cannot find input file: `somedir/Makefile.in'
To mnie niepokoi, bo myślałem, że skrypt konfiguracyjny ma generować the Makefile.in
. Więc szukając odpowiedzi, odkryłem, że można to naprawić za pomocą skryptu autogen.sh
, który zasadniczo "resetuje" stan środowiska autoconf
. Typowy skrypt autogen.sh
może wyglądać następująco:
aclocal \
&& automake --add-missing \
&& autoconf
Okay w porządku. Ale jako użytkownik końcowy, który pobierał niezliczone ilości archiwów przez całe moje życie, nigdy nie miałemużywać skryptu . Wszystko, co zrobiłem, to rozpakowanie tarballa i wykonanie zwykłej procedury configure/make/make install/make clean.
Ale jako deweloper, kto jest teraz użyciuautoconf
wydaje się, że configure
faktycznie nie działać, jeśli nie uruchomić autogen.sh
pierwszy. Dlatego uważam, że jest to bardzo mylące, ponieważ uważałem, że użytkownik końcowy nie powinien uruchamiać autogen.sh
.
Po pierwsze, muszę najpierw uruchomić autogen.sh
- aby skrypt konfiguracyjny mógł znaleźć Makefile.in
? Dlaczego skrypt konfiguracyjny po prostu go nie generuje?
GNU Autoconf (lub może GNU Automake) zawiera wygodny skrypt 'autoreconf', który robi to samo co' autogen.sh' i więcej. Jeśli chodzi o to, dlaczego musisz go uruchomić, czy masz 'Makefile.am' w podkatalogu' somedir' dla Automake, aby znaleźć 'somedir/Makefile.am' i wygenerować z niego' somedir/Makefile.in'? –