De hecho, tiene 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 make fresh
, obtiene primero el clean
objetivo, luego el clearscreen
que se ejecuta clear
y finalmente el all
que hace el trabajo.
EDITAR 4 de agosto
¿Qué sucede en el caso de compilaciones paralelas con la -j
opción de make ? Hay una forma de arreglar el orden. Del manual de marca, sección 4.2:
De vez en cuando, sin embargo, tiene una situación en la que desea imponer un orden específico en las reglas que se invocarán sin forzar la actualización del objetivo si se ejecuta una de esas reglas. En ese caso, desea definir requisitos previos de solo pedido. Los requisitos previos de solo pedido se pueden especificar colocando un símbolo de barra vertical (|) en la lista de requisitos previos: cualquier requisito previo a la izquierda del símbolo de barra vertical es normal; los requisitos previos a la derecha son solo de orden: objetivos: requisitos previos normales | requisitos previos de solo pedido
La sección de requisitos previos normal, por supuesto, puede estar vacía. Además, aún puede declarar varias líneas de requisitos previos para el mismo objetivo: se agregan de manera apropiada. Tenga en cuenta que si declara que el mismo archivo es un requisito previo tanto normal como de solo pedido, el requisito previo normal tiene prioridad (ya que son un superconjunto estricto del comportamiento de un requisito previo de solo pedido).
Por lo tanto, el archivo MAKE se convierte en
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDITAR 5 de diciembre
No es gran cosa ejecutar más de una instancia de makefile ya que cada comando dentro de la tarea será un sub-shell de todos modos. Pero puede tener métodos reutilizables usando la función de llamada .
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
.PHONY :
se trata como una palabra clave que siempre se ejecuta, mientras que los objetivos no falsos deben ser archivos.