บางครั้งคุณต้องใช้ 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.