บางครั้งคุณต้องใช้ Makefile เพื่อให้สามารถรันบน OS เป้าหมายที่แตกต่างกันได้และคุณต้องการให้บิลด์ล้มเหลวในช่วงต้นหากไฟล์ปฏิบัติการที่ต้องการไม่อยู่ในPATH
แทนที่จะรันเป็นเวลานานก่อนที่จะล้มเหลว
วิธีการแก้ปัญหาที่ดีเยี่ยมให้โดยengineerchuanต้องทำเป้าหมาย อย่างไรก็ตามหากคุณมีไฟล์ปฏิบัติการจำนวนมากที่จะทดสอบและ Makefile ของคุณมีเป้าหมายอิสระจำนวนมากซึ่งแต่ละเป้าหมายต้องมีการทดสอบดังนั้นแต่ละเป้าหมายต้องการเป้าหมายการทดสอบเป็นการพึ่งพา ซึ่งทำให้ต้องพิมพ์เพิ่มมากขึ้นรวมถึงเวลาในการประมวลผลเมื่อคุณสร้างเป้าหมายได้มากกว่าหนึ่งเป้าหมายในแต่ละครั้ง
โซลูชันที่จัดทำโดย0xfสามารถทดสอบปฏิบัติการได้โดยไม่ต้องกำหนดเป้าหมาย ซึ่งช่วยประหยัดเวลาในการพิมพ์และดำเนินการได้มากเมื่อมีหลายเป้าหมายที่สามารถสร้างแยกกันหรือร่วมกัน
การปรับปรุงวิธีแก้ปัญหาหลังของฉันคือการใช้which
ปฏิบัติการ ( where
ใน Windows) แทนที่จะพึ่งพาการมี--version
ตัวเลือกในแต่ละปฏิบัติการโดยตรงในifeq
คำสั่งGNU Make แทนที่จะกำหนดตัวแปรใหม่และใช้ GNU Make ฟังก์ชั่นที่จะหยุดการสร้างถ้าปฏิบัติการต้องไม่ได้อยู่ในerror
${PATH}
ตัวอย่างเช่นในการทดสอบlzop
ปฏิบัติการ:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
หากคุณมีไฟล์ปฏิบัติการที่ต้องตรวจสอบหลายรายการคุณอาจต้องการใช้foreach
ฟังก์ชันกับwhich
ไฟล์ปฏิบัติการ:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
สังเกตการใช้ตัว:=
ดำเนินการกำหนดที่จำเป็นเพื่อบังคับให้มีการประเมินนิพจน์ RHS ทันที หาก Makefile ของคุณเปลี่ยนไปPATH
แทนที่จะเป็นบรรทัดสุดท้ายด้านบนคุณจะต้อง:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
สิ่งนี้ควรให้ผลลัพธ์คล้ายกับ:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.