ทำการรวบรวมต่อไปอย่างไร


11

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


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

คำตอบ:


12

ในแง่ง่ายคุณสามารถคิดว่าmakeมีขั้นตอน (อาจใหญ่) ซึ่งแต่ละขั้นตอนใช้จำนวนไฟล์เป็นอินพุตและสร้างหนึ่งไฟล์เป็นเอาต์พุต

ขั้นตอนอาจเป็น "คอมไพล์file.cถึงfile.o" หรือ "ใช้ldเพื่อลิงก์main.oและfile.oเข้าสู่program" หากคุณขัดจังหวะmakeด้วยCtrlCขั้นตอนการดำเนินการในปัจจุบันจะถูกยกเลิกซึ่งจะ (หรือควร) ลบไฟล์เอาต์พุตที่ทำงานอยู่ โดยทั่วไปจะไม่มี "ไบนารีพร้อมครึ่ง" ที่เหลืออยู่

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

  • ไฟล์อินพุตมีการประทับเวลาใหม่กว่าไฟล์เอาต์พุต
  • ไฟล์เอาต์พุตไม่มีอยู่

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

ความเป็นจริงของค่าเฉลี่ยของคุณMakefileนั้นซับซ้อนกว่าคำอธิบายข้างต้นอย่างมาก แต่ปัจจัยพื้นฐานเหมือนกัน


8

Ctrl+ Cทำให้ a SIGINTถูกส่งไปยังกระบวนการที่กำลังทำงานอยู่ กระบวนการนี้สามารถจับสัญญาณได้ ในซอร์สโค้ด make คุณสามารถค้นหากับดักสำหรับสัญญาณนี้ได้commands.c:

  /* If we got a signal that means the user
     wanted to kill make, remove pending targets.  */

  if (sig == SIGTERM || sig == SIGINT

  ... remove childrens ...

  /* Delete any non-precious intermediate files that were made.  */

  remove_intermediates (1);

remove_intermediates()เป็นฟังก์ชันการล้างข้อมูลmakeให้ดูนิยามของมันที่นี่:

/* Remove all nonprecious intermediate files.
   If SIG is nonzero, this was caused by a fatal signal,
   meaning that a different message will be printed, and
   the message will go to stderr rather than stdout.  */

และหลังจากนั้นในฟังก์ชั่นที่คุณเห็นมันจะถูกลบอย่างมีประสิทธิภาพ:

status = unlink (f->name);

สรุป: โดยทั่วไปไม่ต้อง affraid makeขัดจังหวะการสะสมด้วย หากไม่ใช่สัญญาณที่จับไม่ได้ ( SIGKILL, SIGSEGV, SIGSTOP) จะทำการล้างไฟล์กลาง


1
SIGSEGVสามารถจับได้ใน Unices หลายแห่ง
Chris Down

1

เมื่อบางสิ่งหยุดทำงานmake(ไม่ว่าจะเป็น ctrl-C, shutdown หรือแม้กระทั่งคำสั่งที่ล้มเหลว) งานที่ทำไปแล้วจะยังคงอยู่ เมื่อทำการปรับปรุงใหม่ให้makeทำเช่นเคย: มันจะระบุสิ่งที่ยังต้องทำ (เพราะไฟล์ที่เปลี่ยนแปลงหรือmakeไม่ได้ทำการประมวลผลไม่สำคัญ) และทำงานต่อไป

คำอธิบายข้างต้นเข้าใจอย่างชัดเจนว่าผู้ที่เกี่ยวข้องMakefileอธิบายการพึ่งพาและคำสั่งในการดำเนินการอย่างถูกต้องดังนั้นสิ่งที่จำเป็นต้องทำคือ

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