makefile
.PHONY Ziel
Suche…
.PHONY für Ziele verwenden, die keine Dateien sind
Verwenden Sie .PHONY
, um die Ziele anzugeben, die keine Dateien sind, z. B. clean
oder mrproper
.
Gutes Beispiel
.PHONY: clean
clean:
rm *.o temp
Schlechtes Beispiel
clean:
rm *.o temp
Im guten Beispiel weiß make
, dass clean
keine Datei ist. Daher wird nicht gesucht, ob es aktuell ist oder nicht, und das Rezept wird ausgeführt.
Im schlechten Beispiel sucht make
nach einer Datei namens clean
. Wenn es nicht existiert oder nicht auf dem neuesten Stand ist, wird das Rezept ausgeführt. Ist es jedoch vorhanden und auf dem neuesten Stand, wird das Rezept nicht ausgeführt.
Verwenden von .PHONY für rekursive Aufrufe des Befehls "make"
Rekursive Verwendung von make bedeutet, dass make als Befehl innerhalb eines Makefiles verwendet wird. Diese Technik ist nützlich, wenn ein großes Projekt Unterverzeichnisse enthält, die jeweils über ihre Makefiles verfügen. Das folgende Beispiel hilft, den Vorteil der Verwendung von .PHONY mit rekursivem make zu verstehen.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
Um das Makefile des Unterverzeichnisses innerhalb des Makefiles von main auszuführen, hätte das Makefile des Hauptverzeichnisses eine Schleife, wie unten gezeigt (es gibt andere Möglichkeiten, wie dies erreicht werden kann, aber dies ist außerhalb des aktuellen Themas)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Bei dieser Methode gibt es jedoch Fallstricke.
- Jeder in einem untergeordneten Make festgestellte Fehler wird von dieser Regel ignoriert. Daher werden die restlichen Verzeichnisse auch dann erstellt, wenn ein Fehler auftritt.
- Die Möglichkeit von Make, mehrere Build-Ziele parallel auszuführen, wird nicht verwendet, da nur eine Regel verwendet wird.
Durch die Deklaration der Unterverzeichnisse als .PHONY-Ziele (Sie müssen dies tun, da das Unterverzeichnis offensichtlich immer vorhanden ist, andernfalls wird es nicht erstellt), können diese Probleme überwunden werden.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@