Bernd schrieb:
> top: mkdirs all
> all clean archieve link compile: $(OBJ)
>
> $(MAKE) -C $(OBJ) -f $(BUILD)/comp.mk $@
> $(OBJ):
> mkdir -p $(OBJ)
> @echo "skip: *" > $(OBJ)/.nsr
Um das mit deinem neuen Wissen einmal genauer anzusehen:
> top: mkdirs all
das Toplevel-Target (das statt "top" auch jeden anderen Namen haben
könnte, entscheidend ist nur, dass es das erste Target im Makefile ist),
ist abhängig von "mkdirs" und "all"
Denn zusätzlich zu den reinen Dateizeitstemepvergleichsregeln kann man
make auch solche unterschieben, zu denen es gar keine Dateien gibt.
Dieser Umstand wird hiermit make sauber mitgeteilt:
> .PHONY: top all mkdirs clean
Das ist nicht strikt notwendig, aber guter Stil, da es make dabei hilft,
diesen Sonderfall sauber zu behandeln. Die Klärung der Abhängigkeiten
wird beschleunigt und vor allem vermeidet man so Probleme, falls es
wirklich mal eine Datei dieses Namens geben sollte. Die wird dann von
make ignoriert.
Also "top" ist abhängig von "mkdirs" und "all", die ebenfalls nur Namen
sind. Jedes Mal wenn make "top" "erstellen" soll, werden zuerst "mkdirs"
und "all" erstellt, also die zur Erstellung dieser Targets definierten
Befehle an die Shell übergeben.
> all clean archieve link compile: $(OBJ)
Alles was links des Doppelpunkts genannt ist, ist von $(OBJ) abhängig.
Also sobald make die Regeln zur Erstellung von "all", "clean",
"archive", "link" oder "compile" abarbeitet, wird zuerst überprüft, ob
$(OBJ) aktuell, d.h. neuer als seine Anhängigkeiten ist.
Dass make eines dieser Targets erstellen "möchte" kann verschiedene
Ursachen haben:
* make wurde explizit dazu aufgefordert z.B. durch
make clean
* make wurde ohne Nennung eines Targets aufgerufen und erstellt das
Toplevel-Target:
make
* das Target steht in der Abhängigkeitenliste eines anderen Targets,
dass erstellt werden soll.
Bernd schrieb:
> Zuerst wird das Verzeichnis angelegt: mkdir -p $(OBJ). Wieso schreibt
> man das hier aber mit "all clean archieve..: $(OBJ)? und nicht
> einfach "mkdir -p $(OBJ)".
Ich hoffe das o.g. hilft zum Verständnis dieser Konstrukte.