2013-03-14 6 views
5

Ich verwende das Flag -MM in GCC, um Makefile-Abhängigkeiten für Objekte zu generieren. Die Make-Datei sieht kurz wie folgt aus:GCC-Makefile-Abhängigkeitserzeugungspfad

-include autodep 
... 
$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) > autodep 

Die Quellen der in Ordner src befinden. Allerdings wird die autodep Datei des Objekt Ziele ohne ihren relativen Pfad enthält:

foo.o: src/foo.c src/foo.h 
bar.o: src/bar.c src/bar.h src/baz.h 

Wie soll ich sie in diesen drehen:

src/foo.o: src/foo.c src/foo.h 
src/bar.o: src/bar.c src/bar.h src/baz.h 

?

Ich versuchte mit der -MT Flag, aber es scheint Objekt Ziele insgesamt zu verwerfen.

Antwort

6

-MT legt den gesamten Zielnamen fest. Wenn Sie ein anderes Ziel für jede Quelle wollen, müssen Sie ein anderes -MT Argument für jede Quelle, die mehr Aufrufe des Compilers und eine foreach-Schleife bedeutet:

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    rm autodep 
    $(foreach SRC,$(SOURCES),$(CC) -MM -MT $(SRC:.c=.o) $(SRC) >> autodep;) 

Alternativ können Sie sed verwenden, um die Ausgabe zu massieren

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) | sed 's|^|src/|' > autodep 

noch einfacher ist es, die Abhängigkeiten für jede Quelldatei in eine eigene .d-Datei zu setzen und verwenden Sie die -MMD Flag, das zu erzeugen, wenn Sie kompilieren die Quelldatei:

-include $(SOURCES:.c=.d) 
CFLAGS += -MMD 

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
+0

Danke! Ich benutze die 'foreach'-Schleife, und der Inhalt von 'autodep' ist jetzt korrekt. Aber es scheint nicht zu funktionieren. Mit dem Beispiel aus der Frage, wenn ich 'src/bar.h' ändere und' make' ausführe, bekomme ich 'make: \' src/foo.o 'auf dem neuesten Stand. –

+0

Es wurde gelöst, indem '-include' hinter' all: 'gestellt wurde. –