En fait, vous avez raison: il exécute une autre instance de make. Une solution possible serait:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
En appelant, make fresh
vous obtenez d'abord la clean
cible, puis celle clearscreen
qui s'exécute clear
et enfin celle all
qui fait le travail.
EDIT 4 août
Que se passe-t-il dans le cas de builds parallèles avec l' -j
option make ? Il existe un moyen de régler la commande. À partir du manuel de fabrication, section 4.2:
Parfois, cependant, vous avez une situation où vous souhaitez imposer un ordre spécifique aux règles à appeler sans forcer la mise à jour de la cible si l'une de ces règles est exécutée. Dans ce cas, vous souhaitez définir des conditions préalables à la commande uniquement. Les prérequis de commande uniquement peuvent être spécifiés en plaçant un symbole de tuyau (|) dans la liste des prérequis: tous les prérequis à gauche du symbole de tuyau sont normaux; tous les prérequis à droite sont d'ordre uniquement: cibles: prérequis normaux | conditions préalables à la commande uniquement
La section des prérequis normaux peut bien sûr être vide. De plus, vous pouvez toujours déclarer plusieurs lignes de prérequis pour la même cible: elles sont ajoutées de manière appropriée. Notez que si vous déclarez que le même fichier est à la fois un prérequis normal et un prérequis de commande uniquement, le prérequis normal a la priorité (car il s'agit d'un sur-ensemble strict du comportement d'un prérequis de commande uniquement).
D'où le makefile devient
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDIT 5 déc.
Ce n'est pas grave d'exécuter plus d'une instance de makefile puisque chaque commande à l'intérieur de la tâche sera de toute façon un sous-shell . Mais vous pouvez avoir des méthodes réutilisables en utilisant la fonction d'appel .
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 :
est traité comme un mot-clé qui est toujours exécuté, tandis que les cibles non fausses sont destinées à être des fichiers.t2
dépendra det0
,t1
ett3
. Si vous en avez besoin, vous devez le mettret3
comme requis part2
,t1
comme requis part3
ett0
comme requis part1
. Cela signifie 3 règles différentes. Vous devez cependant vérifier cela. Je ne suis pas sûr à 100%.Si vous avez supprimé la
make all
ligne de votre "nouvelle" cible:Vous pouvez simplement exécuter la commande
make fresh all
, qui s'exécutera en tant quemake fresh; make all
.Certains pourraient considérer cela comme une deuxième instance de make, mais ce n'est certainement pas une sous-instance de make (un make à l'intérieur d'un make), ce que votre tentative semble aboutir.
la source