ejecutar - makefile ejecuta otro objetivo
makefile ejecutar (3)
Tengo un archivo MAKE estructurado de la siguiente manera:
all :
compile executable
clean :
rm -f *.o $(EXEC)
Me di cuenta de que constantemente ejecutaba "make clean" seguido de "clear" en mi terminal antes de ejecutar "make all". 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?
En la línea de comandos de Linux: borrar y hacer
En realidad tienes razón: ejecuta otra instancia de make. Una posible solución sería:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
Al llamar a make fresh
obtienes primero el objetivo clean
, luego la clearscreen
clear
que corre clear
y finalmente all
que hace el trabajo.
EDITAR
¿Qué sucede en el caso de compilaciones paralelas con la opción make -j
? Hay una forma de arreglar el orden. Del manual de la marca, sección 4.2:
Ocasionalmente, sin embargo, tiene una situación en la que desea imponer un orden específico sobre las reglas que se invocarán sin forzar la actualización del objetivo 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 | pedidos-solo-prerrequisitos
La sección de requisitos previos normales, por supuesto, puede estar vacía. 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).
Por lo tanto, el archivo MAKE se convierte
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
Si eliminó la línea make all
de su objetivo "nuevo":
fresh :
rm -f *.o $(EXEC)
clear
Simplemente podría ejecutar el comando make fresh all
, que se ejecutará como make fresh; make all
make fresh; make all
.
Algunos podrían considerar esto como una segunda instancia de make, pero ciertamente no es una sub-instancia de make (una marca dentro de una marca), que es lo que su intento parece dar como resultado.