Was tun @, - und + als Präfixe für Rezeptzeilen in Make?


172

In der GNU Makefile Handbuch, es erwähnt diese Präfixe.

Wenn .ONESHELL angegeben ist, wird nur die erste Zeile des Rezepts auf die Sonderzeichen ('@', '-' und '+') überprüft.

Was machen diese Präfixe und wo werden sie erwähnt?

Antworten:


234

Sie steuern das Verhalten von make für die markierten Befehlszeilen:

  • @ unterdrückt das normale 'Echo' des ausgeführten Befehls.

  • - bedeutet, den Exit-Status des ausgeführten Befehls zu ignorieren (normalerweise würde ein Exit-Status ungleich Null diesen Teil des Builds stoppen).

  • +bedeutet 'diesen Befehl ausführen unter make -n' (oder 'make -t' oder 'make -q'), wenn Befehle normalerweise nicht ausgeführt werden. Siehe auch die POSIX-Spezifikation für makeund auch §9.3 des GNU Make-Handbuchs.

Die +Notation ist eine (POSIX-standardisierte) Verallgemeinerung des De-facto -Mechanismus (nicht standardisiert), wobei eine Befehlszeile enthält ${MAKE}oder $(MAKE)unter ausgeführt wird make -n.

( @wird in §5.2 des GNU Make-Handbuchs besprochen ; -wird in §5.5 beschrieben ; und §5.7.1 erwähnt die Verwendung von +.)


41

@verhindert, dass die Befehlszeile zur Konsole zurückgesendet wird. Sie können dies global mit -soder tun--keep-silent

-weist make an, weiterzumachen, auch wenn der Befehl aus irgendeinem Grund fehlschlägt. Sie können dies global über das -iFlag (oder --ignore-errors) tun .

+Ich war nicht vertraut, bevor Sie gefragt haben. So nahe , wie ich sagen kann, negiert er die Wirkung von -n, -tund -q, von denen alle im Grunde machen sagen, nicht tatsächlich die Befehle auszuführen. Eine Linie mit einem +vorne würde also sowieso laufen.

Wenn Sie das offizielle Gnu Make-Handbuch lesen, werden alle in Kapitel 5 erwähnt . In meiner alten Kopie des Handbuchs war das das Kapitel über "Befehle", aber der Begriff du jour scheint jetzt "Rezepte" zu sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.