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.

  1. Jeder in einem untergeordneten Make festgestellte Fehler wird von dieser Regel ignoriert. Daher werden die restlichen Verzeichnisse auch dann erstellt, wenn ein Fehler auftritt.
  2. 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 $@


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow