¿Existe una regla general para cuándo debes usar 'make clean' en lugar de solo 'make'?

11

Estoy escribiendo un programa de múltiples archivos en este momento, y aparentemente solo ejecuto 'make' (como uno pensaría intuitivamente que debe hacerse en la mayoría de las situaciones) por alguna razón hace que mi programa falle. Creo que puedo proporcionar más detalles del problema, pero lo importante es que se ejecuta cuando se usa 'make clean'. Así que me preguntaba si alguien conocía la regla general para ejecutar 'make clean' en lugar de solo 'make'

Templario oscuro
fuente

Respuestas:

17

Ejecuta make clean en dos situaciones: cuando desea empaquetar el código fuente (y por lo tanto no necesita / quiere los objetos creados) O cuando tiene alguna razón para creer que los objetos creados son malos.

En su caso, está utilizando 'make clean' para solucionar un problema que probablemente sea el resultado de un Makefile con errores. Algo allí no se está volviendo a compilar cuando debería, y eso está causando que el binario de salida sea malo.

Hay muchas razones que pueden suceder, dependiendo de la complejidad de su proyecto y de cómo ha utilizado make, pero lo esencial es que debe pasar algún tiempo depurando su Makefile.

Michael Kohne
fuente
66
Olvida "algún cambio en el entorno de compilación" como compilador actualizado, nuevas versiones de bibliotecas, etc. ¡Siempre es una buena idea "limpiar" en estos casos solo para asegurarse de que todos los módulos estén cantando desde la misma hoja de canción!
James Anderson el
2
@JamesAnderson Se podría argumentar que estas son simplemente instancias de Makefiles con errores.
Kristof Provost
44
@ KristofProvost: No estoy seguro de que clasificaría "Nuevo ABI" (posiblemente mediante la introducción de una nueva versión del compilador) como 'Makefile con errores'. Está lo suficientemente fuera del alcance de lo que esperaría que 'mirara' mirar.
Vatine
1
Es cierto, pero es posible (y no tan difícil) agregar el compilador a los archivos MAKE como requisito previo. Eso es suficiente para atrapar el problema. En general, no es un gran problema y es muy raro de todos modos. Lo hice porque utilicé (y escribí) archivos MAKE que tienen en cuenta los indicadores del compilador y demás. Eso también es bastante poco común en los archivos MAKE, pero es muy útil (más que verificar el compilador;)). Mis expectativas de buenos y bien escritos makefiles son bastante altas. Mis expectativas sobre el archivo MAKE promedio son bastante bajas ...
Kristof Provost
8

Estoy de acuerdo con la respuesta de Michael Kohne en general. Agregaría que necesita leer los documentos de instalación para saber qué hace realmente "make clean". Puede haber diferentes niveles de limpieza que necesite usar, como "make realclean" y "make distclean". Hay convenciones informales para estos, pero nada tallado en piedra.

Bill Ruppert
fuente
2
+1: "necesita leer los documentos de instalación para saber qué hace realmente" make clean "". No hay una "regla general". Tienes que leer los documentos.
S.Lott
5

Entiendo que este es tu proyecto, así que es tu makefile. Mi objetivo es tener make siempre una compilación correcta, si es posible producirla. Si make cleanes necesario recuperarse de alguna condición, entonces, en mi opinión, makefileestá mal y debe corregirse. Si sus dependencias se han calculado correctamente, entonces un simple makedebería recompilar todo lo que necesita ser recompilado.

Kevin Cline
fuente
2
Estoy de acuerdo. Ya no es un problema en estos días de espacio en disco casi infinito, pero tengo la edad suficiente para recordar cuándo se usaron clean y make realclean principalmente para ahorrar espacio en disco después de que se creó el ejecutable vinculado. Hacer GCC, apache, perl, etc. dejó muchas cosas por ahí.
Bill Ruppert
1

Ejecutaría "make clean" antes de una construcción nocturna. En ese caso, el tiempo adicional que lleva hacer una compilación completa probablemente no importará mucho, pero la seguridad adicional que obtendrá al asegurarse de que todo esté en la versión correcta probablemente valga la pena.

Zachary K
fuente
Eso dependerá del tamaño de su proyecto. Donde solía trabajar, una construcción incremental demoraría de 2 a 4 horas con los cambios de otros sitios que se realizaban de la noche a la mañana. Una construcción limpia puede tomar de 7 a 9 horas. Además de eso, a veces teníamos 2 o 3 ramas que querríamos construir. Incluso en máquinas rápidas, las bases de código muy grandes deben tratarse de manera muy diferente a las más pequeñas.
TafT