In realtà hai ragione: esegue un'altra istanza di make. Una possibile soluzione sarebbe:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
Chiamando make fresh
ottieni prima il clean
target, poi il clearscreen
quale viene eseguito clear
e infine all
chi fa il lavoro.
MODIFICA 4 agosto
Cosa succede nel caso di build parallele con l' -j
opzione make ? C'è un modo per sistemare l'ordine. Dal manuale make, sezione 4.2:
Occasionalmente, tuttavia, si ha una situazione in cui si desidera imporre un ordine specifico alle regole da invocare senza forzare l'aggiornamento del target se viene eseguita una di queste regole. In tal caso, si desidera definire i prerequisiti di solo ordine. I prerequisiti di solo ordine possono essere specificati inserendo un simbolo pipe (|) nell'elenco dei prerequisiti: tutti i prerequisiti a sinistra del simbolo pipe sono normali; eventuali prerequisiti a destra sono di solo ordine: obiettivi: prerequisiti normali | order-only-prerequisiti
La sezione dei normali prerequisiti può ovviamente essere vuota. Inoltre, puoi comunque dichiarare più righe di prerequisiti per lo stesso target: vengono aggiunte in modo appropriato. Nota che se dichiari lo stesso file come prerequisito sia normale che di solo ordine, il prerequisito normale ha la precedenza (poiché sono un superinsieme rigoroso del comportamento di un prerequisito di solo ordine).
Quindi il makefile diventa
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
MODIFICA 5 dicembre
Non è un grosso problema eseguire più di un'istanza di makefile poiché ogni comando all'interno dell'attività sarà comunque una sotto-shell . Ma puoi avere metodi riutilizzabili usando la funzione 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 :
viene trattato come una parola chiave che viene sempre eseguita, mentre i target non fasulli sono intesi come file.