Bir Makefile'de @: (sembol kolonunda) ne anlama geliyor?


155

Makefile'de aşağıdakiler ne yapar?

rule: $(deps)
    @:

Bunu yapma kılavuzunda bulamıyorum.

Yanıtlar:


206

"Çıktıda bu komutu yankılama" anlamına gelir. Yani bu kural "shell komutunu çalıştır :ve çıktıyı yankılama " diyor .

Tabii ki kabuk komutu :bir op-op, bu yüzden bu "hiçbir şey yapma ve söyleme" diyor.

Neden?

Buradaki hile, iki farklı sözdiziminin belirsiz bir kombinasyonuna sahip olmanızdır. Marka (1) söz dizimi komutu yankı için basitçe @ ile başlayan bir eylem kullanılmasıdır. Yani bir kural

always:
       @echo this always happens

yaymayacak

   echo this always happens
   this always happens

Şimdi, bir kuralın eylem kısmı dahil herhangi bir kabuk komutu olabilir :. Bash yardımı bunu her yerde olduğu gibi açıklar:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

21
Yazımla dalga geçme, sen de bir gün yaşlı olacaksın.
Charlie Martin

4
Bu, bunun ne yaptığına dair mükemmel bir açıklamadır, ancak bunu neden bir makefile'da yapacağınızı biliyor musunuz?
Charles Keepax

8
En sisli değil.
Charlie Martin

2
Çok fazla harici program çağıran ve bu
dwcoder

1
@ charles-keepax özellikle @:(sadece @) referans olarak soruyorsanız o zaman @ guestolio'nun cevabına ek olarak, aynı zamanda gelişimden kalan bir saplama da olabilir. Bu sadece Python'da bir fonksiyon yazmak gibi pass. Kopyala / yapıştır için kod bloklarını saplamak için yararlı olabilir, ancak genellikle uzun süre mevcut olmamalıdır. Bu şekilde stubbing yaparken dosya hala derlenir, lintingi geçirir, vb.
boweeb

40

Bunu neden yapabileceğinizi merak edenler için, bir şeyin yapıldığı gibi davranmak istiyorsanız faydalıdır, böylece Make hedefinize "Yapılacak hiçbir şey" vermez.

Bunun bir örneği, her zaman yürüttüğünüz bir sahte hedefiniz varsa ve içinde komutta bir grup koşul vardır. Bu koşulların yanlış olması ve hiçbir şey yapılmaması durumunda en azından bir şey istersiniz.

Örneğin (Linux'un komut dosyalarından / Makefile.clean):

__clean: $(subdir-ymn)
ifneq ($(strip $(__clean-files)),)
    +$(call cmd,clean)
endif
ifneq ($(strip $(__clean-dirs)),)
    +$(call cmd,cleandir)
endif
ifneq ($(strip $(clean-rule)),)
    +$(clean-rule)
endif
    @:
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.