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)?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top