2009-11-22 12 views
5

Ich möchte eine Makefile.am Datei erstellen, die eine Header-Datei in einer xxx.c Datei erwähnt generiert.Header-Abhängigkeit in automake

Lassen Sie uns sagen, dass xxx.c enthält:

#include <version.h> 
... 

und dass ich eine Regel haben es am Ende Makefile.am zu erstellen:

version.h: 
     echo '#define VERSION "'`hg id`'"' > version.h.tmp 
     cmp version.h.tmp version.h || mv version.h.tmp version.h 

Was muss ich die xxx.c Kompilation machen ändern abhängig von version.h? Ich habe versucht nodist_progname_SOURCES=version.h, aber das scheint es nicht zu tun.

Antwort

10
BUILT_SOURCES = version.h 

Alle als BUILT_SOURCES genannten Dateien werden vor jeder der normalen Kompilierung laufen Regeln gebaut werden.

Dies wird jedoch ein kleines Problem schaffen: Wie version.h wird bei jedem Aufruf make wieder aufgebaut werden müssen, die Neuübersetzung jeder foo.c Datei, die #include s version.h wieder auf jedem make Lauf ausgelöst werden. Wir würden es vorziehen, wenn die Neukompilierung nur dann stattfindet, wenn sich tatsächlich etwas geändert hat.

Um dieses Problem zu umgehen, verwenden Sie eine BUILT_SOURCES Abhängigkeit von einer Stempeldatei, die jedes Mal "erstellt" wird (es wird nie tatsächlich erstellt, so dass die Erstellungsregel jedes Mal ausgeführt wird). Die Erstellungsregel für diese Stempeldatei erstellt eine neue version.h Datei als version.h.tmp und kopiert nur version.h.tmp zu version.h, wenn version.h.tmp sich tatsächlich von version.h unterscheidet (genau wie Ihre version.h Regel). Also, wenn nichts in version.h, bleibt sein Zeitstempel (mtime) gleich, und kein Build von Objekten in Abhängigkeit von version.h ausgelöst hat sich geändert:

Diese Lösung wird tun, was Sie fragen, für
BUILT_SOURCES = version.stamp 

version.stamp: 
     echo '#define VERSION "'`hg id`'"' > version.h.tmp 
     cmp version.h.tmp version.h || mv version.h.tmp version.h 

.

Leider aber wird es ein kleines Problem sein, wenn man von einem dist-Tarball bauen: Dann hg id werden Ihnen falsche Informationen geben, und es ist wahrscheinlich keine version.h in Ihrem Tarball, so dass die Build fehlschlagen oder enthalten falsche Versionsinformationen .

Ich habe dieses Problem für ein xf86-video-radeonhd Projekt gelöst, das git verwendet. Die in dieser Lösung generierte Datei git-version.h enthält mehr Versionsinformationen als nur eine einzelne Versionsnummer. Sie können diese siehe Update-only-if-verschiedene Lösung von mir am Ende git_version.sh und den BUILT_SOURCES hookup (einschließlich der Behandlung der hoffentlich all out-of-Source-Tree und von-dist-Tarball build Fälle) in RadeonHD.am wenn Sie interessiert sind.

+0

Das funktioniert gut, mit einer Qualifikation. Aus dem Automake-Handbuch: "Es mag wichtig sein zu betonen, dass BUILT_SOURCES nur durch" make all "," make check "und" make install "erfüllt wird. Das bedeutet, dass Sie kein spezifisches Ziel (zB make foo) erstellen können ein sauberer Baum, wenn es auf eine gebaute Quelle ankommt. " Trotzdem ist es die beste Lösung, die ich kenne. – phs

+0

Ich denke, wenn jemand weiß, dass er "make foo" ausführen soll, kann man vernünftigerweise davon ausgehen, dass er weiß, was er erstellt, und ob er daher manuell sicherstellen muss, dass die BUILT_SOURCES neu erstellt werden. – ndim

+0

Sie müssen diese über den Operator '' && '' in eine einzelne Zeile setzen, sonst machen Sie gerne Ihre Version.h Konstruktion parallelisieren. –

Verwandte Themen