2015-04-20 27 views
5

Obecnie pracuję nad projektem linuksowym z wykorzystaniem autotools. Kod jest przesyłany w SCM (Perforce), a my mamy skrypt configure, Makefile.am, Makefile.in - zwykły zestaw znaków automatycznego autotools. Ostatnio ktoś zmienił Makefile.am, ale zapomniał zregenerować Makefile.in; kiedy starałem się budować, mam ten błąd:Wersja automake (am__api_version) zakodowana na stałe w skrypcie konfiguracyjnym

WARNING: `automake-1.11' is missing on your system. You should only need it if 
     you modified `Makefile.am', `acinclude.m4' or `configure.ac'. 
     You might want to install the `Automake' and `Perl' packages. 
     Grab them from any GNU archive site. 
cd . && /bin/bash ./config.status Makefile depfiles 

widzę wersja automake jest ustalony w skrypcie configure (i wydaje się pochodzić z aclocal.m4):

am__api_version='1.11' 

Więc myślę Potrzebuję automake-1.11 (nie 1.10, nie nowszego) do regeneracji pliku Makefile.in.

Dlaczego tak jest? Dlaczego powinniśmy być przywiązani do konkretnej wersji automake? W większości budujemy na Ubuntu 14.04, gdzie 1.14 jest zainstalowana domyślnie. Czy istnieje sposób poinformowania systemu kompilacji, aby po prostu używał dowolnej wersji programu automake? Czy może bezpiecznie usunąć definicję am__api_version z aclocal.m4?

+0

chciałbym zdefiniować "zwykły" Autotools boilerplate być 'configure.ac' i' Makefile.am' .Celem tych dwóch plików jest wygenerowanie skryptu 'configure',' Makefile.in', 'Makefile' oraz różnych innych artefaktów obsługujących kompilację. Wygenerowane pliki nie muszą (w rzeczy samej nie powinny) zostać dodane do żadnej kontroli źródła. – rubicks

Odpowiedz

0

Ważne pytanie brzmi: dlaczego ktoś miałby naprawić am__api_versions. Najbardziej prawdopodobna odpowiedź brzmi: Ponieważ automake zmierza do zmiany argumentów makra lub nawet do usunięcia całkowicie makr z poprzedniej wersji. W każdym ogłoszeniu uwalnianiu automake znajduje się sekcja o nazwie

WARNING: Future backward-incompatibilities!

i drugi o nazwie

Obsolete features removed

Można odwołać się do wydań 1.12, 1.13, 1.14

Więc potęga configure.ac lub Makefile.am zawierają niektóre makra, które stały się przestarzałe w późniejszych wersjach. Po napotkaniu tego problemu masz dwie możliwości. Dowiedz się, która z funkcji zastąpiła przestarzałą, lub pozostaw jedną wersję: automake. Większość programistów nie uważa, że ​​pliki autotools są częścią kodu źródłowego projektów. Chcą tylko utrzymać działającą wersję i trzymać się aktualnej wersji am.

Należy pamiętać, że wszystkie dystrybucje obsługują starsze wersje automake. W Ubuntu można znaleźć:

$ apt-cache search automake | grep automake 
automake - Tool for generating GNU Standards-compliant Makefiles 
automake1.4 - A tool for generating GNU Standards-compliant Makefiles 
automake1.9 - A tool for generating GNU Standards-compliant Makefiles 
automake1.10 - Tool for generating GNU Standards-compliant Makefiles 
automake1.11 - Tool for generating GNU Standards-compliant Makefiles 

oznacza, że ​​można zainstalować żądany wersję automake.

Można zatem usunąć linię am__api_version='1.11' i sprawdzić, które makro jest przestarzałe. Następnie musisz zdecydować, które z dwóch powyższych rozwiązań będziesz przestrzegać.

+0

Fragment, w którym jest przypięta wersja, jest generowany przez sam program automake - generuje pliki, które można tylko częściowo zregenerować (np. Zregenerować plik Makefile.in, ale nie aclocal.m4 itd.) Z tą samą wersją. Przynajmniej to moje zrozumienie. Mógłbym zmodyfikować configure, ale jeśli kiedykolwiek byłby on zregenerowany, zostałby nadpisany. – fencekicker

+0

@fencekicker przepraszam za moje nieporozumienie. W pytaniu sugerowano, że wersja "jestem" została naprawiona przez użytkownika. – ztik

1

Problem polega na tym, że próbujesz odtworzyć Makefile.in z inną wersją autotools. Doprowadziłoby to do niezgodności wersji, ponieważ aclocal.m4 została zbudowana w innej wersji i służy do generowania pozostałych plików.

Zamiast odtwarzając tylko Makefile.in, starają się również odtworzyć aclocal.m4 i wszystkich pozostałych Autotools wygenerowane pliki:

autoreconf --force --install 
+0

Więc domyślam się, że wybór jest pomiędzy: - nie przechowuj żadnych wygenerowanych plików w Perforce i zawsze uruchamiaj "autoreconf -fvi" - sklep aclocal.m4, configure, Makefile.in w Perforce, ale wtedy potrzebujesz dokładnego automake wersja, która je wygenerowała, gdy modyfikujesz jakiekolwiek pliki wejściowe? Oczywiście zawsze jest opcja 3 - auta napędowe rowu :). – fencekicker

+0

Twój problem: "ktoś zmienił Makefile.am, ale zapomniał zregenerować Makefile.in". W przeciwnym razie wszystko powinno działać tak, jak zostało zaprojektowane :) – baf

+0

@fencekicker Jeśli przechowujesz aclocal.m4, skonfiguruj, Makefile.in wygenerowany przez tę samą wersję autotools, nie musisz się martwić o wersję automake – baf