เหตุใดจึงต้องใช้ make over เชลล์สคริปต์


129

ทำให้ฉันดูเหมือนเป็นเพียงเชลล์สคริปต์ที่มีการจัดการอาร์กิวเมนต์บรรทัดคำสั่งที่ง่ายกว่าเล็กน้อย

เหตุใดจึงเรียกใช้ make แทน. /make.sh


สำหรับคำถามย้อนกลับ: เหตุใดจึงใช้เชลล์สคริปต์มากกว่า make (เนื่องจากการจัดการอาร์กิวเมนต์บรรทัดคำสั่งที่ง่ายกว่าอย่างเห็นได้ชัด) โดยเฉพาะอย่างยิ่งสำหรับงานของผู้ดูแลระบบโปรดอ่านที่นี่: unix.stackexchange.com/a/497601/1170
lesmana

คำตอบ:


126

แนวคิดทั่วไปคือmakeรองรับการสร้างใหม่น้อยที่สุด (สมเหตุสมผล) นั่นคือคุณบอกได้ว่าส่วนใดของโปรแกรมของคุณขึ้นอยู่กับส่วนอื่น ๆ เมื่อคุณอัปเดตบางส่วนของโปรแกรมโปรแกรมจะสร้างเฉพาะส่วนที่ขึ้นอยู่กับสิ่งนั้น ในขณะที่คุณสามารถทำเช่นนี้กับเชลล์สคริปต์มันจะเป็นจำนวนมากการทำงานมากขึ้น (อย่างชัดเจนตรวจสอบวันที่แก้ไขล่าสุดในทุกไฟล์อื่น ๆ ) ทางเลือกที่ชัดเจนเท่านั้นที่มีสคริปต์เปลือกคือการสร้างทุกอย่างทุกครั้ง สำหรับโปรเจ็กต์เล็ก ๆ นี่เป็นแนวทางที่สมเหตุสมผล แต่สำหรับโปรเจ็กต์ขนาดใหญ่การสร้างใหม่ทั้งหมดอาจใช้เวลาหนึ่งชั่วโมงขึ้นไปโดยใช้makeคุณอาจทำสิ่งเดียวกันให้สำเร็จภายในหนึ่งหรือสองนาที ...

ฉันควรจะเพิ่มด้วยว่ามีทางเลือกไม่กี่ทางที่จะทำให้สิ่งนั้นมีความสามารถที่คล้ายคลึงกันอย่างน้อยที่สุด โดยเฉพาะอย่างยิ่งในกรณีที่มีการสร้างไฟล์เพียงไม่กี่ไฟล์ในโปรเจ็กต์ขนาดใหญ่บางไฟล์ (เช่นNinja ) มักจะเร็วกว่าการสร้าง


67

Make เป็นระบบผู้เชี่ยวชาญ

มีหลายสิ่งที่ทำให้ทำยากกับเชลล์สคริปต์ ...

  • แน่นอนมันจะตรวจสอบเพื่อดูว่าอะไรล้าสมัยเพื่อสร้างเฉพาะสิ่งที่ต้องสร้างเท่านั้น
  • มันดำเนินการเรียงลำดับโทโพโลยีหรือการวิเคราะห์โครงสร้างแบบอื่น ๆ ที่กำหนดว่าอะไรขึ้นอยู่กับอะไรและลำดับใดในการสร้างสิ่งที่ล้าสมัยเช่นที่ข้อกำหนดเบื้องต้นทุกอย่างถูกสร้างขึ้นก่อนการพึ่งพาทุกครั้งและสร้างเพียงครั้งเดียว
  • มันเป็นภาษาสำหรับการเขียนโปรแกรมที่เปิดเผย สามารถเพิ่มองค์ประกอบใหม่ได้โดยไม่จำเป็นต้องรวมเข้ากับขั้นตอนการควบคุมที่จำเป็น
  • มันมีเครื่องยนต์อนุมานกับกฎระเบียบของกระบวนการรูปแบบและวันนี้และเมื่อรวมกับกฎระเบียบใน Makefile โดยเฉพาะอย่างยิ่งของคุณคือสิ่งที่เปลี่ยนให้เป็นระบบผู้เชี่ยวชาญ
  • มีหน่วยประมวลผลมาโคร
  • ดูเพิ่มเติม: สรุปก่อนหน้าของการทำสรุปก่อนหน้านี้ทำให้

2
แม้ว่าระบบผู้เชี่ยวชาญจะค่อนข้าง จำกัด เช่นการอนุมานแต่ละครั้งสามารถใช้กฎเดียวกันได้เพียงครั้งเดียว
Reinierpost

1
เพียงเพื่ออธิบายรายละเอียดในจุดที่ 2) ในแง่วิศวกรรมของคนธรรมดามากกว่านั้นเชลล์สคริปต์บังคับใช้การจัดลำดับเชิงเส้นในขณะที่ makefile เป็นเหมือนต้นไม้ จะลบการอ้างอิงตามลำดับเวลาที่ไม่จำเป็น (แม้ว่าในทางปฏิบัติกระบวนการ make จะดำเนินการแบบเชิงเส้น)
Sridhar Sarnobat

