instalar - makefile 112 makeopts no existe el fichero o el directorio
¿Anular objetivo en makefile para agregar más comandos? (6)
Agregando otra solución posible que he visto para la posteridad ... Sé que el OP era cauteloso sobre cambiar el archivo MAKE común, pero algo como esto funciona e implica cambios mínimos.
archivo makefile local 1:
CLEAN=MyExe1 MyExe2
....
include /my/common/makefile
local makefile 2:
CLEAN=MyExe3 MyExe4
....
include /my/common/makefile
archivo MAKE común:
clean:
rm -f *.dep *.o *.a $(CLEAN)
Básicamente, la idea es definir alguna variable (en este caso, CLEAN
) en cada archivo make local con todos los elementos específicos que desea eliminar. A continuación, el archivo make común ejecuta rm -f
en todos los tipos de archivos comunes para eliminar, más lo que se marcó específicamente para su eliminación en cada archivo MAKE local mediante la variable CLEAN
. Si no hay nada específico que eliminar, simplemente omita la declaración de la variable o déjela en blanco ( CLEAN=
)
Entonces, si ejecutamos make clean
para local makefile 1, se ejecuta
rm -f *.dep *.o *.a MyExe1 MyExe2
Y si ejecutamos make clean
para local makefile 2, se ejecuta
rm -f *.dep *.o *.a MyExe3 MyExe4
En el trabajo, utilizamos un archivo MAK común que otros archivos MAKE incluyen (a través de la instrucción include) y tiene un objetivo "limpio" genérico que elimina algunos archivos comunes. Quiero agregar ese objetivo en mi nuevo archivo MAKE para poder eliminar algunos archivos específicos, pero si agrego un objetivo limpio en mi archivo MAKE, simplemente anula el anterior.
Sé que puedo hacer un nuevo objetivo con un nuevo nombre y hacer que me llame limpio, y luego hacer otras cosas, pero en aras de la coherencia me gustaría poder llamar a limpiar y hacer que haga todo.
¿Es eso posible?
He visto esto hecho en varias tiendas. El enfoque más común es usar reglas de dos puntos, suponiendo que está usando algo como la marca GNU. En tu archivo MAKE común tendrías algo como esto:
clean::
# standard cleanup, like remove all .o''s:
rm -f *.o
Tenga en cuenta que hay dos dos puntos seguidos clean
, ¡no solo uno!
En tu otro archivo MAKE declaras clean
nuevamente, como una regla de dos puntos:
clean::
# custom cleanup, like remove my special generated files:
rm -f *.h.gen
Cuando invoque make clean
, GNU make ejecutará automágicamente estas dos "ramas" de la regla de limpieza:
% make clean
rm -f *.o
rm -f *.h.gen
Es fácil de configurar y se compone bastante bien, creo. Tenga en cuenta que, específicamente porque es una regla de dos puntos, no obtiene los errores de "omisión de comandos" que normalmente obtiene cuando define dos reglas para el mismo objetivo. Ese es el punto de las reglas de dos puntos.
Para los nuestros, definimos una variable, EXTRAFILESTOCLEAN, luego cuando se ejecuta la regla de limpieza, tiene un paso para eliminar todo lo especificado en la variable EXTRAFILESTOCLEAN
clean:
rm -f *.o
ifdef $(EXTRAFILESTOCLEAN)
rm -f $(EXTRAFILESTOCLEAN)
endif
Eso puede causar problemas inesperados si configura esa variable a valores extraños, pero puede protegerse de ellos agregando prefijos u otras pruebas.
Parece que la regla común del archivo MAKE debería llamarse algo así como common-clean
. Entonces, cada archivo MAKE principal declararía su regla limpia como
clean: common-clean
y estás listo.
Si eso no es una opción, podría echarle un vistazo a las reglas de dos puntos , pero eso introduce un conjunto de cuestiones para considerar.
Puede escribir su propia limpieza y convertirla en una limpieza previa común.
clean: myclean myclean: rm whatever
El tuyo correrá primero. Si por alguna razón desea que la limpieza común se ejecute primero, entonces la solución será más complicada.
Usa reglas implícitas:
existing-target: my-extention
my-extention:
echo running command 1
echo running command 2
Muy simple hacer tutorial para aumentar.
Cuando se usa :: puede encontrarse con problemas, ya que se queja cuando se mezclan dos puntos : y dos reglas dobles ::
a:
echo a
a::
echo aa
resultará en:
. . .
*** target file `a'' has both : and :: entries. Stop.