Apa yang dimaksud dengan @: (pada tanda titik dua) dalam Makefile?

155

Apa yang dilakukan hal-hal berikut dalam Makefile?

rule: $(deps)
    @:

Sepertinya saya tidak dapat menemukan ini di manual make.

cdwilson
sumber

Jawaban:

206

Itu berarti "jangan gema perintah ini pada output." Jadi aturan ini mengatakan "jalankan perintah shell: dan jangan gema output.

Tentu saja perintah shell :adalah no-op, jadi ini mengatakan "jangan lakukan apa-apa, dan jangan katakan."

Mengapa?

Kuncinya di sini adalah bahwa Anda memiliki kombinasi yang tidak jelas dari dua sintaks yang berbeda. The make (1) sintaks adalah penggunaan tindakan dimulai dengan @, yang tidak hanya echo perintah. Jadi aturannya seperti

always:
       @echo this always happens

tidak akan memancarkan

   echo this always happens
   this always happens

Sekarang, bagian aksi aturan bisa saja perintah shell, termasuk :. Bantuan Bash menjelaskan ini juga di mana saja:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
Charlie Martin
sumber
21
Jangan mengolok-olok ketikan saya, suatu hari nanti Anda akan menjadi tua.
Charlie Martin
4
Ini adalah penjelasan yang sangat baik tentang apa yang dilakukannya, tetapi apakah Anda kebetulan tahu mengapa Anda melakukan ini di makefile?
Charles Keepax
8
Bukan yang foggiest.
Charlie Martin
2
Ini dapat berguna dalam makefile yang memanggil banyak program eksternal, dan di mana Anda ingin menggunakan gema banyak untuk membuatnya terlihat bagus, seperti ini
dwcoder
1
@ charles-keepax jika Anda bertanya secara spesifik sehubungan dengan @:(bukan hanya @) maka selain jawaban @ guestolio itu juga bisa menjadi sisa rintisan dari pengembangan. Ini seperti menulis fungsi dengan Python yang hanya berisi pass. Ini dapat berguna untuk mematikan blok kode untuk copy / paste tetapi umumnya tidak seharusnya ada lama. Ketika mematikan cara ini file tersebut akan tetap dikompilasi, lulus linting, dll.
boweeb
40

Bagi mereka yang penasaran mengapa Anda melakukan ini, akan berguna jika Anda ingin berpura-pura seperti sesuatu telah dilakukan, sehingga Make tidak menampilkan "Tidak ada yang harus dilakukan untuk" target Anda.

Salah satu contoh adalah jika Anda memiliki target palsu yang selalu Anda jalankan, dan di dalamnya Anda memiliki banyak persyaratan dalam perintah. Anda ingin memiliki setidaknya sesuatu jika kondisi tersebut salah dan tidak ada yang dilakukan.

Misalnya (dari skrip Linux / 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
    @:
Guestolio
sumber