¿Cómo se hace continuar la compilation?

Sé que puedo interrumpir un process de make cualquier momento sin tener que recomstackr todo el tree fuente nuevamente. Como sé, make solo comstack un objective si aún no está comstackdo, o el código fuente se modifica después de la última compilation.
Pero si interrumpo la make , seguramente habrá uno o más (según el nivel de concurrency) binarys medio listos. ¿Qué hace con ellos la próxima vez que corro? ¿O termina el objective actual cuando presiono Ctrl + C para evitar los binarys comstackdos en parte?

En términos simples, puede pensar en make que tenga un número (posiblemente grande) de pasos, donde cada paso toma una cantidad de files como input y crea un file como salida.

Un paso podría ser "comstackr file.c to file.o " o "use ld para vincular main.o y file.o en el program ". Si interrumpe la make con Ctrl C , se terminará el paso que se está ejecutando y que eliminará (o debería) el file de salida en el que estaba trabajando. Por lo general, no quedan "binarys medio listos".

Cuando reinicies make , mirará las marcas de time de todos los files de input y salida y volverá a ejecutar los pasos donde:

  • un file de input tiene una timestamp más nueva que el file de salida
  • el file de salida no existe

Esto generalmente significa que si un paso tarda mucho time en ejecutarse (es raro en las computadoras modernas, pero el paso ld para progtwigs grandes podría demorar varios minutos cuando se diseñó make ), entonces detener y reiniciar make iniciará ese paso desde el comenzando.

La realidad de su Makefile promedio es considerablemente más complicada que la descripción anterior, pero los fundamentos son los mismos.

Ctrl + C hace que se envíe un SIGINT al process en ejecución. Esta señal puede ser captada por el process. En el código fuente make puedes encontrar una trampa para esta señal en 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() es la function de limpieza de make , ver su definición aquí:

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

Y más adelante en la function que ves, se eliminarán de manera efectiva:

 status = unlink (f->name); 

Conclusión: en general, no tengas miedo de interrumpir una compilation con make . Si no es una señal imposible de detectar ( SIGKILL, SIGSEGV, SIGSTOP ), se realizará una limpieza de los files intermedios.

Cuando algo se detiene (ya sea ctrl-C, shutdown o incluso un command que falla), el trabajo ya hecho permanece. Cuando se replantea, make hace como siempre: se da count de lo que aún debe hacerse (porque un file cambió o nunca llegó a tenerlo procesado no importa) y continúa con el trabajo.

La descripción anterior supone claramente que los Makefile relevantes describen las dependencies y los commands para ejecutarlos correctamente, por lo que todo lo que necesita (re) es.