Bagaimana cara membuat kompilasi lanjutan?

11

Saya tahu bahwa saya dapat menghentikan makeproses kapan saja tanpa harus mengkompilasi ulang seluruh pohon sumber lagi. Seperti yang saya tahu, makehanya mengkompilasi target jika belum dikompilasi, atau kode sumber dimodifikasi setelah kompilasi terakhir.
Tetapi jika saya menyela make, pasti akan ada satu atau lebih (tergantung pada tingkat konkurensi) binari setengah jadi. Apa hubungannya dengan mereka saat saya menjalankan berikutnya make? Atau apakah itu menyelesaikan target saat ini ketika saya menekan Ctrl+ Cuntuk menghindari biner yang dikompilasi sebagian?

psimon
sumber
2
Sebagian besar Anda hanya perlu khawatir jika komputer dimatikan secara tidak terduga. Beberapa kali Ubuntu saya berhasil mendapatkan kebuntuan kernel (atau apa pun itu) dan meninggalkan binari setengah jadi, yang akhirnya menghabiskan lebih dari dua jam.
Alvin Wong

Jawaban:

12

Secara sederhana, Anda dapat makedianggap memiliki sejumlah (mungkin besar) langkah, di mana setiap langkah mengambil sejumlah file sebagai input dan membuat satu file sebagai output.

Langkah mungkin "kompilasi file.cke file.o" atau "gunakan lduntuk menautkan ke main.odan ". Jika Anda mengganggu dengan , maka langkah saat ini melaksanakan akan dihentikan yang akan (atau harus) menghapus file output itu bekerja pada. Biasanya tidak ada "binari setengah jadi" yang tertinggal.file.oprogrammakeCtrlC

Ketika Anda me-restart make, itu akan melihat cap waktu dari semua file input dan output dan jalankan kembali langkah-langkah di mana:

  • file input memiliki stempel waktu yang lebih baru daripada file output
  • file output tidak ada

Ini umumnya berarti bahwa jika suatu langkah membutuhkan waktu lama untuk dijalankan (jarang terjadi pada komputer modern, tetapi ldlangkah untuk program besar dapat dengan mudah memakan waktu beberapa menit ketika makedirancang), kemudian berhenti dan memulai kembali makeakan memulai langkah itu dari awal.

Realitas rata-rata Anda Makefilejauh lebih rumit daripada deskripsi di atas, tetapi dasarnya sama.

Greg Hewgill
sumber
8

Ctrl+ Cmenyebabkan a SIGINTdikirim ke proses yang sedang berjalan. Sinyal ini bisa ditangkap oleh proses. Dalam kode sumber make Anda dapat menemukan jebakan untuk sinyal ini di 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()adalah fungsi pembersihan make, lihat definisi di sini:

/* 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.  */

Dan kemudian pada fungsi yang Anda lihat, mereka akan dihapus secara efektif:

status = unlink (f->name);

Kesimpulan: Secara umum jangan takut mengganggu kompilasi dengan make. Jika ini bukan sinyal yang tidak dapat ditembus ( SIGKILL, SIGSEGV, SIGSTOP) itu akan melakukan pembersihan file perantara.

kekacauan
sumber
1
SIGSEGVdapat ditangkap di banyak Unices.
Chris Down
1

Ketika sesuatu berhenti make(baik itu ctrl-C, shutdown, atau bahkan perintah yang gagal), pekerjaan yang sudah dilakukan tetap. Ketika disajikan kembali, makelakukan seperti biasa: ia mengetahui apa yang masih perlu dilakukan (karena file berubah atau maketidak pernah harus diproses tidak masalah) dan melanjutkan pekerjaan.

Uraian di atas dengan jelas mengira yang relevan Makefilemenggambarkan dependensi dan perintah untuk dieksekusi dengan benar, jadi semua yang perlu dibuat (kembali) adalah.

vonbrand
sumber