ฟังก์ชั่นไฟล์ใน makefile รับ args นำหน้าด้วยสัญลักษณ์ '@'


10

ข้อความที่ตัดตอนมานี้มาจากบทที่ 8.6 ของคู่มือ makefile GNU

@ $ @. in สำหรับฟังก์ชั่นไฟล์ arg ใน makefile หมายถึงอะไร และทำไมคำสั่งเชลล์เช่น rm นำหน้าด้วยสัญลักษณ์ '@'

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

ไวยากรณ์ของฟังก์ชันไฟล์คือ

$(file op filename[,text])
make 

คำตอบ:


9

มีการใช้@ที่นี่ที่ไม่เกี่ยวข้องสามอย่าง

ใน$@ตัวละคร@เป็นชื่อของตัวแปรอัตโนมัติที่สามารถใช้ในกฎ ค่าของตัวแปรนั้นคือเป้าหมายที่กฎกำลังสร้าง

เมื่อ@ใช้ที่จุดเริ่มต้นของบรรทัดสูตร (คำสั่ง) หลังจากอักขระแท็บจะทำให้คำสั่งไม่ถูกพิมพ์เมื่อกำลังจะถูกเรียกใช้

ตัวละคร@ที่อื่นไม่ได้พิเศษ

ดังนั้นในตัวอย่างของคุณเพื่อสร้างprogram:

  1. fileฟังก์ชั่นถูกเรียก มันเขียนอ้างอิงของเป้าหมาย (ที่$^ตัวแปรอัตโนมัติ) program.inไปยังแฟ้ม
  2. คำสั่งใดก็ตามที่ถูกเก็บไว้ในตัวแปรCMDจะถูกดำเนินการโดยมีพารามิเตอร์ที่เก็บไว้ในตัวแปรCMDFLAGSรวมถึงพารามิเตอร์@program.inเพิ่มเติม สิ่งนี้จะขึ้นอยู่กับสิ่งที่CMDเป็น

  3. คำสั่งrm program.inถูกเรียกใช้งานโดยไม่พิมพ์ออกมาก่อน

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

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

2

@ คำนำหน้าในบรรทัดยับยั้งการสะท้อนของบรรทัด

โดยค่าเริ่มต้นmakeพิมพ์แต่ละบรรทัดMakefileก่อนที่จะดำเนินการ เมื่อบรรทัดขึ้นต้นด้วย@บรรทัดเหล่านั้นจะไม่ถูกพิมพ์

โดยไม่ต้อง@:

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

ด้วย@:

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

ทราบว่ามีเพียง@ที่เริ่มต้นของเส้นสาเหตุปราบปรามสะท้อน >$@.inหรือ@$@.inเป็นเพียงสตริงปกติและ$@ในนั้นจะถูกขยาย:

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

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