Sé que puedo interrumpir un makeproceso en cualquier momento sin tener que volver a compilar todo el árbol de origen. Como sé, makesolo 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
makeque 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.cafile.o" o "usarldpara vincularmain.oyfile.oenprogram". Si se interrumpemakecon 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
ldpaso para programas grandes podría tomar fácilmente muchos minutos cuandomakese diseñó), entonces detener y reiniciarmakecomenzará ese paso desde el principio.La realidad de su promedio
Makefilees considerablemente más complicada que la descripción anterior, pero los fundamentos son los mismos.fuente
Ctrl+ Chace
SIGINTque 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
SIGSEGVes 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, lomakehace como siempre: se da cuenta de lo que aún hay que hacer (porque un archivo cambiado omakenunca tuvo que procesarse no importa) y continúa con el trabajo.La descripción anterior supone claramente que los
Makefiles relevantes describen las dependencias y comandos para ejecutar correctamente, por lo que todo lo que se necesita (re) hacer es.fuente