2017-08-16 2 views
0

Ich frage mich, ist jemand weiß, was das Stand-alone-Symbol @ und der 'dir' Befehl in meiner Make-Datei hier tut (zweite & dritte Zeile):Make-Datei allein @ -Zeichen steht und dir Stichwort

$(BUILD)/%.o: %.cpp 
    @mkdir -p $(dir [email protected]) 
    $(CC) $(CFLAGS) -c $? -o [email protected] 

Ich verstehe Was $ @ aber @ ist, ist im GNU-Handbuch (https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html) nicht aufgeführt und alle meine Suchen sprechen über das $ @.

Außerdem, in der dritten Zeile, verstehe ich, dass mkdir -p verschachtelte Verzeichnisse erstellt, aber ich hatte gehofft, wenn jemand kann bitte auf $ (dir $ @) speziell die "dir" Teil.

Vielen Dank für Ihre Zeit.

+0

Sie sollten die C++, Symbole und Symbol-Tag entfernen, da diese Frage vollständig "GNU make" zentrisch ist. – Krom

+0

Mögliches Duplikat von [Was machen @, - und + als Präfix für Rezeptzeilen in Make?] (Https://stackoverflow.com/questions/3477292/what-do-and-do-as-prefixes-to-recipe -lines-in-make) –

+0

Wenn es nicht für den Teil mit dem 'dir' Schlüsselwort wäre, würde ich dieses doppelte Flags zweiteilen. – Krom

Antwort

3

Wenn @ eine Rezepturzeile startet, wird der Befehl selbst nicht ausgegeben.

$(dir [email protected]) expandiert in den Verzeichnisteil des Ziels [email protected]. In diesem Fall ist das $(BUILD)/rest/path/to/, wenn das Ziel $(BUILD)/rest/path/to/target.o ist.

Von GNU make manual, 5.2 Recipe Echoing:

5,2 Rezept

Normalerweise 'make' Echoing druckt jede Zeile des Rezeptes, bevor sie ausgeführt wird. Wir nennen das "echo", weil es den Anschein erweckt, dass Sie die Zeilen selbst eingeben.

Wenn eine Zeile beginnt mit ‚@‘ ist das Echo dieser Linie unterdrückt. Das '@' wird verworfen, bevor die Zeile an die Shell übergeben wird.Normalerweise würden Sie dies für einen Befehl nur dann wirksam, deren Verwendung ist Befehl etwas, wie ein ‚Echo‘ drucken Fortschritt durch die Make-Datei anzuzeigen:

@echo About to make distribution files 

und von den same, 8.3 Functions for File Names

8.3 Funktionen für Dateinamen

Einige der integrierten Erweiterungsfunktionen beziehen sich speziell auf , die Dateinamen oder Listen von Dateien auseinander nehmen die Namen.

Jede der folgenden Funktionen führt eine spezifische Umwandlung für einen Dateinamen durch. Das Argument der Funktion wird als eine Reihe von Dateinamen, getrennt durch Leerzeichen, betrachtet. (Leading und Trailing Leerzeichen wird ignoriert.) Jeder Dateiname in der Reihe wird in der gleichen Weise umgewandelt und die Ergebnisse werden mit einzelnen Leerzeichen zwischen ihnen verkettet.

'$ (dir NAMES ...)' Extrahiert den Verzeichnis-Teil jedes Dateinamens in NAMES. Der Verzeichnis-Teil des Dateinamens ist alles durch (und einschließlich) der letzte Schrägstrich darin. Wenn der Dateiname keinen Schrägstrich enthält, ist der Verzeichnisteil die Zeichenfolge './'. Beispiel:

 $(dir src/foo.c hacks) 

erzeugt das Ergebnis 'src/./'.

1

Es ist ein Schalldämpfer. Wenn @ das erste Zeichen eines Befehls ist, wird der genannte Befehl ausgeführt, ohne vorher in stdout gedruckt zu werden.

Siehe Makefile documentation für weitere Informationen:

Normalerweise druckt der Rezeptur jede Zeile, bevor sie ausgeführt wird. Wir nennen das Echo, weil es den Anschein erweckt, dass Sie die Zeilen selbst eingeben.

Wenn eine Zeile mit '@' beginnt, wird das Echo dieser Zeile unterdrückt. Das '@' wird verworfen, bevor die Zeile an die Shell übergeben wird. Normalerweise würden Sie dies für einen Befehl, deren Verwendung nur Wirkung ist etwas, wie ein Echo-Befehl zum Drucken schreitet voran durch die Make-Datei anzuzeigen:

@echo About to make distribution files 

Wenn make gegeben wird, um die Flagge ‚-n‘ oder ‚--just -print 'nur die meisten Rezepte, ohne sie auszuführen. Siehe Zusammenfassung der Optionen. In diesem Fall werden auch die mit '@' beginnenden Rezeptzeilen gedruckt. Diese Markierung ist nützlich, um herauszufinden, welche Rezepte Denkvorgänge erforderlich machen, ohne sie tatsächlich auszuführen.

Der ‚es‘ oder ‚--silent‘ Flag verhindert machen alle Echos, als ob alle Rezepte mit gestartet ‚@‘. Eine Regel im Makefile für das spezielle Ziel .SILENT ohne Voraussetzungen hat den gleichen Effekt (siehe Spezielle vordefinierte Zielnamen). .SILENT ist im Wesentlichen obsolet, da '@' flexibler ist.