Make-Datei zu archivieren / link zusammen automatisch generierten Quelldateien
-
06-07-2019 - |
Frage
Grundsätzlich habe ich eine Datei ‚blah.txt‘. Dass Dateien, die von einem ‚Compiler‘ und analysiert werden wird es N Ausgabe .c-Dateien erzeugen. Ich mag eine Make-Datei, die die c-Dateien aus dieser TXT-Datei generiert dann alle von ihnen kompilieren und zu archivieren in einem libmystuff.a
ich von so etwas wie dieses tought:
all: dogen libmystuff.a
dogen: source.txt
mycompiler $^
libmystuff.a: $(addsuffix .o, $(shell ls *.c))
$(AR) rcs $@ $^
.PHONY: dogen
Aber offensichtlich ist das nicht funktionieren, weil die Abhängigkeiten zu Beginn ausgewertet und an diesem Punkt der * .c hat ergeben nur noch nichts, da sie nicht existieren.
Hat jemand sehen, wie das erreichen (ohne Auflistung aller generierten * .c explizit)?
Lösung
Pavel Shved ist rechts (*), müssen Sie erneut ausführen machen. Hier ist ein Trick, den ich bin ziemlich stolz. Es wird Abhängigkeiten von Objekten verarbeitet, die noch nicht existieren, und wird nicht unnötig laufen.
SOURCES = $(wildcard *.c) OBJECTS = $(SOURCES:.c=.o) all: libmystuff.a ifeq ($(MAKELEVEL),0) libmystuff.a: source.txt mycompiler $^ @$(MAKE) -s $@ else libmystuff.a: $(OBJECTS) $(AR) rcs $@ $^ endif
(*) Mein alter Erzfeind, treffen wir uns wieder.
EDIT:
Wenn einige andere Anrufe tätigen das machen ... hatte ich nicht gedacht. Aber ich denke, das es lösen:
SOURCES = $(wildcard *.c) OBJECTS = $(SOURCES:.c=.o) all: libmystuff.a libmystuff.a: source.txt mycompiler $^ @$(MAKE) -s phonyLib .PHONY: phonyLib phonyLib: $(OBJECTS) $(AR) rcs libmystuff.a $^
(Ja, ich weiß, wenn Sie einen Drang verspüren, eine Datei namens „phonyLib“ zu bauen, Sie werden es nicht tun können, um sich mit diesem Make-Datei, aber wir wollen nicht pervers sein.)
Andere Tipps
Mit Wache „Makefile“ make zwang las wieder Make-Datei zu und korrekte Liste bei *.c
ersetzen:
include sources-sentry
sources-sentry: source.txt
mycompiler $^
touch $@
libmystuff.a: $(addsuffix .o, $(shell ls *.c))
$(AR) rcs $@ $^
include
Direktive wird benutzt, andere Makefiles enthalten (wie C des #include
). Es hat eine schöne Besonderheit, dass, wenn Make-Datei enthält es ein Ziel an sich ist, make
Programm zuerst als Ziel betrachtet und versucht, zu aktualisieren. Wenn es nicht up-to-date ist, machen die Befehle benötigt ruft sie zu aktualisieren und dann Wieder liest Make-Datei, und ersetzen Sie alle Variablen wieder .
Wenn also source.txt seit dem letzten Mal geändert Sie es verarbeitet (die Zeit als Zeitstempel von Quellen-Wachtposten aufgezeichneten Datei ), werden die Quellen aktualisiert und erneut aufgerufen wird machen , die *.c
auf das von c-Dateien eingestellt Updates ersetzt werden.
Wenn Sie Ihre .c Dateien nur durch die TXT produziert werden, dann können Sie die libmystuff.a hängen von der txt lassen, und bewerten die $ (shell ls * .c) in der Regel Körper statt.