พนักงาน Red Hat นำเสนอระบบการประกอบ Goals การเปิดตัว GNU Make 4.2

ริชาร์ด ดับเบิลยูเอ็ม โจนส์, ผู้แต่ง libguestfs, ทำงานที่ Red Hat, ส่ง ยูทิลิตี้บิลด์ใหม่ เป้าหมายมุ่งเป้าไปที่การขจัดข้อบกพร่องและปัญหาในการใช้งาน make ขณะที่ยังคงรักษาความเรียบง่ายและความเข้าใจโดยรวมของสคริปต์ไว้ ยูทิลิตี้ make ได้รับการออกแบบในปี 1976 และมีข้อบกพร่องทางแนวคิดหลายประการ Goals วางแผนที่จะกำจัดข้อบกพร่องเหล่านี้โดยไม่เปลี่ยนแนวคิดทั่วไป
ซอร์สโค้ดเป้าหมาย จัดจำหน่ายโดย ได้รับอนุญาตภายใต้ GPLv2+

แก้ไขปัญหา:

  • รองรับกลยุทธ์การแก้ปัญหาการขึ้นต่อกันเพียงวิธีเดียว - “คำสั่งแอสเซมบลีจะทำงานหากไฟล์เป้าหมายหายไปหรือเก่ากว่าการขึ้นต่อกันอย่างใดอย่างหนึ่ง” เป้าหมายวางแผนที่จะใช้กลยุทธ์อื่นๆ เช่น การตรวจสอบการมีอยู่ของ URL การเปรียบเทียบเวลาแก้ไขกับไฟล์ใดๆ การประเมินแพ็คเกจบิลด์ใน โคจิ, การเปรียบเทียบเช็คซัม, การรันกรณีทดสอบพร้อมการข้ามการทดสอบแบบเลือก
  • เมื่อประมวลผลเป้าหมายบิลด์ make จะไม่แยกไฟล์และชื่อกฎ และด้วยเหตุนี้ จึงไม่มีการตรวจสอบว่าเมื่อรันกฎ ไฟล์ที่อ้างว่าจะสร้างจะถูกสร้างขึ้นจริง ตัวอย่างเช่น หากคุณมีกฎชื่อ "test" ที่รันสคริปต์พร้อมการทดสอบ ไฟล์ชื่อ "test" จะถูกสร้างขึ้นโดยไม่ได้ตั้งใจ การทดสอบจะไม่ถูกเรียกอีกต่อไป เนื่องจาก make จะพิจารณาว่าเป้าหมายนั้นถูกสร้างขึ้นและไม่ต้องการ การดำเนินการใดๆ (สำหรับ หากต้องการแก้ไขปัญหา คุณสามารถระบุคำสั่ง “.PHONY: test”) เป้าหมายแยกไฟล์และชื่อกฎอย่างชัดเจน

    พนักงาน Red Hat นำเสนอระบบการประกอบ Goals การเปิดตัว GNU Make 4.2

  • ปัญหาในการจัดเตรียมพารามิเตอร์เพียงตัวเดียวสำหรับคำแนะนำในการประกอบ

    พนักงาน Red Hat นำเสนอระบบการประกอบ Goals การเปิดตัว GNU Make 4.2

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

    พนักงาน Red Hat นำเสนอระบบการประกอบ Goals การเปิดตัว GNU Make 4.2

  • ปัญหาในการโต้ตอบกับล่ามเชลล์ ตัวอย่างเช่น ความจำเป็นในการควบคุมการหลีกเลี่ยงช่องว่างในชื่อไฟล์และไดเร็กทอรี การสิ้นเปลืองทรัพยากรในการเรียกใช้ตัวแปลเชลล์แยกต่างหากเมื่อดำเนินการแต่ละคำสั่ง การตีความอักขระ "$" สองครั้ง (ใช้ทั้งในเชลล์และ make) โดยคำนึงถึงการเยื้อง

    ปัญหาเหล่านี้ได้รับการแก้ไขในเป้าหมายโดยใช้สัญลักษณ์ “%” แทน “$” สำหรับตัวแปรแอสเซมบลี (“$” ยังคงอยู่สำหรับเชลล์เท่านั้น) โดยใช้ parser ลาอาร์(1)ซึ่งกำหนดให้คุณต้องล้อมรอบพาธและชื่อไฟล์ด้วยเครื่องหมายคำพูด และไฮไลต์บล็อกโค้ดด้วยเครื่องหมายปีกกา บล็อกคำสั่งทั้งหมดถูกเปิดใช้งานในอินสแตนซ์หนึ่งของเชลล์คำสั่ง และภายในบล็อกนั้น อนุญาตให้มีการจัดรูปแบบโค้ดที่กำหนดเองได้ โดยไม่ต้องอ้างอิงถึงช่องว่างพิเศษ

    มันเป็น:
    เป้าหมาย: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    กลายเป็น:
    "เป้าหมาย": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

คุณสมบัติอื่น ๆ ของเป้าหมาย:

  • การสนับสนุนเพิ่มเติมสำหรับการระบุชื่อและพารามิเตอร์ที่กำหนดเอง:

    เป้าหมายทั้งหมด = : "เป้าหมาย"

    ลิงค์เป้าหมาย =
    "เป้าหมาย" : "foo.o", "bar.o" { ... }

    รวบรวมเป้าหมาย (ชื่อ) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • โหมดการเรียกใช้งานสองโหมด: โหมดสร้างเพื่อจับคู่เป้าหมายบิลด์ด้วยชื่อไฟล์ (เช่น ไฟล์ "foo.o" ตรงกับเป้าหมาย "%name.o") และโหมดการคอมไพล์โดยตรง:

    เป้าหมายทั้งหมด = : ลิงค์

    ลิงค์เป้าหมาย =
    "target" : "foo.o", คอมไพล์ ("bar") { ... }

    รวบรวมเป้าหมาย (ชื่อ) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • กลยุทธ์การประกอบถูกกำหนดโดยกฎพิเศษที่สามารถใช้เพื่อกำหนดความจำเป็นในการประกอบเป้าหมายการประกอบอีกครั้ง หากมีการสร้างลิงก์ไปยังไฟล์ที่มีอยู่ สิ่งนี้จะถูกกำหนดอย่างชัดเจนผ่านเครื่องหมายที่เกี่ยวข้อง (“เป้าหมาย” สำหรับชื่อกฎและ *ไฟล์ (“เป้าหมาย”) สำหรับการตรวจสอบไฟล์)

    "เป้าหมาย" : "foo.o", "bar.o" { ... }

    *file("target") : *file("foo.o"), *file("bar.o") { ... }

  • นักพัฒนาสามารถกำหนดคุณลักษณะของกลยุทธ์การประกอบได้ตามอำเภอใจ แฟล็ก "*file" ถูกกำหนดโดยค่าเริ่มต้น (@{...} บ่งชี้ถึงการระงับเอาต์พุต และ "exit 99" ส่งสัญญาณถึงความจำเป็นในการสร้างใหม่):

    ชั้นเชิง *file (ชื่อไฟล์) = @{
    ทดสอบ -f % ชื่อไฟล์ || ทางออก 99
    สำหรับ f ใน %

    ที่มา: opennet.ru

เพิ่มความคิดเห็น