Funkcja pliku w makefile przyjmuje argumenty poprzedzone symbolem „@”

10

Ten fragment kodu pochodzi z rozdziału 8.6 instrukcji makefile GNU.

Co oznacza @ $ @. Dla funkcji pliku arg w makefile? i dlaczego polecenia powłoki, takie jak rm, poprzedzone są symbolem „@”

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

Składnia funkcji pliku to

$(file op filename[,text])

źródło

Odpowiedzi:

9

Istnieją tutaj trzy niepowiązane zastosowania @.

W $@, znak @to nazwa zmiennej automatycznej, której można użyć w regule. Wartość tej zmiennej jest celem budowanym przez regułę.

Gdy @jest używane na samym początku wiersza przepisu (polecenia), zaraz po znaku tabulacji, powoduje, że polecenie nie jest drukowane, gdy ma być wykonane.

Postać @gdzie indziej nie jest wyjątkowa.

Zatem w twoim przykładzie zbuduj program:

  1. fileFunkcja jest wywoływana. Zapisuje $^w pliku zależności celu ( zmiennej automatycznej) program.in.
  2. Wykonywane jest dowolne polecenie przechowywane w zmiennej CMD, wraz z parametrami przechowywanymi w zmiennej CMDFLAGSplus parametr dodatkowy @program.in. To, co to robi, zależy od tego, co CMDjest.

  3. Polecenie rm program.injest wykonywane bez uprzedniego wydrukowania.

Kilka poleceń traktuje parametr rozpoczynający się od @jako wskazujący plik, z którego można odczytać więcej parametrów. Jest to konwencja DOS, która powstała, ponieważ DOS miał rygorystyczny limit długości linii poleceń i nie ma możliwości interpolacji wyniku polecenia w linię poleceń. Jest to rzadkie w świecie Uniksa, ponieważ Unix nie ma tych ograniczeń. Efekt przepisu jest więc prawdopodobnie taki sam jak

$(CMD) $(CMDFLAGS) $(OBJECTS)
Gilles „SO- przestań być zły”
źródło
2

Przedrostek @ w linii tłumi echo linii.

Domyślnie makedrukuje każdą linię Makefileprzed jej wykonaniem. Kiedy linie zaczynają się od @, te linie nie zostaną wydrukowane.

Bez @:

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

Z @:

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

Uwaga: tylko @na początku linii powoduje tłumienie echa . >[email protected]lub @[email protected]są zwykłymi ciągami, $@w których zostaną rozwinięte:

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in
Cuonglm
źródło
ta odpowiedź nie mówi, dlaczego >[email protected]jest używany jako tryb pliku ... ale jest użyteczny na swój sposób .. dzięki cuonglm ...