2016-08-08 38 views
1

Ich habe eine Make-Datei, die ich schrieb, die ein einfaches Beispiel für die automatische Erkennung darstellt, wenn eine Header-Datei mit .depend von gcc -MM -MF generiert geändert wird.Warum muss ich in dieser Make-Datei nicht die Voraussetzung ".depend" hinzufügen?

Betrachten Sie das folgende Makefile: Wir haben main.c und factorial.h

CC=gcc 
CFLAGS=-c -Wall 
OBJECTS=main.o 
SRCS=main.c 
EXECUTABLE=program 

all: $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(OBJECTS) -o $(EXECUTABLE) 


.depend: $(SRCS) 
    rm -f ./.depend 
    $(CC) $(CFLAGS) -MM $^ -MF ./.depend; 


sinclude .depend 
#main.o: main.c factorial.h 

clean: 
    rm -rf *.o $(EXECUTABLE) .depend 

Dies funktioniert gut, und ich möchte wissen, warum! Der gesunde Menschenverstand ist

$(EXECUTABLE): $(OBJECTS) .depend

zu schreiben, weil wir die Datei .depend ist es überprüfen wollen. Es scheint jedoch, als ob das Auslassen auch funktioniert. Warum? Außerdem würde ich gerne wissen, was include (oder sinclude in diesem Fall) tatsächlich tut. Ich denke: in unserem Beispiel würde include .depend durch
main.o: main.c factorial.h ersetzt werden, aber auch hier macht der Workflow keinen Sinn. Irgendwelche Experten?

Antwort

1

Make versucht automatisch, das Ziel einer include directive

[...] nach dem Lesen in allen Makefiles neu zu machen, machen wird jeweils als Ziel Ziel betrachten und es zu aktualisieren versuchen.

Die Linie sinclude .depend machen erzählt „in .depend Lesen, nicht beenden, wenn es fehlschlägt, suchen Sie nach passenden Regeln und .depend Remake, wenn es veraltet ist.“

In jedem Fall, dass Sie Abhängigkeiten als Nebeneffekt der Kompilation erstellen sollen, gibt es wirklich keine Notwendigkeit für den zusätzlichen Schritt

target := program 
sources := main.c 
objs := $(sources:.c=.o) 
deps := $(objs:.o=.d) 

CPPFLAGS := -MMD -MP 
CFLAGS := -Wall 

$(target): $(objs) 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 

clean: ; $(RM) $(target) $(objs) $(deps) 

-include $(deps) 
+0

Danke. Wenn Sie Remake das Ziel einer Include-Anweisung sagen, bedeutet dies, dass "include .depend" nach dem Ziel namens ".depend" sucht und seine Anweisung ausführt? – Thenewstockton

+0

@Thenewstockton Genau, aber nur nach dem Einschließen der Datei selbst, die es einem Makefile erlaubt, eine Regel für die Neuerstellung selbst zu enthalten. Offensichtlich würde das hier nicht funktionieren, da '.depend' nicht existiert, wenn make zum ersten Mal aufgerufen wird. – user657267