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 >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

Die Syntax der Dateifunktion lautet

$(file op filename[,text])
make 

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)

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 . >$@.inoder @$@.insind nur normale Zeichenfolgen, und $@darin wird erweitert:

$ cat hello
hello:
    @echo @$@.in
$make hello
@hello.in

Diese Antwort sagt nicht, warum >$@.inals Dateimodus verwendet wird ... aber es ist auf seine eigene Weise nützlich ... danke cuonglm ...
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.