2010-07-16 23 views
58

tengo un makefile estructurado así:makefile ejecutar otro objetivo

all : 
    compile executable 

clean : 
    rm -f *.o $(EXEC) 

me di cuenta de que yo estaba corriendo constantemente "make clean" seguido de "claro" en mi terminal antes de ejecutar "hacer todo". Me gusta tener un terminal limpio antes de intentar examinar los desagradables errores de compilación de C++. Así que traté de agregar un tercer objetivo:

fresh : 
    rm -f *.o $(EXEC) 
    clear 
    make all 

Esto funciona, sin embargo, esto ejecuta una segunda instancia de make (creo). ¿Hay una manera correcta de obtener la misma funcionalidad sin ejecutar una segunda instancia de make?

Respuesta

96

En realidad, tiene razón: ejecuta otra instancia de make. Una solución posible sería:

.PHONY : clearscr fresh clean all 

all : 
    compile executable 

clean : 
    rm -f *.o $(EXEC) 

fresh : clean clearscr all 

clearscr: 
    clear 

Llamando make fresh se obtiene primero el objetivo clean, entonces el clearscreen que corre clear y finalmente all el que hace el trabajo.

EDITAR

¿Qué ocurre en el caso de las compilaciones paralelas con la opción de hacer -j? Hay una forma de arreglar el pedido. Desde el manual de marca, sección 4.2:

Ocasionalmente, sin embargo, se tiene una situación en la que desea imponer un orden específico de las reglas que se invoca sin forzar el objetivo de ser actualizado si se ejecuta una de esas reglas . En ese caso, quiere definir prerrequisitos de solo pedido. Los requisitos previos de solo pedido se pueden especificar colocando un símbolo de tubería (|) en la lista de requisitos previos: los requisitos previos a la izquierda del símbolo de tubería son normales; cualquier prerrequisito a la derecha es solo de orden: objetivos: requisitos previos normales | prerrequisitos de solo pedido

La sección de requisitos previos normales puede estar vacía, por supuesto. Además, aún puede declarar varias líneas de requisitos previos para el mismo objetivo: se anexan de manera apropiada. Tenga en cuenta que si declara que el mismo archivo es un prerrequisito normal y solo de orden, el prerrequisito normal tiene prioridad (ya que son un superconjunto estricto del comportamiento de un requisito previo solo de orden).

De ahí que el makefile se convierte en

.PHONY : clearscr fresh clean all 

all : 
    compile executable 

clean : 
    rm -f *.o $(EXEC) 

fresh : | clean clearscr all 

clearscr: 
    clear 
+1

@ sas4740.: básicamente, todo sigue a '.PHONY:' como una palabra clave que siempre se ejecuta, mientras que los objetivos no falsos son archivos. – Dacav

+0

son condicional "requisitos previos de solo pedido"? para el objetivo t2 Quiero primero hacer t0, que solo si t0 ejecuta sucesivamente t1, y solo si ambos ejecuta alguna tarea en t3 – fantastory

+1

@ fantastory, no, creo ** que son independientes. 't2' dependerá de' t0', 't1' y' t3'. Si necesita esto, debe poner 't3' como lo requiere' t2', 't1' como lo requieren' t3' y 't0' como lo requiere' t1'. Esto significa 3 reglas diferentes. Sin embargo, debes verificar esto. No estoy 100% seguro. – Dacav

-11

En Linux del símbolo del sistema: clara & hacen

+0

Creo que quería decir "hacer limpieza && dejar en claro" pero eso no ayuda con la ineficacia de la carga hacer una segunda vez –

+7

puede hacerlo más claro :) – fantastory

+3

@fantastory: intente con 'aclarar | más' – Dacav

0

Si ha extraído la línea make all de su objetivo "fresco":

fresh : 
    rm -f *.o $(EXEC) 
    clear 

Simplemente podría ejecutar el comando make fresh all, que se ejecutará como make fresh; make all.

Algunos podrían considerar esto como una segunda instancia de maquillaje, pero ciertamente no es un sub-instancia de maquillaje (una marca dentro de una marca), que es lo que su intento parecía resultar en

Cuestiones relacionadas