Derlemeye nasıl devam edilir?


11

makeKaynak ağacın tamamını yeniden derlemek zorunda kalmadan bir süreci her zaman kesintiye uğratabileceğimi biliyorum . Bildiğim gibi, makesadece henüz derlenmemişse veya kaynak kod son derlemeden sonra değiştirilirse bir hedef derler.
Ama araya girersem make, kesinlikle (eşzamanlılık seviyesine bağlı olarak) yarı hazır ikili dosyalar olacaktır. Bir dahaki sefere koştuğumda onlarla ne yapıyor make? Yoksa kısmen derlenmiş ikili dosyaları önlemek için Ctrl+ tuşuna Cbastığımda geçerli hedefi bitiriyor mu?


2
Çoğunlukla sadece bilgisayar beklenmedik bir şekilde kapanırsa endişelenmeniz gerekir. Birkaç kez Ubuntu çekirdeği kilitlenmeye (ya da her neyse) girmeyi başardı ve iki saatten fazla zaman kaybeden yarı hazır ikili dosyaları bıraktı.
Alvin Wong

Yanıtlar:


12

Basit bir ifadeyle, make(muhtemelen büyük) sayıda adım olması düşünülebilir , burada her adım birkaç dosyayı girdi olarak alır ve çıktı olarak bir dosya oluşturur.

Bir adım "derlemek olabilir file.ciçin file.oya da" kullanımı " ldbağlantısına main.ove file.oiçine program". Eğer keserseniz makeile CtrlC, daha sonra şu anda yürütülen aşama (veya gerekir) o üzerinde çalıştığı çıkış dosyası kaldıracaktır hangi sonlandırılacaktır. Genellikle geride "yarı hazır ikili" yoktur.

Yeniden makebaşlattığınızda, tüm giriş ve çıkış dosyalarının zaman damgalarına bakar ve aşağıdaki adımları yeniden çalıştırır:

  • bir girdi dosyasının çıktı dosyasından daha yeni bir zaman damgası var
  • çıktı dosyası mevcut değil

Bu genellikle bir adımın çalışması uzun zaman alırsa (modern bilgisayarlarda nadirdir, ancak ldbüyük programlar için adım maketasarlandığında kolayca birkaç dakika sürebilir ), o zaman durdurma ve yeniden makebaşlatma bu adımı baştan başlayacaktır.

Ortalamanızın gerçekliği Makefile, yukarıdaki tanımdan önemli ölçüde daha karmaşıktır, ancak temeller aynıdır.


8

Ctrl+ , çalışmakta olan işleme Cbir a SIGINTgönderilmesine neden olur . Bu sinyal işlem tarafından yakalanabilir. Kaynak kodunu oluştur'da bu sinyal için bir tuzak bulabilirsiniz 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()temizleme işlevidir, maketanımına bakın:

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

Ve daha sonra gördüğünüz fonksiyonda, etkili bir şekilde silinecekler:

status = unlink (f->name);

Sonuç: Genelde derlemeyi kesmekten korkmayın make. Eğer erişilemeyen bir sinyal ( SIGKILL, SIGSEGV, SIGSTOP) değilse , ara dosyaların temizlenmesi gerekir.


1
SIGSEGVbirçok Unices üzerinde kullanılabilir.
Chris Down

1

Bir şey durduğunda make(ctrl-C, kapatma veya hatta başarısız olan bir komut olsun), zaten yapılan iş kalır. Yeniden makeifade edildiğinde, her zaman olduğu gibi yapar: hala yapılması gerekenleri anlar (çünkü bir dosya değişti veya makehiç işlenmemelidir) ve işe devam eder.

Yukarıdaki açıklama, ilgili Makefiles'nin doğru bir şekilde yürütmek için bağımlılıkları ve komutları açıkladığını açıkça göstermektedir , bu yüzden yapılması gereken (yeniden) yapılması gereken tek şey budur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.