Saya tidak memiliki jawaban untuk masalah yang tepat ini, tetapi saya dapat mencoba memberi Anda petunjuk tentang apa yang mungkin terjadi:Ketergantungan yang hilang di Makefiles.
Contoh:
target: a.bytecode b.bytecode
link a.bytecode b.bytecode -o target
a.bytecode: a.source
compile a.source -o a.bytecode
b.bytecode: b.source
compile b.source a.bytecode -o a.bytecode
Jika Anda memanggil make target
semuanya akan dikompilasi dengan benar. Kompilasi a.source
dilakukan (secara sewenang-wenang, tetapi secara deterministik) terlebih dahulu. Kemudian kompilasi b.source
dilakukan.
Tetapi jika Anda make -j2 target
keduanya compile
perintah akan dijalankan secara paralel. Dan Anda akan benar-benar menyadari bahwa dependensi Makefile Anda rusak. Kompilasi kedua mengasumsikan a.bytecode
sudah dikompilasi, tetapi tidak muncul di dependensi. Sehingga kemungkinan besar akan terjadi kesalahan. Baris ketergantungan yang benar untuk b.bytecode
seharusnya:
b.bytecode: b.source a.bytecode
Untuk kembali ke masalah Anda, jika Anda tidak beruntung, mungkin ada perintah yang menggantung di loop CPU 100%, karena ketergantungan yang hilang. Mungkin itulah yang terjadi di sini, dependensi yang hilang tidak dapat diungkapkan oleh build berurutan, tetapi telah diungkapkan oleh build paralel Anda.
Saya tidak tahu sudah berapa lama Anda memiliki mesin tersebut, tetapi rekomendasi pertama saya adalah mencoba tes memori dan memverifikasi bahwa memori berfungsi dengan baik. Saya tahu sering kali bukan memori yang menjadi masalah, tetapi jika ya, yang terbaik adalah menghilangkannya sebagai penyebab terlebih dahulu sebelum mencoba melacak kemungkinan masalah lainnya.
Saya menyadari ini adalah pertanyaan lama, tetapi masih muncul di bagian atas hasil penelusuran, jadi inilah solusi saya:
GNU make memiliki mekanisme server kerja untuk memastikan make dan turunan rekursifnya tidak menggunakan lebih dari jumlah core yang ditentukan:http://make.mad-scientist.net/papers/jobserver-implementation/
Itu bergantung pada pipa yang digunakan bersama oleh semua proses. Setiap proses yang ingin memotong anak tambahan harus terlebih dahulu mengkonsumsi token dari pipa, lalu melepaskannya setelah selesai. Jika proses turunan tidak mengembalikan token yang digunakannya, make while hang tingkat atas akan menunggu selamanya untuk dikembalikan.
https://bugzilla.redhat.com/show_bug.cgi?id=654822
Saya mengalami kesalahan ini saat membuat binutils dengan GNU make di kotak Solaris saya, di mana "sed" bukan GNU sed. Mengotak-atik PATH untuk membuat sed==gsed diprioritaskan daripada sistem sed memperbaiki masalah. Saya tidak tahu mengapa sed mengonsumsi token dari pipa.