คำตอบสั้น ๆ : เพราะmake
ไม่ดี แม้แต่ทางด้านหน้า C คุณจะเห็นทางเลือกมากมายที่โผล่ขึ้นมา
คำตอบยาว: make
มีข้อบกพร่องหลายประการที่ทำให้แทบจะไม่เหมาะสำหรับการคอมไพล์ C และไม่เหมาะสำหรับการคอมไพล์ Java คุณสามารถบังคับให้คอมไพล์ Java ได้หากต้องการ แต่คาดว่าจะพบปัญหาบางอย่างไม่มีวิธีการแก้ไขที่เหมาะสม นี่คือบางส่วน:
การแก้ปัญหาการพึ่งพา
make
โดยปกติคาดว่าไฟล์จะมีการพึ่งพาต้นไม้เหมือนกันซึ่งไฟล์หนึ่งเป็นผลลัพธ์ของการสร้างอื่น ๆ สิ่งนี้จะแสดงผลกลับเป็น C เมื่อจัดการกับไฟล์ส่วนหัว make
ต้องการmake
ไฟล์ -specific include ที่จะสร้างขึ้นเพื่อแสดงถึงการขึ้นต่อกันของไฟล์ C ในไฟล์ส่วนหัวดังนั้นการเปลี่ยนแปลงที่เกิดขึ้นหลังจะทำให้ไฟล์ก่อนหน้าถูกสร้างใหม่ อย่างไรก็ตามเนื่องจากไฟล์ C นั้นไม่ได้ถูกสร้างขึ้นมาใหม่ (สร้างใหม่เพียงอย่างเดียว) จึงมักจะต้องระบุเป้าหมายเป็น.PHONY
ทำให้มักจะต้องระบุเป้าหมายเป็น โชคดีที่ GCC รองรับการสร้างไฟล์เหล่านั้นโดยอัตโนมัติ
ใน Java การพึ่งพาสามารถเป็นแบบวงกลมและไม่มีเครื่องมือสำหรับการสร้างคลาสที่พึ่งพาอัตโนมัติในmake
รูปแบบ ภารกิจant
ของมันDepend
สามารถอ่านไฟล์คลาสโดยตรงกำหนดคลาสที่อิมปอร์ตและลบไฟล์คลาสหากมีคลาสใดล้าสมัย หากไม่มีสิ่งนี้การพึ่งพาที่ไม่สำคัญอาจส่งผลให้คุณถูกบังคับให้ใช้การสร้างที่สะอาดซ้ำแล้วซ้ำอีกลบข้อดีของการใช้เครื่องมือสร้างออก
ช่องว่างในชื่อไฟล์
แม้ว่า Java หรือ C จะไม่สนับสนุนการใช้ช่องว่างในชื่อไฟล์ซอร์สโค้ดของคุณ แต่make
นี่อาจเป็นปัญหาแม้ว่าช่องว่างจะอยู่ในพา ธ ของไฟล์ C:\My Documents\My Code\program\src
พิจารณาตัวอย่างเช่นถ้ารหัสต้นฉบับของคุณที่มีอยู่ใน make
นี้จะเพียงพอที่จะทำลาย นี่เป็นเพราะmake
ถือว่าชื่อไฟล์เป็นสตริง ant
ถือว่าเส้นทางเป็นวัตถุพิเศษ
กำลังสแกนไฟล์เพื่อสร้าง
make
ต้องการการตั้งค่าอย่างชัดเจนว่าไฟล์ใดที่จะถูกสร้างขึ้นสำหรับแต่ละเป้าหมาย ant
อนุญาตให้ระบุโฟลเดอร์ที่จะสแกนอัตโนมัติสำหรับไฟล์ต้นฉบับ อาจดูเหมือนความสะดวกสบายเล็กน้อย แต่พิจารณาว่าใน Java แต่ละคลาสใหม่ต้องใช้ไฟล์ใหม่ การเพิ่มไฟล์เข้ากับโครงการอาจกลายเป็นเรื่องยุ่งยากอย่างรวดเร็ว
และปัญหาที่ใหญ่ที่สุดด้วยmake
:
make ขึ้นอยู่กับ POSIX
คำขวัญของ Java คือ "รวบรวมเมื่อทำงานทุกที่" แต่การ จำกัด การรวบรวมระบบที่ใช้ POSIX ซึ่งการสนับสนุน Java เป็นสิ่งที่เลวร้ายที่สุดไม่ใช่ความตั้งใจ
สร้างกฎในmake
เป็นbash
สคริปต์ขนาดเล็กเป็นหลัก แม้ว่าจะมีพอร์ตmake
ไปยัง Windows เพื่อให้สามารถทำงานได้อย่างถูกต้อง แต่จะต้องรวมกับพอร์ตbash
ซึ่งรวมถึงเลเยอร์การจำลอง POSIX สำหรับระบบไฟล์
มาในสองสายพันธุ์:
MSYS
ซึ่งพยายาม จำกัด การแปล POSIX เป็นเส้นทางของไฟล์และอาจมี gotchas ที่ไม่พึงประสงค์เมื่อใช้เครื่องมือภายนอกที่ไม่ได้สร้างขึ้นมาโดยเฉพาะสำหรับมัน
cygwin
ซึ่งให้การจำลอง POSIX ที่สมบูรณ์ อย่างไรก็ตามโปรแกรมที่ได้นั้นมีแนวโน้มที่จะยังคงใช้เลเยอร์จำลองนั้น
สำหรับเหตุผลที่บน Windows, การสร้างเครื่องมือมาตรฐานคือไม่ได้make
ที่ทุกคน แต่MSBuild
ที่ยังเป็นเครื่องมือที่ใช้ XML ant
ใกล้ชิดในหลักการที่จะ
ในทางตรงกันข้ามant
สร้างขึ้นใน Java สามารถเรียกใช้ทุกที่และมีเครื่องมือภายในที่เรียกว่า "งาน" สำหรับจัดการไฟล์และดำเนินการคำสั่งในลักษณะที่ไม่ขึ้นกับแพลตฟอร์ม มันเพียงพอที่หลากหลายจริงที่คุณสามารถมีเวลาได้ง่ายขึ้นการสร้างโปรแกรม C ใน Windows ใช้กว่าการใช้ant
make
และอีกอันหนึ่งรองสุดท้าย:
แม้แต่โปรแกรม C ก็ไม่ได้ใช้อย่างเป็นธรรมชาติ
คุณอาจจะไม่ได้แจ้งให้ทราบในขั้นต้นนี้ แต่โปรแกรม C Makefile
โดยทั่วไปจะไม่ได้มาพร้อมกับ พวกเขาจะมาพร้อมกับCMakeLists.txt
หรือสคริปต์การกำหนดค่าซึ่งจะสร้างที่เกิดขึ้นจริงbash
Makefile
ในทางตรงกันข้ามแหล่งที่มาของโปรแกรม Java ที่สร้างโดยใช้ant
นั้นมาพร้อมกับant
สคริปต์ที่สร้างไว้ล่วงหน้า A Makefile
เป็นผลิตภัณฑ์ของเครื่องมืออื่น ๆ - นั่นคือจำนวนที่make
ไม่เหมาะสมที่จะเป็นเครื่องมือสร้างด้วยตัวเอง ant
เป็นแบบสแตนด์อโลนและจัดการกับทุกสิ่งที่คุณต้องการสำหรับกระบวนการสร้าง Java ของคุณโดยไม่มีข้อกำหนดเพิ่มเติมหรือการอ้างอิงใด ๆ
เมื่อคุณรันant
บนแพลตฟอร์มใด ๆ มันแค่ใช้งานได้ (tm) make
คุณไม่สามารถรับกับ มันขึ้นอยู่กับแพลตฟอร์มและการกำหนดค่าอย่างไม่น่าเชื่อ
make
สิ่งที่เฉพาะแพลตฟอร์มได้รับที่น่าอึดอัดใจมากที่จะจัดการใน และการมี makefile ที่ใช้งานได้ในระบบเดียวนั้นไม่ดีนักสำหรับภาษาข้ามแพลตฟอร์ม