Eigentlich haben Sie recht: Es wird eine weitere Instanz von make ausgeführt. Eine mögliche Lösung wäre:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
Wenn make fresh
Sie anrufen, erhalten Sie zuerst das clean
Ziel, dann das, clearscreen
was ausgeführt wird clear
und schließlich das, all
was den Job erledigt.
BEARBEITEN 4. August
Was passiert bei parallelen Builds mit der -j
Option make ? Es gibt eine Möglichkeit, die Bestellung zu korrigieren. Aus dem Herstellungshandbuch, Abschnitt 4.2:
Gelegentlich kommt es jedoch vor, dass Sie den aufzurufenden Regeln eine bestimmte Reihenfolge auferlegen möchten, ohne dass das Ziel aktualisiert werden muss, wenn eine dieser Regeln ausgeführt wird. In diesem Fall möchten Sie nur Auftragsvoraussetzungen definieren. Nur-Auftrags-Voraussetzungen können angegeben werden, indem ein Pipe-Symbol (|) in die Liste der Voraussetzungen eingefügt wird: Alle Voraussetzungen links vom Pipe-Symbol sind normal. Alle Voraussetzungen auf der rechten Seite sind nur auf Bestellung: Ziele: Normalvoraussetzungen | Nur-Bestellung-Voraussetzungen
Der Abschnitt mit den normalen Voraussetzungen kann natürlich leer sein. Sie können auch weiterhin mehrere Voraussetzungszeilen für dasselbe Ziel deklarieren: Sie werden entsprechend angehängt. Beachten Sie, dass, wenn Sie dieselbe Datei sowohl als normale als auch als reine Bestellvoraussetzung deklarieren, die normale Voraussetzung Vorrang hat (da sie eine strikte Obermenge des Verhaltens einer reinen Bestellvoraussetzung darstellt).
Daher wird das Makefile
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDIT 5. Dezember
Es ist keine große Sache, mehr als eine Makefile-Instanz auszuführen, da jeder Befehl innerhalb der Aufgabe sowieso eine Unter-Shell ist. Aber Sie können wiederverwendbare Methoden haben die Verwendung von Anruffunktion .
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 :
als ein Schlüsselwort behandelt, das immer ausgeführt wird, während nicht gefälschte Ziele Dateien sein sollen.t2
wird davon abhängent0
,t1
undt3
. Wenn Sie diese benötigen , sollten Sie stellen jet3
nach Bedarf durcht2
, jet1
nach Bedarf nacht3
undt0
nach Bedarf durcht1
. Dies bedeutet 3 verschiedene Regeln. Sie sollten dies jedoch überprüfen. Ich bin nicht 100% sicher.Wenn Sie die
make all
Linie von Ihrem "frischen" Ziel entfernt haben:Sie können einfach den Befehl
make fresh all
ausführen, der als ausgeführt wirdmake fresh; make all
.Einige mögen dies als eine zweite Instanz von make betrachten, aber es ist sicherlich keine Unterinstanz von make (ein make innerhalb eines make), was Ihr Versuch zu ergeben schien.
quelle