จริงๆแล้วคุณพูดถูกมันเรียกใช้ make อีกแบบ ทางออกที่เป็นไปได้คือ:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
โดยการโทรหาmake fresh
คุณจะได้รับclean
เป้าหมายก่อนจากนั้นสิ่งclearscreen
ที่ทำงานclear
และในที่สุดก็all
ทำงานได้
แก้ไข 4 ส.ค.
จะเกิดอะไรขึ้นในกรณีของการสร้างแบบขนานพร้อม-j
ตัวเลือกของ make ? มีวิธีแก้ไขคำสั่งซื้อ จากคู่มือการจัดทำส่วน 4.2:
อย่างไรก็ตามในบางครั้งคุณมีสถานการณ์ที่คุณต้องการกำหนดลำดับที่เฉพาะเจาะจงบนกฎที่จะเรียกใช้โดยไม่บังคับให้อัปเดตเป้าหมายหากกฎข้อใดข้อหนึ่งถูกดำเนินการ ในกรณีนี้คุณต้องการกำหนดข้อกำหนดเบื้องต้นสำหรับคำสั่งซื้อเท่านั้น ข้อกำหนดเบื้องต้นสำหรับคำสั่งเท่านั้นสามารถระบุได้โดยการวางสัญลักษณ์ไปป์ (|) ในรายการข้อกำหนดเบื้องต้น: ข้อกำหนดเบื้องต้นใด ๆ ทางด้านซ้ายของสัญลักษณ์ไปป์เป็นเรื่องปกติ ข้อกำหนดเบื้องต้นใด ๆ ทางด้านขวาคือคำสั่งเท่านั้น: เป้าหมาย: ข้อกำหนดเบื้องต้นปกติ | สั่งซื้อเฉพาะสิ่งที่จำเป็น
ส่วนข้อกำหนดเบื้องต้นปกติอาจว่างเปล่า นอกจากนี้คุณยังสามารถประกาศข้อกำหนดเบื้องต้นหลายบรรทัดสำหรับเป้าหมายเดียวกันได้: มีการต่อท้ายอย่างเหมาะสม โปรดสังเกตว่าถ้าคุณประกาศว่าไฟล์เดียวกันเป็นทั้งสิ่งที่จำเป็นต้องมีตามปกติและตามคำสั่งเท่านั้นข้อกำหนดเบื้องต้นตามปกติจะมีความสำคัญเหนือกว่า (เนื่องจากเป็นส่วนเหนือที่เข้มงวดของลักษณะการทำงานของสิ่งที่จำเป็นต้องมีคำสั่งเท่านั้น)
ดังนั้น makefile จึงกลายเป็น
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
แก้ไข 5 ธ.ค.
ไม่ใช่เรื่องใหญ่ที่จะรันมากกว่าหนึ่งอินสแตนซ์ makefile เนื่องจากแต่ละคำสั่งภายในงานจะเป็นsub-shellอย่างไรก็ตาม แต่คุณสามารถมีวิธีการที่นำมาใช้ใหม่โดยใช้ฟังก์ชั่นการโทร
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
.PHONY :
จะถือว่าเป็นคำหลักบางคำที่ได้รับการดำเนินการเสมอในขณะที่เป้าหมายที่ไม่ใช่ของปลอมมีจุดมุ่งหมายเพื่อเป็นไฟล์