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.
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
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
Sie müssen diese über den Operator '' && '' in eine einzelne Zeile setzen, sonst machen Sie gerne Ihre Version.h Konstruktion parallelisieren. –