Saya seorang pemula make
dan saya bertanya-tanya kapan harus menggunakannya make clean
.
Salah satu kolega memberi tahu saya bahwa penambahan build make
didasarkan pada stempel waktu file. Jadi, jika Anda checkout versi lama file di VCS Anda, itu akan memiliki cap waktu "lama" dan itu akan ditandai sebagai "tidak perlu mengkompilasi ulang file ini". Kemudian, file itu tidak akan dimasukkan dalam build berikutnya.
Menurut kolega yang sama, itu akan menjadi alasan untuk menggunakannya make clean
.
Ngomong-ngomong, saya kira-kira mendapat jawaban untuk pertanyaan "kapan harus menggunakan make clean
" dari pertanyaan StackExchange lainnya tetapi pertanyaan saya yang lain adalah:
Mengapa membangun tambahan menggunakan
make
mengandalkan stempel waktu file dan bukan pada SHA-1 misalnya? Git, misalnya, menunjukkan bahwa kita dapat berhasil menentukan apakah suatu file diubah menggunakan SHA-1.
Apakah itu untuk masalah kecepatan?
make
diciptakan pada 70-an. SHA-1 dibuat pada tahun 90-an. Git dibuat pada tahun 00-an. Hal terakhir yang Anda inginkan adalah beberapa bangunan tidak jelas yang bekerja selama 30 tahun tiba-tiba gagal karena seseorang memutuskan untuk menjadi modern dengan sistem yang telah dicoba dan diuji.make
maka perangkat lunak Anda tidak akan rusak, namunmake
berusaha untuk memiliki kompatibilitas ke belakang dalam versi baru. Mengubah perilaku inti tanpa alasan yang jelas merupakan kebalikan dari itu. Dan tanggal menunjukkan mengapa itu awalnya tidak dibuat untuk menggunakan SHA-1, atau mengapa itu tidak mudah untuk retrofit ketika sudah tersedia (make
sudah puluhan tahun saat itu).Jawaban:
Masalah yang jelas (dan bisa dibilang dangkal) adalah bahwa sistem build harus menyimpan catatan hash dari file yang digunakan untuk build terakhir. Meskipun masalah ini dapat dipecahkan, akan membutuhkan penyimpanan samping ketika informasi cap waktu sudah ada dalam sistem file.
Lebih serius lagi, hash tidak akan menyampaikan semantik yang sama. Jika Anda tahu bahwa file T dibangun dari dependensi D dengan hash H 1 dan kemudian mengetahui bahwa D sekarang hash ke H 2 , haruskah Anda membangun kembali T ? Mungkin ya, tapi bisa juga bahwa H 2 sebenarnya mengacu pada suatu tua versi dari file. Stempel waktu menentukan pemesanan sementara hash hanya dapat dibandingkan untuk kesetaraan.
Fitur yang didukung oleh cap waktu adalah Anda cukup memperbarui cap waktu (misalnya, menggunakan utilitas baris perintah POSIX
touch
) untuk mengelabuimake
bahwa ketergantungan telah berubah atau - lebih menariknya - target lebih baru dari yang sebenarnya. Sambil bermain dengan ini adalah kesempatan bagus untuk menembak diri sendiri, itu berguna dari waktu ke waktu. Dalam sistem berbasis hash, Anda akan memerlukan dukungan dari sistem build itu sendiri untuk memperbarui basis data internal hash yang digunakan untuk build terakhir tanpa benar-benar membangun apa pun.Sementara argumen pasti dapat dibuat untuk menggunakan hash dari waktu-perangko, poin saya adalah bahwa mereka bukan solusi yang lebih baik untuk mencapai tujuan yang sama tetapi solusi yang berbeda untuk mencapai tujuan yang berbeda. Mana dari tujuan-tujuan ini yang lebih diinginkan mungkin terbuka untuk diperdebatkan.
sumber
D
sekarang hash untukH2
, dan Anda tidak memiliki beberapa outputT2
dibangun dariD@H2
, Anda perlu memproduksi dan menyimpannya. Setelah itu, terlepas dari apa urutanD
beralih antaraH1
danH2
menyatakan, Anda akan dapat menggunakan output cache.Hashing seluruh proyek sangat lambat. Anda harus membaca setiap byte dari setiap file. Git tidak hash setiap file setiap kali Anda menjalankan yang
git status
baik. Checkout VCS juga tidak biasanya mengatur waktu modifikasi file ke waktu asli yang dibuat. Pemulihan cadangan akan terjadi, jika Anda berhati-hati melakukannya. Seluruh alasan filesystem memiliki cap waktu adalah untuk kasus-kasus penggunaan seperti ini.Pengembang biasanya berjalan
make clean
ketika dependensi tidak dilacak secara langsung oleh Makefile berubah. Ironisnya, ini biasanya termasuk Makefile itu sendiri. Biasanya juga termasuk versi kompiler. Bergantung pada seberapa baik Makefile Anda ditulis, itu bisa termasuk versi pustaka eksternal.Ini adalah hal-hal yang cenderung diperbarui ketika Anda melakukan pembaruan kontrol versi, sehingga sebagian besar pengembang hanya terbiasa menjalankan
make clean
pada saat yang sama, sehingga Anda tahu Anda mulai dari yang bersih. Anda dapat pergi tanpa sering melakukannya, tetapi sangat sulit untuk memprediksi waktu yang tidak dapat Anda lakukan.sumber
Beberapa poin tentang hash vs cap waktu di sistem bangun:
sumber