2009-10-29 15 views
28

En el trabajo, utilizamos un archivo make común que otros archivos MAKE incluyen (a través de la instrucción include) y tiene un objetivo genérico "limpio" 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.¿Anular objetivo en makefile para agregar más comandos?

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 simplemente llamar a limpiar y hacer que lo haga todo.

¿Es esto posible?

Respuesta

26

Puede escribir su propia limpieza y hacerla una preq de la limpieza común.

 
clean: myclean 

myclean: 
    rm whatever 

El suyo se ejecutará primero. Si por alguna razón desea que la limpieza común se ejecute primero, entonces la solución será más complicada.

+1

Parece que eso sería un poco al revés, requiriendo agregar más y más preq al objetivo limpio del archivo MAKE común. Nombrar el objetivo limpio algo diferente en el archivo MAKE común y luego hacer que ese objetivo sea una prioridad del objetivo limpio en otros archivos MAKE que incluyen el común parece que sería más fácil de mantener Y evitaría que el MAKE común tenga un preq que desaparece cuando un subproyecto desaparece. Hacer limpio un objetivo de dos puntos es otra forma limpia y predecible de resolver este problema. –

+4

@Dave Rawks, malinterpreta, lo que escribí entraría en el archivo make * local *, no en el archivo make común. Además, tener dos nombres de objetivo es lo que OP dijo que no quería. La idea de dos puntos es inteligente, aunque implicaría modificar el archivo MAKE común (y no permitiría que los archivos MAKE locales anulen la regla común). – Beta

+0

Gracias, no me había dado cuenta de esta relación antes. – Bohdan

5

Parece que la regla común del archivo MAKE debe llamarse algo así como common-clean. Entonces, cada archivo make principal declararía su regla limpia como

clean: common-clean 

y listo.

Si esa no es una opción, puede echar un vistazo a double colon rules, pero eso introduce una serie de cuestiones a considerar.

49

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 su makefile común que tendría algo como esto:

clean:: 
     # standard cleanup, like remove all .o's: 
     rm -f *.o 

en cuenta que hay dos dos puntos siguientes clean, no sólo uno!

En su otra makefile que acaba de declarar clean otra vez, como una regla de dos puntos dobles:

clean:: 
     # custom cleanup, like remove my special generated files: 
     rm -f *.h.gen 

Cuando se invoca make clean, GNU make automágicamente ejecutar estos dos "ramas" de la regla limpia:

% 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.

+0

Gracias Eric, esto también funciona, pero prefiero evitar modificar el archivo MAKE común si puedo. –

+1

solo estaba buscando eso y en mi caso el doble colon es la solución perfecta. ¡muchas gracias! – aurora

1

por los nuestros, definimos una variable, EXTRAFILESTOCLEAN, a continuación, cuando la regla limpia funciona, tiene un paso para eliminar todo lo especificado en el EXTRAFILESTOCLEAN variables

clean: 
    rm -f *.o 
ifdef $(EXTRAFILESTOCLEAN) 
    rm -f $(EXTRAFILESTOCLEAN) 
endif 

que pueden causar problemas inesperados si se establece esa variable a valores extraños, pero podría protegerse de ellos agregando prefijos u otras pruebas.

3

Use reglas implícitas:

existing-target: my-extention 

my-extention: 
    echo running command 1 
    echo running command 2 

Very simple make tutorial to ramp up.

Al utilizar :: puede que tenga problemas ya que make se queja cuando se mezcla única de colon : y dos puntos dobles :: reglas :

a: 
    echo a 

a:: 
    echo aa 

resultará en:

. . . 
*** target file `a' has both : and :: entries. Stop. 
0

Adición de otra posible solución que he visto para la posteridad ... Sé que la OP fue cauteloso acerca de cambiar el makefile común, pero algo como esto funciona e implica cambios mínimos.

makefile local de 1:

CLEAN=MyExe1 MyExe2 
.... 
include /my/common/makefile 

makefile local de 2:

CLEAN=MyExe3 MyExe4 
.... 
include /my/common/makefile 

makefile común:

clean: 
    rm -f *.dep *.o *.a $(CLEAN) 

Básicamente la idea es definir una 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 a través de la variable CLEAN. Si no hay nada específico para eliminar, simplemente omitir la declaración de variables o dejarlo vacío (CLEAN=)

Así que ahora si corremos make clean para makefile locales 1, ejecuta

rm -f *.dep *.o *.a MyExe1 MyExe2 

Y si corremos make clean para locales makefile 2, ejecuta

rm -f *.dep *.o *.a MyExe3 MyExe4