Sé que puedo interrumpir un make
proceso en cualquier momento sin tener que volver a compilar todo el árbol de origen. Como sé, make
solo compila un objetivo si aún no está compilado o si el código fuente se modifica después de la última compilación.
Pero si lo interrumpo make
, seguramente habrá uno o más binarios a medias (dependiendo del nivel de concurrencia). ¿Qué hace con ellos la próxima vez que corro make
? ¿O termina el objetivo actual cuando presiono Ctrl+ Cpara evitar binarios parcialmente compilados?
11
Respuestas:
En términos simples, puede pensar
make
que tiene un número (posiblemente grande) de pasos, donde cada paso toma una cantidad de archivos como entrada y crea un archivo como salida.Un paso podría ser "compilar
file.c
afile.o
" o "usarld
para vincularmain.o
yfile.o
enprogram
". Si se interrumpemake
con CtrlC, entonces la etapa de ejecución actual se dará por terminado que (o debe) quitar el archivo de salida que estaba trabajando. Por lo general, no quedan "binarios a medio preparar".Cuando reinicie
make
, verá las marcas de tiempo de todos los archivos de entrada y salida y volverá a ejecutar los pasos donde:Esto generalmente significa que si un paso tarda mucho en ejecutarse (es raro en las computadoras modernas, pero el
ld
paso para programas grandes podría tomar fácilmente muchos minutos cuandomake
se diseñó), entonces detener y reiniciarmake
comenzará ese paso desde el principio.La realidad de su promedio
Makefile
es considerablemente más complicada que la descripción anterior, pero los fundamentos son los mismos.fuente
Ctrl+ Chace
SIGINT
que se envíe a al proceso en ejecución. Esta señal puede ser captada por el proceso. En el código fuente de make, puede encontrar una trampa para esta señal encommands.c
:remove_intermediates()
es la función de limpieza demake
, vea su definición aquí:Y más adelante en la función que ve, se eliminarán efectivamente:
Conclusión: en general, no tengas miedo de interrumpir una compilación con
make
. Si no es una señal que no se puede capturar (SIGKILL, SIGSEGV, SIGSTOP
), limpiará los archivos intermedios.fuente
SIGSEGV
es atrapable en muchos Unices.Cuando algo se detiene
make
(ya sea ctrl-C, apagado o incluso un comando que falla), el trabajo ya realizado permanece. Cuando se reinicia, lomake
hace como siempre: se da cuenta de lo que aún hay que hacer (porque un archivo cambiado omake
nunca tuvo que procesarse no importa) y continúa con el trabajo.La descripción anterior supone claramente que los
Makefile
s relevantes describen las dependencias y comandos para ejecutar correctamente, por lo que todo lo que se necesita (re) hacer es.fuente