ทำให้ฉันดูเหมือนเป็นเพียงเชลล์สคริปต์ที่มีการจัดการอาร์กิวเมนต์บรรทัดคำสั่งที่ง่ายกว่าเล็กน้อย
เหตุใดจึงเรียกใช้ make แทน. /make.sh
ทำให้ฉันดูเหมือนเป็นเพียงเชลล์สคริปต์ที่มีการจัดการอาร์กิวเมนต์บรรทัดคำสั่งที่ง่ายกว่าเล็กน้อย
เหตุใดจึงเรียกใช้ make แทน. /make.sh
คำตอบ:
แนวคิดทั่วไปคือmake
รองรับการสร้างใหม่น้อยที่สุด (สมเหตุสมผล) นั่นคือคุณบอกได้ว่าส่วนใดของโปรแกรมของคุณขึ้นอยู่กับส่วนอื่น ๆ เมื่อคุณอัปเดตบางส่วนของโปรแกรมโปรแกรมจะสร้างเฉพาะส่วนที่ขึ้นอยู่กับสิ่งนั้น ในขณะที่คุณสามารถทำเช่นนี้กับเชลล์สคริปต์มันจะเป็นจำนวนมากการทำงานมากขึ้น (อย่างชัดเจนตรวจสอบวันที่แก้ไขล่าสุดในทุกไฟล์อื่น ๆ ) ทางเลือกที่ชัดเจนเท่านั้นที่มีสคริปต์เปลือกคือการสร้างทุกอย่างทุกครั้ง สำหรับโปรเจ็กต์เล็ก ๆ นี่เป็นแนวทางที่สมเหตุสมผล แต่สำหรับโปรเจ็กต์ขนาดใหญ่การสร้างใหม่ทั้งหมดอาจใช้เวลาหนึ่งชั่วโมงขึ้นไปโดยใช้make
คุณอาจทำสิ่งเดียวกันให้สำเร็จภายในหนึ่งหรือสองนาที ...
ฉันควรจะเพิ่มด้วยว่ามีทางเลือกไม่กี่ทางที่จะทำให้สิ่งนั้นมีความสามารถที่คล้ายคลึงกันอย่างน้อยที่สุด โดยเฉพาะอย่างยิ่งในกรณีที่มีการสร้างไฟล์เพียงไม่กี่ไฟล์ในโปรเจ็กต์ขนาดใหญ่บางไฟล์ (เช่นNinja ) มักจะเร็วกว่าการสร้าง
มีหลายสิ่งที่ทำให้ทำยากกับเชลล์สคริปต์ ...
ตรวจสอบให้แน่ใจว่ามีการคอมไพล์เฉพาะไฟล์ที่ต้องการเท่านั้นเมื่อคุณทำการเปลี่ยนแปลงไฟล์ต้นฉบับของคุณ
ตัวอย่างเช่น:
final : 1.o 2.o
gcc -o final 1.o 2.o
1.o : 1.c 2.h
gcc -c 1.c
2.o : 2.c 2.h
gcc -c 2.c
ถ้าฉันเปลี่ยนไฟล์2.h
เท่านั้น & เรียกใช้make
มันจะรันคำสั่งทั้ง 3 คำสั่งในลำดับย้อนกลับ
ถ้าฉันเปลี่ยนไฟล์1.c
เท่านั้น & เรียกใช้make
มันจะรันคำสั่ง 2 คำแรกในลำดับย้อนกลับเท่านั้น
การพยายามทำให้สำเร็จด้วยเชลล์สคริปต์ของคุณเองจะเกี่ยวข้องกับการif/else
ตรวจสอบจำนวนมาก
rsync -r -c -I $SOURCE $DEST_DIR
ในเชลล์
เช่นเดียวกับข้างต้น Make เป็นภาษาการเขียนโปรแกรมแบบขนานที่ประกาศ (-ish)
สมมติว่าคุณมีไฟล์กราฟิก 4,000 ไฟล์ที่ต้องแปลงและ CPU 4 ตัว ลองเขียนเชลล์สคริปต์ 10 บรรทัด (ฉันเป็นคนใจกว้างที่นี่) ซึ่งจะทำได้อย่างน่าเชื่อถือในขณะที่ทำให้ซีพียูของคุณอิ่มตัว
บางทีคำถามที่แท้จริงคือทำไมผู้คนถึงรำคาญการเขียนเชลล์สคริปต์
ทำการจัดการการอ้างอิง: makefile อธิบายพวกเขา: ไบนารีขึ้นอยู่กับไฟล์อ็อบเจ็กต์ไฟล์อ็อบเจ็กต์แต่ละไฟล์ขึ้นอยู่กับไฟล์ต้นฉบับและส่วนหัว ... เมื่อรัน make วันที่ของไฟล์จะถูกเปรียบเทียบเพื่อกำหนดสิ่งที่ต้องคอมไพล์ใหม่ .
เราสามารถเรียกใช้เป้าหมายเดียวโดยตรงเพื่อไม่ให้สร้างทุกอย่างที่อธิบายไว้ใน Makefile
ยิ่งไปกว่านั้นไวยากรณ์ make ยังให้การทดแทน vpath
ทั้งหมดนี้สามารถเขียนในเชลล์สคริปต์ได้โดยที่คุณมีมันอยู่แล้ว