2010-07-22 2 views
5

Die Idee ist, dass ein Projekt eine einzige Datei mit __DATE__ und __TIME__ darin hat. Es könnte cool sein, es neu kompilieren zu lassen, ohne sein Änderungsdatum explizit zu ändern.Wie können Sie die Neukompilierung einer einzelnen Datei in einem Makefile erzwingen?

edit: $ (Shell-Touch -c ..) könnte eine gute Lösung sein, wenn nur ungeschickt.

+1

Dies könnte die falsche Lösung für Ihr Problem sein. Einige Versionierungs-Tools können Einzelheiten der Version Ihrer Quelle ausgeben. Ein bisschen Skript-Hacker in Ihrem Build-Prozess und diese Details werden in Ihren Code eingebaut. Es spielt keine Rolle, ob Sie die Quelle auschecken und in zehn Jahren neu erstellen müssen - Ihre Versionsinformationen werden weiterhin die Details für dieses Tag wiedergeben. – Steve314

+0

@ Steve314: eher will er eine über Box, die die Build-Nummer und Build-Datum erwähnt. –

+0

@Ken - wenn ja, ist der Versions-Tool-Trick der richtige Weg. Es gibt keinen Grund, warum der Skript-Hacker die Versionsdetails nicht in den Code (oder die Ressourcendatei) für ein About-Feld einfügen kann, und das Abrufen einer Build-Nummer in eine About-Box erfordert wahrscheinlich eine leicht vergessene manuelle Intervention. Weder make, der Compiler noch das Dateisystem kennen Ihre Build-Nummer. – Steve314

Antwort

8

Der Standard Idiom ist die Objektdatei (nicht die Quelldatei!) Haben, hängt von einem Ziel, das nicht existiert und hat keine Regeln oder Abhängigkeiten (dieses Ziel wird üblicherweise FORCE genannt), wie diese

always-recompile.o: FORCE 
FORCE: 

Dies wird jedoch brechen, wenn eine Datei namens "FORCE" irgendwie erstellt wird. Mit GNU machen Sie stattdessen die spezielle Ziel .PHONY verwenden können, die diese Einschränkung nicht, aber Sie erfordert eine explizite Vorschrift haben die Datei neu zu erstellen:

always-recompile.o: 
     $(CC) $(CFLAGS) -c -o always-recompile.o always-recompile.c 

.PHONY: always-recompile.o 

http://www.gnu.org/software/make/manual/html_node/Phony-Targets.html Siehe für weitere Details.

+1

Sie sollten ".PHONY: FORCE" ausführen, da always-rekompile.o kein falsches Ziel ist. Mit ".PHONY: FORCE" sollte es nicht wichtig sein, wenn eine Datei namens FORCE erstellt wird. – camh

+0

Funktioniert das tatsächlich? Die GNU machen manuelle Klänge wie falsche Ziele funktionieren nicht als Abhängigkeiten von realen Zielen. – zwol

1

Eine Möglichkeit besteht darin, die entsprechende Objektdatei (.o oder .obj) zu löschen, bevor make ausgeführt wird. Dies wird eine Neukompilierung (und Neuverknüpfung) auslösen, ohne das Änderungsdatum der Quelldatei zu ändern.

Verwandte Themen