Come si fa a continuare la compilazione?


11

So che posso interrompere un makeprocesso in qualsiasi momento senza dover ricompilare nuovamente l'intero albero dei sorgenti. Come so, makecompila un target solo se non è stato ancora compilato, oppure il codice sorgente viene modificato dopo l'ultima compilazione.
Ma se interrompo make, ci saranno sicuramente uno o più binari mezzo pronti (a seconda del livello di concorrenza). Cosa ci fa la prossima volta che corro make? Oppure termina l'obiettivo corrente quando premo Ctrl+ Cper evitare i binari parzialmente compilati?


2
Principalmente devi preoccuparti solo se il computer si è spento inaspettatamente. Alcune volte il mio Ubuntu è riuscito a entrare in un deadlock del kernel (o qualunque cosa sia) e ha lasciato binari mezzo pronti, che alla fine hanno perso più di due ore.
Alvin Wong,

Risposte:


12

In termini semplici, puoi pensare di makeavere un numero (possibilmente grande) di passaggi, in cui ogni passaggio prende un numero di file come input e crea un file come output.

Un passaggio potrebbe essere "compilare file.cin file.o" o "utilizzare ldper collegare main.oe file.oin program". Se si interrompe makecon CtrlC, il passaggio attualmente in esecuzione verrà terminato che rimuoverà (o dovrebbe) il file di output su cui stava lavorando. Di solito non ci sono "binari semi pronti" lasciati indietro.

Al riavvio make, esaminerà i timestamp di tutti i file di input e output e eseguirà nuovamente i passaggi in cui:

  • un file di input ha un timestamp più recente rispetto al file di output
  • il file di output non esiste

Questo in genere significa che se l'esecuzione di un passaggio richiede molto tempo (è raro sui computer moderni, ma il ldpassaggio per programmi di grandi dimensioni potrebbe facilmente richiedere molti minuti quando è makestato progettato), quindi l'arresto e il riavvio makericominceranno dall'inizio.

La realtà della tua media Makefileè considerevolmente più complicata della descrizione sopra, ma i fondamenti sono gli stessi.


8

Ctrl+ Ccausa l' SIGINTinvio di a al processo in esecuzione. Questo segnale può essere catturato dal processo. Nel codice sorgente make puoi trovare una trap per questo segnale in 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()è la funzione di pulizia di make, vedi la sua definizione qui:

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

E più avanti nella funzione che vedi, saranno effettivamente cancellati:

status = unlink (f->name);

Conclusione: generalmente non abbiate paura di interrompere una compilation con make. Se non è un segnale inattaccabile ( SIGKILL, SIGSEGV, SIGSTOP) eseguirà una pulizia dei file intermedi.


1
SIGSEGVè acquistabile su molti Unices.
Chris Down,

1

Quando qualcosa si interrompe make(sia esso ctrl-C, spegnimento o anche un comando che non riesce), il lavoro già fatto rimane. Quando viene riformulato, makefa come sempre: capisce cosa deve ancora essere fatto (perché un file è cambiato o makenon è mai stato necessario elaborarlo, non importa) e continua con il lavoro.

La descrizione di cui sopra presume chiaramente che i relativi Makefiledescrivono le dipendenze e i comandi per eseguire correttamente, quindi tutto ciò che deve essere (ri) creato è.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.