Il existe plusieurs techniques pour code exécuté avant que les cibles sont construits. Celle que vous devez choisir dépend un peu sur exactement ce que vous voulez faire, et pourquoi vous voulez le faire. (Ce que fait le script zsh? Pourquoi devez-vous exécuter?)
Vous pouvez soit faire comme @John suggère; de placer le script zsh comme la première dépendance. Ensuite, vous devez marquer le zsh la cible sous .PHONY à moins qu'il génère un fichier nommé zsh.
Une autre solution (GNU make, au moins) est d'invoquer la $(shell ...) fonction dans le cadre d'une affectation de variable:
ZSH_RESULT:=$(shell zsh myscript.zsh)
Execute le script dès que le makefile est analysée, et avant tout cibles sont exécutées. Il permettra également d'exécuter le script, si vous appelez le makefile de manière récursive.
Remarque, le $(shell ...) s'exécute même quand vous est donné à l'-n, --imprimées --dry-run, --recon option. Belle réponse. Est-il possible d'exécuter une commande lors de la sortie du faire? Posté une question ici: stackoverflow.com/questions/20582006/... J'aime cette approche. Cependant, les sorties de myscript.zsh est pas imprimé. Je suis dans une situation similaire où le script vous demandera un mot de passe d'utilisateur que sudo est invoquée.
Juste d'en faire une dépendance de l'un des autres objectifs
foo.obj : zsh foo.c
rule for compileing foo.c
zsh:
rule for running zsh script.
ou vous pouvez également faire votre première cible dépendent
goal: zsh foo.exe
Le problème avec la première solution est ici qu'il va forcer foo.obj être reconstruit à chaque fois, même si foo.c n'a pas été mis à jour. Le problème avec la deuxième, c'est que maintenant vous ne pouvez pas appeler votre makefile avec des objectifs multiples.
Solution pour à la fois pré et post-traitement dans les makefiles à l'aide de MAKECMDGOALS et deux points de règles.
MAKECMDGOALS sont les objectifs listés sur la ligne de commande.
Première étape est d'obtenir le premier et le dernier des cibles à partir de la ligne de commande,
ou si il n'y a pas de cibles dans la liste, utilisez la cible par défaut.
Deux points de règles permettent de multiples recettes pour la même cible exécutés dans l'ordre. Vous aurez à changer tout en ligne de commande cibles à deux points de règles.
#Dummy rule to set the default
.PHONY: all
all ::
#Preprocessing
$(FIRST_GOAL) ::
echo "Starting make..."
all :: normal_prerequistes
normal_recipe
other_stuff
#Postprocessing
$(LAST_GOAL) ::
echo "All done..."
Il y a une solution sans modifier votre Makefile (principale différence avec la accepté de répondre). Il suffit de créer un makefile contenant:
.PHONY: all
all:
pre-script
@$(MAKE) -f Makefile --no-print-directory $(MAKECMDGOALS) MAKE='$(MAKE) -f Makefile'
post-script
$(MAKECMDGOALS): all ;
Le seul inconvénient est que le pré - et post - scripts sera toujours, même si il n'y a rien d'autre à faire. Mais ils ne seront pas exécutés si vous appelez faire avec l'un des --dry-run options (autre différence avec la accepté de répondre).
Il existe plusieurs techniques pour code exécuté avant que les cibles sont construits. Celle que vous devez choisir dépend un peu sur exactement ce que vous voulez faire, et pourquoi vous voulez le faire. (Ce que fait le script zsh? Pourquoi devez-vous exécuter?)
Vous pouvez soit faire comme @John suggère; de placer le script zsh comme la première dépendance. Ensuite, vous devez marquer le
zsh
la cible sous.PHONY
à moins qu'il génère un fichier nommézsh
.Une autre solution (GNU make, au moins) est d'invoquer la
$(shell ...)
fonction dans le cadre d'une affectation de variable:Execute le script dès que le makefile est analysée, et avant tout cibles sont exécutées. Il permettra également d'exécuter le script, si vous appelez le makefile de manière récursive.
$(shell ...)
s'exécute même quand vous est donné à l'-n, --imprimées --dry-run, --recon option.Belle réponse. Est-il possible d'exécuter une commande lors de la sortie du faire? Posté une question ici: stackoverflow.com/questions/20582006/...
J'aime cette approche. Cependant, les sorties de myscript.zsh est pas imprimé. Je suis dans une situation similaire où le script vous demandera un mot de passe d'utilisateur que
sudo
est invoquée.OriginalL'auteur
Juste d'en faire une dépendance de l'un des autres objectifs
ou vous pouvez également faire votre première cible dépendent
foo.obj
être reconstruit à chaque fois, même sifoo.c
n'a pas été mis à jour. Le problème avec la deuxième, c'est que maintenant vous ne pouvez pas appeler votre makefile avec des objectifs multiples.OriginalL'auteur
Solution pour à la fois pré et post-traitement dans les makefiles à l'aide de MAKECMDGOALS et deux points de règles.
MAKECMDGOALS sont les objectifs listés sur la ligne de commande.
Première étape est d'obtenir le premier et le dernier des cibles à partir de la ligne de commande,
ou si il n'y a pas de cibles dans la liste, utilisez la cible par défaut.
Deux points de règles permettent de multiples recettes pour la même cible exécutés dans l'ordre. Vous aurez à changer tout en ligne de commande cibles à deux points de règles.
OriginalL'auteur
Il y a une solution sans modifier votre
Makefile
(principale différence avec la accepté de répondre). Il suffit de créer unmakefile
contenant:Le seul inconvénient est que le pré - et post - scripts sera toujours, même si il n'y a rien d'autre à faire. Mais ils ne seront pas exécutés si vous appelez faire avec l'un des
--dry-run
options (autre différence avec la accepté de répondre).OriginalL'auteur