@: (ที่เครื่องหมายโคลอน) หมายถึงอะไรใน Makefile


คำตอบ:


206

มันหมายความว่า "อย่าสะท้อนคำสั่งนี้กับเอาต์พุต" ดังนั้นกฎนี้บอกว่า "ดำเนินการคำสั่งเชลล์:และไม่ได้สะท้อนเอาท์พุท

แน่นอนว่าคำสั่ง shell :คือไม่ใช้ดังนั้นนี่คือการพูดว่า "ไม่ทำอะไรเลยและอย่าบอกเลย"

ทำไม?

เคล็ดลับที่นี่คือคุณมีการผสมผสานที่ชัดเจนของไวยากรณ์ที่แตกต่างกันสองแบบ แต่งหน้า (1)ไวยากรณ์คือการใช้การกระทำที่เริ่มต้นด้วย @ ซึ่งเป็นเพียงไม่สะท้อนคำสั่ง ดังนั้นกฎเช่น

always:
       @echo this always happens

จะไม่เปล่ง

   echo this always happens
   this always happens

ตอนนี้ส่วนการกระทำของกฎสามารถใด ๆ:คำสั่งเชลล์รวมทั้ง Bash help จะอธิบายสิ่งนี้และที่ใดก็ได้:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

21
อย่าทำให้สนุกกับการพิมพ์ของฉันคุณจะแก่สักวันหนึ่งด้วย
Charlie Martin

4
นี่เป็นการอธิบายที่ยอดเยี่ยมเกี่ยวกับสิ่งนี้ แต่คุณรู้หรือไม่ว่าทำไมคุณถึงทำสิ่งนี้ใน makefile
Charles Keepax

8
ไม่ใช่ Foggiest
Charlie Martin

2
มันจะมีประโยชน์ใน makefiles ที่เรียกโปรแกรมภายนอกมากมายและที่ที่คุณต้องการใช้ echo มากมายเพื่อทำให้มันดูดีเช่นนี้
dwcoder

1
@ charles-keepax ถ้าคุณกำลังขอให้เฉพาะเจาะจงในการอ้างอิงถึง@:(ไม่ใช่แค่@) นอกจากคำตอบของ @ guestolio แล้วมันอาจเป็นส่วนที่เหลือจากการพัฒนา passมันก็เหมือนกับการเขียนฟังก์ชั่นในหลามที่มีเพียง มันจะมีประโยชน์สำหรับ stubbing บล็อกของรหัสสำหรับคัดลอก / วาง แต่โดยทั่วไปไม่ควรมีอยู่นาน เมื่อขัดด้วยวิธีนี้ไฟล์จะยังคงคอมไพล์ผ่าน linting เป็นต้น
boweeb

40

สำหรับผู้ที่อยากรู้ว่าทำไมคุณถึงทำเช่นนี้มันจะมีประโยชน์ถ้าคุณต้องการแกล้งทำเป็นทำบางสิ่งบางอย่างเพื่อที่ Make จะไม่แสดงผล "ไม่มีอะไรให้ทำเพื่อ" เป้าหมายของคุณ

ตัวอย่างหนึ่งคือถ้าคุณมีเป้าหมายปลอมที่คุณเรียกใช้เสมอและในนั้นคุณมีเงื่อนไขมากมายในคำสั่ง คุณต้องการที่จะมีบางสิ่งบางอย่างในกรณีที่เงื่อนไขเหล่านั้นเกิดขึ้นเป็นเท็จและไม่มีอะไรเกิดขึ้น

ตัวอย่างเช่น (จากสคริปต์ / Makefile.clean ของ Linux):

__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
    @:
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.