2
... ฉันคิดว่าปัญหาเกี่ยวกับ Makefiles บนเชลล์สคริปต์นั้นคล้ายคลึงกับปัญหาเกี่ยวกับ CSS ผ่านจาวาสคริปต์ ยังไม่ชัดเจนเท่าที่จะเป็นไปได้อย่างชัดเจนว่าลำดับเวลาแต่ละโหนดถูกดำเนินการอย่างไรแม้ว่าอย่างน้อยด้วย Makefiles คุณก็ยังคงเห็นคำสั่งเชลล์จริง ด้วย CSS แม้ว่ามันจะถูกแยกออกไป
Sridhar Sarnobat

ฉันมีความคิดเห็นเล็กน้อยที่ฉันยินดีหากมีคนชี้แจง 1 / ไม่เกี่ยวข้องกับจุดแรกและสองจุดของคุณในแง่ที่ว่าการเรียงลำดับโทโพโลยีนั้นเป็นวิธีการสร้างที่เพิ่มขึ้นโดยนัย? 2 / คุณไม่สามารถชี้หมายเลข 3 ได้โดยใช้องค์ประกอบของฟังก์ชันเช่นกัน 3 / ฉันต้องการทำความเข้าใจเพิ่มเติมเกี่ยวกับข้อดีของ 4 และ 5 สำหรับผู้ใช้ MakeFile และทำไมข้อดีเหล่านี้ไม่สามารถใช้งานได้โดยการเขียนคำสั่งเชลล์เข้าด้วยกัน
Amine Hajyoussef

นี่เป็นครั้งแรกที่ฉันพบ Make อธิบายว่าเป็นระบบผู้เชี่ยวชาญ ในฐานะคนที่สร้างระบบผู้เชี่ยวชาญมันไม่ใช่สิ่งที่ฉันคิด เห็นได้ชัดว่ามีกลไกการอนุมานเพื่ออนุมานวิธีการสร้างโปรแกรมของคุณผ่านกฎการประกาศที่ระบุไว้ใน makefile แต่เห็นได้ชัดว่ามันเป็นระบบฐานความรู้เนื่องจากกฎ (leaf) เป็นคำสั่งเชลล์ที่จะดำเนินการมากกว่าข้อเท็จจริง และคำว่า "ระบบผู้เชี่ยวชาญ" ใช้เพื่ออ้างถึงระบบที่ประสบความสำเร็จในการรวบรวมความเชี่ยวชาญของผู้เชี่ยวชาญระดับโลกซึ่งไม่เป็นเช่นนั้น คณะลูกขุนยังคงให้ฉัน
Dennis

9

ตรวจสอบให้แน่ใจว่ามีการคอมไพล์เฉพาะไฟล์ที่ต้องการเท่านั้นเมื่อคุณทำการเปลี่ยนแปลงไฟล์ต้นฉบับของคุณ

ตัวอย่างเช่น:

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ในเชลล์
Spartacus9

9

เช่นเดียวกับข้างต้น Make เป็นภาษาการเขียนโปรแกรมแบบขนานที่ประกาศ (-ish)

สมมติว่าคุณมีไฟล์กราฟิก 4,000 ไฟล์ที่ต้องแปลงและ CPU 4 ตัว ลองเขียนเชลล์สคริปต์ 10 บรรทัด (ฉันเป็นคนใจกว้างที่นี่) ซึ่งจะทำได้อย่างน่าเชื่อถือในขณะที่ทำให้ซีพียูของคุณอิ่มตัว

บางทีคำถามที่แท้จริงคือทำไมผู้คนถึงรำคาญการเขียนเชลล์สคริปต์


1
ใช่คุณกำลังคลายการจัดลำดับเชิงเส้นทั้งหมดเป็นการสั่งซื้อแบบต้นไม้มากขึ้น
Sridhar Sarnobat

4

ทำการจัดการการอ้างอิง: makefile อธิบายพวกเขา: ไบนารีขึ้นอยู่กับไฟล์อ็อบเจ็กต์ไฟล์อ็อบเจ็กต์แต่ละไฟล์ขึ้นอยู่กับไฟล์ต้นฉบับและส่วนหัว ... เมื่อรัน make วันที่ของไฟล์จะถูกเปรียบเทียบเพื่อกำหนดสิ่งที่ต้องคอมไพล์ใหม่ .

เราสามารถเรียกใช้เป้าหมายเดียวโดยตรงเพื่อไม่ให้สร้างทุกอย่างที่อธิบายไว้ใน Makefile

ยิ่งไปกว่านั้นไวยากรณ์ make ยังให้การทดแทน vpath

ทั้งหมดนี้สามารถเขียนในเชลล์สคริปต์ได้โดยที่คุณมีมันอยู่แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.