Makefile dosya fonksiyonu '@' sembolü ile başlayan argümanları alır


10

Bu kod alıntısı GNU makefile manual bölüm 8.6'dan alınmıştır.

Bir makefile dosya argümanında @ $ @. İn ne anlama geliyor? ve neden rm gibi kabuk komutlarının önüne '@' sembolü eklenir

program: $(OBJECTS)
     $(file >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

Dosya işlevi sözdizimi:

$(file op filename[,text])
make 

Yanıtlar:


9

Burada üç alakasız kullanım vardır @.

İçinde $@, karakter bir kuralda kullanılabilen otomatik bir değişkenin@ adıdır . Bu değişkenin değeri, kuralın oluşturduğu hedeftir.

Bir @reçete (komut) satırının en başında kullanıldığında, sekme karakterinden hemen sonra, komutun yürütülmek üzereyken yazdırılmamasına neden olur .

@Başka bir yerdeki karakter özel değil.

Böylece, örneğin, inşa etmek için program:

  1. fileFonksiyon çağrılır. Hedefin bağımlılıklarını ( $^otomatik değişken) dosyaya yazar program.in.
  2. Değişkende depolanan her komut, değişkende CMDdepolanan parametreler CMDFLAGSve ekstra parametre ile birlikte yürütülür @program.in. Bunun ne olduğuna bağlı CMD.

  3. Komut rm program.inönce yazdırılmadan yürütülür.

Birkaç komut, bir parametreden başlayarak, @daha fazla parametre okunacağı dosyayı gösteren bir parametreyi ele alır. DOS'un komut satırı uzunluğu üzerinde sıkı bir sınırı olduğu ve komutun çıktısını komut satırına enterpolasyon yapmanın bir yolu olmadığı için ortaya çıkan bir DOS kuralıdır. Unix dünyasında nadirdir, çünkü Unix'in bu sınırlamaları yoktur. Tarifin etkisi muhtemelen aynı

$(CMD) $(CMDFLAGS) $(OBJECTS)

2

@ öneki satırın yankısını bastırır .

Varsayılan olarak, makeher satırı Makefileyürütülmeden önce yazdırır . Çizgiler ile başladığında @, bu çizgiler yazdırılmaz.

Olmadan @:

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

İle @:

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

Sadece @hattın başlangıcında baskının yankılanmasına neden olduğuna dikkat edin . >$@.inveya @$@.inyalnızca normal dizelerdir ve $@içinde genişletilir:

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

bu cevap, neden >$@.inbir dosya modu olarak kullanıldığını söylemiyor ... ama kendi yolunda yararlı .. teşekkürler cuonglm ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.