นี่คือคำสั่ง makepp_build_algorithm ที่สามารถเรียกใช้ในผู้ให้บริการโฮสติ้งฟรีของ OnWorks โดยใช้หนึ่งในเวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS
โครงการ:
ชื่อ
makepp_build_algorithm -- วิธีที่ makepp รัน makefile
DESCRIPTION
ภายในของ Makepp แตกต่างจาก Unix มาตรฐานที่ทำในลักษณะพื้นฐาน หน้านี้
อธิบายปรัชญาต่างๆ อย่างละเอียด
ย้อนกลับ เมื่อเทียบกับ ข้างหน้า การอนุมาน
Makepp ทำงานในทิศทางตรงกันข้ามกับ Unix มาตรฐาน เครื่อง Unix แบบดั้งเดิม
ถูกกำหนดเป้าหมายให้สร้าง แล้วพบกฎที่ตรงกับอักขระใน
ชื่อไฟล์เป้าหมาย หากเป้าหมายเก่ากว่าการขึ้นต่อกันของกฎ แสดงว่าเป้าหมายนั้น
ถูกสร้างใหม่
ตัวอย่างเช่น พิจารณากฎรูปแบบนี้:
%.o: %.cxx
$(CXX) $(CXXFLAGS) -c $(อินพุต) -o $(เอาต์พุต)
เมื่อ make ตระหนักว่าจำเป็นต้องสร้างไฟล์ชื่อ "xyz.o" มันจะค้นหาผ่านรายการของ
รูปแบบกฎจนกว่าจะเห็นว่า "xyz.o" ตรงกับรูปแบบ "%.o" แล้วจึงนำไปใช้
กฎนี้
Makepp ทำงานในทิศทางตรงกันข้าม อันดับแรกจะคำนวณไฟล์ทั้งหมดที่เป็นไปได้
สร้างโดยใช้กฎที่ตรงกับอักขระในชื่อไฟล์การพึ่งพา แล้วเมื่อไหร่
มันจำเป็นต้องสร้างไฟล์ มันแค่ดูว่ามันเป็นหนึ่งในไฟล์ที่มันรู้
วิธีการสร้าง รายการไฟล์ที่รู้จักจะถูกจัดเก็บตามชื่อไฟล์ที่แน่นอน
เมื่อ makepp พบกฎรูปแบบข้างต้น มันจะค้นหาไฟล์ทั้งหมดในไดเร็กทอรี
ตรงกับรูปแบบ "%.cxx" (เช่น "*.cxx") สำหรับแต่ละไฟล์เหล่านี้ มันจะจำ
ที่สามารถสร้างไฟล์ ".o" ที่สอดคล้องกันได้ ถ้าในเวลาต่อมา makepp พบว่ามัน
สามารถสร้างไฟล์ ".cxx" อื่นที่ไม่มีอยู่ได้ กฎนี้จะถูกนำมาใช้ด้วย
และไฟล์ ".o" ที่เกี่ยวข้องจะถูกทำเครื่องหมาย
สิ่งนี้อาจดูไม่มีประสิทธิภาพ แต่กลับกลายเป็นว่าไม่ช้าในกรณีส่วนใหญ่
และมักจะเป็นความจริงที่ไฟล์เกือบทั้งหมดที่สามารถสร้างได้นั้นสร้างขึ้นจริง
และการรู้รายการไฟล์ทั้งหมดที่สามารถสร้างได้นั้นมีข้อดีหลายประการ:
· Wildcards สามารถจับคู่ไฟล์ที่ยังไม่มี แต่สามารถสร้างได้
· ไฟล์ส่วนหัวที่ตรวจพบโดยเครื่องสแกนการขึ้นต่อกันอัตโนมัติไม่มี
ออก; makepp รู้ว่าพวกเขาจะอยู่ที่ไหน (วิธีแก้ไขปัญหาอื่น ๆ ส่วนใหญ่สำหรับปัญหานี้
สมมติว่าส่วนหัวใด ๆ ที่ยังไม่มีอยู่ในไดเร็กทอรีปัจจุบัน)
· คลังเก็บใช้งานได้ง่ายกว่ามาก เนื่องจาก makepp รู้ล่วงหน้าว่าไฟล์อะไร
สามารถทำได้ (ดูรายละเอียดที่ makepp_repositories)
· สามารถกำหนดได้อย่างง่ายดายว่าไฟล์ใดที่สามารถสร้างได้ (ดูที่
ฟังก์ชัน "$(only_targets )"
· ฟังก์ชั่น "$(infer_objects)" ของ Makepp นั้นง่ายขึ้นอย่างมากโดยรู้ว่าอ็อบเจกต์คืออะไร
ใช้ได้
ไฟล์ เมื่อเทียบกับ เกี่ยวกับใจความ รูปแบบ
Makepp เชื่อมโยงคำสั่ง build กับไฟล์เป้าหมาย ไม่ใช่รูปแบบข้อความสำหรับ a
ชื่อไฟล์. ดังนั้นจึงไม่สับสนกับชื่อที่ต่างกันสำหรับไฟล์เดียวกัน ดังนั้น สำหรับ
ตัวอย่างเช่น makepp จะรู้ว่า "./xyz" และ "xyz" เป็นไฟล์เดียวกัน ในขณะที่ make . อื่น
สาธารณูปโภคอาจไม่
นี่เป็นสิ่งสำคัญอย่างยิ่งเพราะ (ต่างจากยี่ห้อมาตรฐาน) makepp โหลด makefiles
จากไดเร็กทอรีต่างๆ เพื่อให้ makefiles ค่อนข้างเป็นอิสระด้วย
ไม่มีตำแหน่งพิเศษที่กำหนดให้กับ makefile ระดับบนสุด แต่ละ makefile หมายถึงไฟล์ทั้งหมด
สัมพันธ์กับไดเร็กทอรีของตัวเอง ดังนั้นหากคุณโหลด makefile จากไดเรกทอรีย่อย
"other_stuff" และ makefile นั้นหมายถึง "../xyz" makepp จะตระหนักอีกครั้งว่า
ไฟล์เดียวกันที่อ้างถึงข้างต้น (มันจะไม่สับสนกับไดเร็กทอรีซอฟต์ลิงค์
ชื่อ.)
เก็บไว้ สร้าง ข้อมูล
Makepp เก็บข้อมูลมากขึ้นเกี่ยวกับแต่ละไฟล์ที่สร้างขึ้นนอกเหนือจากวันที่
ตราประทับ (ซึ่งเป็นสิ่งที่มาตรฐานให้ความสำคัญ) ข้อมูลนี้รวมถึง:
· ลายเซ็นของไฟล์นี้ในบิลด์ล่าสุด ดังนั้นเราจึงรู้ว่าไฟล์นั้นมี
การเปลี่ยนแปลง
· ชื่อของไฟล์การพึ่งพาแต่ละไฟล์ รวมถึงไฟล์และไฟล์อื่นๆ ที่อนุมาน
โดยอัตโนมัติ หากรายการนี้เปลี่ยนแปลง makepp จะถือว่าจำเป็นต้องสร้างใหม่
·ลายเซ็นของการพึ่งพาแต่ละครั้ง ด้วยวิธีนี้ makepp รู้ที่จะสร้างใหม่ไม่เพียงแต่เมื่อ
การขึ้นต่อกันนั้นใหม่กว่าเป้าหมาย แต่เมื่อพวกมันเปลี่ยนไปเลย สิ่งนี้ยังทำให้
มันเป็นไปได้ที่จะใช้ลายเซ็นประเภทอื่น ๆ เช่น checksums เข้ารหัสแทน
กว่าวันที่ไฟล์
· คำสั่ง build ทั้งหมด (และ cwd) วิธีนี้หากคุณเปลี่ยนคำสั่ง build
(เช่นเปลี่ยนตัวเลือกคอมไพเลอร์) makepp รู้ที่จะสร้างใหม่แม้ว่าไฟล์
ตัวเองไม่ได้เปลี่ยนแปลง
· สถาปัตยกรรม. หากคุณคอมไพล์โปรแกรมของคุณบน Linux แล้วเปลี่ยนเป็น
Solaris, makepp รู้โดยอัตโนมัติเพื่อคอมไพล์ทุกอย่างใหม่
Makepp สร้างไดเร็กทอรีย่อยในทุกไดเร็กทอรีที่เรียกว่า ".makepp" NS
สร้างข้อมูลสำหรับไฟล์ ชื่อไฟล์ ในไดเร็กทอรีถูกเก็บไว้ใน .makepp/ชื่อไฟล์. ถ้า
คุณลบไดเร็กทอรีย่อยนี้หรือแก้ไขไฟล์ makepp จะสร้างไฟล์ที่ได้รับผลกระทบใหม่ทั้งหมด
โดยปริยาย โหลด
หาก makepp พยายามสร้างเป้าหมายในไดเร็กทอรีและยังไม่มีกฎเกณฑ์
หรือหากกำลังค้นหาไฟล์ที่ตรงกับไวด์การ์ดในไดเร็กทอรี มันจะดูในนั้น
ไดเร็กทอรีเพื่อดูว่ามี makefile อยู่หรือไม่ ถ้าเป็นเช่นนั้น makefile จะถูกโหลด
อัตโนมัติ
ซึ่งหมายความว่าโดยปกติคุณไม่จำเป็นต้องบอก makepp อย่างชัดเจนว่าจะหาได้ที่ไหน
makefiles--สิ่งที่คุณต้องทำคืออ้างอิงไฟล์ในไดเร็กทอรีอื่นและ makepp will
ค้นหาวิธีสร้างโดยอัตโนมัติ
การโหลดโดยนัยจะเกิดขึ้นก็ต่อเมื่อไดเร็กทอรีสามารถเขียนถึงคุณได้ ดังนั้นหากคุณต้องการ
ป้องกันไม่ให้ makepp พยายามสร้างสิ่งต่าง ๆ ที่ไม่เคยเปลี่ยนแปลง เพียงแค่ทำ
ไดเร็กทอรีแบบอ่านอย่างเดียว
การโหลดโดยนัยจะไม่เกิดขึ้นหากคุณอยู่ในต้นไม้ใต้ a ไฟล์ RootMakepp (.mk) และ
makefile อื่นอยู่นอกต้นไม้นั้น หากคุณต้องการสิ่งนี้เพียงครั้งเดียว คุณสามารถให้
ตัวเลือก "--do-build="" เพื่อ makepp เพื่อให้ทุกอย่างภายนอกทรีสามารถสร้างได้ ถ้าคุณ
ต้องการสิ่งนี้เสมอ คุณสามารถใส่คำสั่ง "load_makefile" ไว้ที่ใดที่หนึ่งในทรี
เชื่อมต่อกับต้นไม้อย่างชัดเจน
หากการโหลดโดยนัยขัดขวางคุณ (เช่น makepp โหลด makefile มากเกินไปและทำให้สิ้นเปลือง
เวลา มิฉะนั้น คุณไม่ต้องการให้พยายามสร้างสิ่งทั้งหมดที่อธิบายไว้ใน
makefiles) คุณสามารถปิดมันสำหรับไดเร็กทอรีทั้งหมดโดยใช้คำสั่ง "--noimplicit_load"
ตัวเลือกบรรทัด หรือคุณสามารถปิดสำหรับไดเร็กทอรีที่เลือกโดยใช้ "no_implicit_load"
คำสั่งใน makefile ของคุณ
ใช้ makepp_build_algorithm ออนไลน์โดยใช้บริการ onworks.net