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

Składnia funkcji pliku to

$(file op filename[,text])
make 

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)

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 . >$@.inlub @$@.insą zwykłymi ciągami, $@w których zostaną rozwinięte:

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

ta odpowiedź nie mówi, dlaczego >$@.injest używany jako tryb pliku ... ale jest użyteczny na swój sposób .. dzięki cuonglm ...
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.