ต่อไปนี้ทำอะไรใน Makefile
rule: $(deps)
@:
ฉันไม่พบสิ่งนี้ในคู่มือผู้ใช้
ต่อไปนี้ทำอะไรใน Makefile
rule: $(deps)
@:
ฉันไม่พบสิ่งนี้ในคู่มือผู้ใช้
คำตอบ:
มันหมายความว่า "อย่าสะท้อนคำสั่งนี้กับเอาต์พุต" ดังนั้นกฎนี้บอกว่า "ดำเนินการคำสั่งเชลล์:
และไม่ได้สะท้อนเอาท์พุท
แน่นอนว่าคำสั่ง 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.
@:
(ไม่ใช่แค่@
) นอกจากคำตอบของ @ guestolio แล้วมันอาจเป็นส่วนที่เหลือจากการพัฒนา pass
มันก็เหมือนกับการเขียนฟังก์ชั่นในหลามที่มีเพียง มันจะมีประโยชน์สำหรับ stubbing บล็อกของรหัสสำหรับคัดลอก / วาง แต่โดยทั่วไปไม่ควรมีอยู่นาน เมื่อขัดด้วยวิธีนี้ไฟล์จะยังคงคอมไพล์ผ่าน linting เป็นต้น
สำหรับผู้ที่อยากรู้ว่าทำไมคุณถึงทำเช่นนี้มันจะมีประโยชน์ถ้าคุณต้องการแกล้งทำเป็นทำบางสิ่งบางอย่างเพื่อที่ 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
@: