Saya tahu bahwa saya dapat menghentikan make
proses kapan saja tanpa harus mengkompilasi ulang seluruh pohon sumber lagi. Seperti yang saya tahu, make
hanya 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?
11
Jawaban:
Secara sederhana, Anda dapat
make
dianggap memiliki sejumlah (mungkin besar) langkah, di mana setiap langkah mengambil sejumlah file sebagai input dan membuat satu file sebagai output.Langkah mungkin "kompilasi
file.c
kefile.o
" atau "gunakanld
untuk menautkan kemain.o
dan ". 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.o
program
make
CtrlCKetika Anda me-restart
make
, itu akan melihat cap waktu dari semua file input dan output dan jalankan kembali langkah-langkah di mana:Ini umumnya berarti bahwa jika suatu langkah membutuhkan waktu lama untuk dijalankan (jarang terjadi pada komputer modern, tetapi
ld
langkah untuk program besar dapat dengan mudah memakan waktu beberapa menit ketikamake
dirancang), kemudian berhenti dan memulai kembalimake
akan memulai langkah itu dari awal.Realitas rata-rata Anda
Makefile
jauh lebih rumit daripada deskripsi di atas, tetapi dasarnya sama.sumber
Ctrl+ Cmenyebabkan a
SIGINT
dikirim ke proses yang sedang berjalan. Sinyal ini bisa ditangkap oleh proses. Dalam kode sumber make Anda dapat menemukan jebakan untuk sinyal ini dicommands.c
:remove_intermediates()
adalah fungsi pembersihanmake
, lihat definisi di sini:Dan kemudian pada fungsi yang Anda lihat, mereka akan dihapus secara efektif:
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.sumber
SIGSEGV
dapat ditangkap di banyak Unices.Ketika sesuatu berhenti
make
(baik itu ctrl-C, shutdown, atau bahkan perintah yang gagal), pekerjaan yang sudah dilakukan tetap. Ketika disajikan kembali,make
lakukan seperti biasa: ia mengetahui apa yang masih perlu dilakukan (karena file berubah ataumake
tidak pernah harus diproses tidak masalah) dan melanjutkan pekerjaan.Uraian di atas dengan jelas mengira yang relevan
Makefile
menggambarkan dependensi dan perintah untuk dieksekusi dengan benar, jadi semua yang perlu dibuat (kembali) adalah.sumber