Die Dateifunktion im Makefile akzeptiert Argumente, denen das Symbol '@' vorangestellt ist

10

Dieser Code-Auszug stammt aus Kapitel 8.6 des GNU-Makefile-Handbuchs.

Was bedeutet @ $ @. In für die Dateifunktion arg in einem Makefile? und warum werden Shell-Befehle wie rm mit dem Symbol '@' versehen?

program: $(OBJECTS)
     $(file >[email protected],$^)
     $(CMD) $(CMDFLAGS) @[email protected]
     @rm [email protected]

Die Syntax der Dateifunktion lautet

$(file op filename[,text])

quelle

Antworten:

9

Es gibt drei nicht verwandte Verwendungen von @hier.

In $@ist das Zeichen @der Name einer automatischen Variablen , die in einer Regel verwendet werden kann. Der Wert dieser Variablen ist das Ziel, das die Regel erstellt.

Wenn @es ganz am Anfang einer Rezeptzeile (Befehlszeile) direkt nach dem Tabulatorzeichen verwendet wird, wird der Befehl nicht gedruckt, wenn er ausgeführt werden soll.

Der Charakter @anderswo ist nichts Besonderes.

So bauen Sie in Ihrem Beispiel program:

  1. Die fileFunktion wird aufgerufen. Es schreibt die Abhängigkeiten des Ziels ( $^automatische Variable) in die Datei program.in.
  2. Der in der Variablen gespeicherte Befehl wird CMDmit den in der Variablen gespeicherten Parametern CMDFLAGSund dem zusätzlichen Parameter ausgeführt @program.in. Was dies tut, hängt davon ab, was CMDist.

  3. Der Befehl rm program.inwird ausgeführt, ohne ihn zuerst zu drucken.

Einige Befehle behandeln einen Parameter, der mit beginnt, @als Angabe einer Datei, aus der weitere Parameter gelesen werden sollen. Dies ist eine DOS-Konvention, die zustande kam, weil DOS eine strenge Begrenzung der Befehlszeilenlänge hatte und keine Möglichkeit bestand, die Ausgabe eines Befehls in eine Befehlszeile zu interpolieren. In der Unix-Welt ist dies ungewöhnlich, da Unix diese Einschränkungen nicht aufweist. Die Wirkung des Rezepts ist also wahrscheinlich die gleiche wie

$(CMD) $(CMDFLAGS) $(OBJECTS)
Gilles 'SO - hör auf böse zu sein'
quelle
2

@ Präfix in Zeile unterdrücken das Echo der Zeile.

Standardmäßig wird makejede Zeile von gedruckt, Makefilebevor sie ausgeführt wird. Wenn Zeilen mit beginnen @, werden diese Zeilen nicht gedruckt.

Ohne @:

$ cat > Makefile
hello:                                                                          
    echo hello world
$ make hello
echo hello world
hello world

Mit @:

$ cat > Makefile
hello:                                                                          
    @echo hello world
$ make hello
hello world

Ein Hinweis, der nur @am Zeilenanfang zu einer Unterdrückung des Echos führt . >[email protected]oder @[email protected]sind nur normale Zeichenfolgen, und $@darin wird erweitert:

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in
cuonglm
quelle
Diese Antwort sagt nicht, warum >[email protected]als Dateimodus verwendet wird ... aber es ist auf seine eigene Weise nützlich ... danke cuonglm ...