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