Właściwie masz rację: uruchamia kolejną instancję marki. Możliwym rozwiązaniem byłoby:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
Dzwoniąc make fresh
, otrzymujesz najpierw clean
cel, następnie ten, clearscreen
który działa, clear
a na końcu, all
który wykonuje zadanie.
EDYTUJ 4 sierpnia
Co dzieje się w przypadku równoległych kompilacji z -j
opcją marki ? Jest sposób na ustalenie zamówienia. Z instrukcji marki, sekcja 4.2:
Czasami jednak zdarza się sytuacja, w której chcesz narzucić określoną kolejność reguł, które mają być wywoływane, bez wymuszania aktualizacji celu, jeśli jedna z tych reguł zostanie wykonana. W takim przypadku chcesz zdefiniować wymagania wstępne dotyczące tylko zamówienia. Wymagania wstępne dotyczące tylko zamówienia można określić, umieszczając symbol potoku (|) na liście wymagań wstępnych: wszelkie wymagania wstępne po lewej stronie symbolu rury są normalne; wszelkie wymagania wstępne po prawej stronie dotyczą tylko zamówienia: cele: normalne wymagania wstępne | wymagania wstępne dotyczące tylko zamówienia
Normalna sekcja wymagań wstępnych może oczywiście być pusta. Możesz także nadal zadeklarować wiele wierszy wymagań wstępnych dla tego samego celu: są one odpowiednio dołączane. Zwróć uwagę, że jeśli zadeklarujesz ten sam plik jako wymaganie wstępne normalne i wymaganie wstępne tylko dla zamówienia, pierwszeństwo ma normalne wymaganie wstępne (ponieważ są one ścisłym nadzbiorem zachowania warunku wstępnego dotyczącego tylko zamówienia).
Stąd plik makefile staje się
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDYTUJ 5 grudnia
Uruchomienie więcej niż jednej instancji makefile nie jest problemem, ponieważ każde polecenie wewnątrz zadania i tak będzie podpowłoką . Ale możesz mieć metody wielokrotnego użytku, używając funkcji call .
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 :
jest traktowane jako słowo kluczowe, które jest zawsze wykonywane, podczas gdy niefałszowane cele mają być plikami.t2
będzie zależećt0
,t1
it3
. Jeśli potrzebujesz tego, umieśćt3
zgodnie z wymaganiamit2
,t1
zgodnie z wymaganiamit3
it0
zgodnie z wymaganiamit1
. Oznacza to 3 różne zasady. Powinieneś to jednak zweryfikować. Nie jestem pewien w 100%.Jeśli usunąłeś
make all
wiersz ze swojego „nowego” celu:Możesz po prostu uruchomić polecenie
make fresh all
, które zostanie wykonane jakomake fresh; make all
.Niektórzy mogą uznać to za drugą instancję marki, ale z pewnością nie jest to podrzędna instancja marki (marka wewnątrz marki), do czego wydawała się skutkować twoja próba.
źródło