2015-04-20 9 views
5

Ich arbeite derzeit an einem Linux-Projekt mit Autotools. Der Code wird in SCM (Perforce) übergeben und wir haben das Konfigurations-Skript, Makefile.am, Makefile.in - die übliche Autotools-Musterdatei. Kürzlich hat jemand Makefile.am geändert, aber vergessen Makefile.in zu regenerieren; wenn ich zu bauen versucht, habe ich diesen Fehler:automake version (am__api_version) in configure script fest programmiert

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 

Ich sehe die auto Version wird im Configure-Skript fest einprogrammiert (und scheint von aclocal.m4 zu kommen):

am__api_version='1.11' 

Also ich denke, Ich brauche automake-1.11 (nicht 1.10, nicht etwas neueres), um die Datei Makefile.in neu zu erstellen.

Warum ist das? Warum sollten wir an eine bestimmte Automake-Version gebunden sein? Wir bauen hauptsächlich auf Ubuntu 14.04 auf, wobei 1.14 die Standardversion ist. Gibt es eine Möglichkeit zu sagen, das Build-System einfach zu verwenden, welche Version von Automake installiert ist? Oder ist es sicher, vielleicht die Definition von am__api_version von aclocal.m4 zu entfernen?

+0

Ich würde definieren „die üblichen Autotools vorformulierten“ zu sein 'configure.ac' und' Makefile.am' .Es ist der Zweck dieser beiden Dateien, das 'configure'-Skript, das' Makefile.in', das 'Makefile' und verschiedene andere Artefakte zu erzeugen, die den Build unterstützen. Generierte Dateien müssen nicht zu einer Quellcodeverwaltung hinzugefügt werden (und sollten auch nicht). – rubicks

Antwort

0

Die wichtige Frage ist, warum jemand reparieren würde am__api_versions. Die wahrscheinlichste Antwort lautet: Weil dazu neigt, die Argumente des Makros zu ändern oder sogar Makros der vorherigen Version zu entfernen. In jedem Release-Ankündigung von automake gibt es einen Abschnitt

WARNING: Future backward-incompatibilities!

und eine andere namens

Obsolete features removed

Sie genannt Veröffentlichungen verweisen 1.12, 1.13, 1.14

So ist die configure.ac oder Makefile.am Macht einige Makros enthalten, die in späteren Versionen veraltet sind. Wenn Sie dieses Problem haben, haben Sie zwei Möglichkeiten. Finden Sie heraus, welche Funktion die veraltete ersetzt hat, oder bleiben Sie bei einer Version von automake. Die meisten Entwickler glauben nicht, dass autotools Dateien Teil des Projektquellcodes sind. Sie möchten nur die Arbeitsversion laufen lassen und sich an die aktuelle am Version halten.

Beachten Sie, dass alle Distributionen ältere Versionen von automake10 unterstützen. In ubuntu können Sie finden:

$ 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 

Was bedeutet, dass Sie die gewünschte Version von automake installieren können.

So könnten Sie die Zeile am__api_version='1.11' entfernen und herausfinden, welches Makro veraltet ist. Dann müssen Sie entscheiden, welcher der beiden oben genannten Lösungen Sie folgen werden.

+0

Das Snippet, in dem die Version angeheftet wird, wird von automake selbst erzeugt - es erzeugt Dateien, die nur teilweise regeneriert werden können (z. B. makefile.in, aber nicht aclocal.m4 usw.), mit derselben Version von sich selbst. Zumindest ist das mein Verständnis. Ich könnte konfigurieren, aber wenn es jemals neu erstellt würde es überschrieben werden. – fencekicker

+0

@fencekicker Entschuldigung für mein Missverständnis. In der Frage wurde angedeutet, dass die 'am'-Version vom Benutzer festgelegt wurde. – ztik

1

Das Problem ist, dass Sie versuchen, mit anderen Version von Autotools neu zu erstellen. Es würde zu einer Versionskonflikt führen, da aclocal.m4 mit einer anderen Version erstellt wurde und es verwendet wird, um die verbleibenden Dateien zu generieren.

Statt nur Makefile.in neu zu erstellen, versuchen auch aclocal.m4 neu zu erstellen und den restlichen Autotools generierten Dateien:

autoreconf --force --install 
+0

Also ich denke, die Wahl ist zwischen: - Speichern Sie keine generierten Dateien in Perforce und immer 'autoreconf-fvi' - speichern Sie Aclocal.m4, konfigurieren, Makefile.in in Perforce, aber dann brauchen Sie das genaue automake Version, die sie generiert, wann immer Sie eine Eingabedatei modifizieren? Natürlich gibt es immer Option 3 - Autotools abzweigen :). – fencekicker

+0

Ihr Problem ist: "jemand hat Makefile.am geändert, aber vergessen Makefile.in zu regenerieren". Sonst sollte alles wie vorgesehen funktionieren :) – baf

+0

@fencekicker Wenn Sie aclocal.m4, configure, makefile.in speichern, das von derselben Version von autotools erzeugt wird, müssen Sie sich nicht um automake version kümmern – baf