Comment utiliser la syntaxe Bash dans les cibles Makefile?
je trouve souvent la syntaxe Bash très utile, par exemple la substitution de processus comme dans diff <(sort file1) <(sort file2)
.
est-il possible d'utiliser de telles commandes Bash dans un Makefile? Je pense à quelque chose comme ceci:
file-differences:
diff <(sort file1) <(sort file2) > $@
dans ma GNU Make 3.80 ceci donnera une erreur puisqu'il utilise le shell
au lieu de bash
pour exécuter les commandes.
5 réponses
de la documentation GNU Make,
5.3.1 Choosing the Shell
------------------------
The program used as the shell is taken from the variable `SHELL'. If
this variable is not set in your makefile, the program `/bin/sh' is
used as the shell.
ainsi mettez SHELL := /bin/bash
au sommet de votre makefile, et vous devriez être bon à aller.
BTW: vous pouvez également faire cela pour une cible, au moins pour GNU Make. Chaque cible peut avoir ses propres assignations variables, comme ceci:
all: a b
a:
@echo "a is $"151910920""
b: SHELL:=/bin/bash # HERE: this is setting the shell for b only
b:
@echo "b is $"151910920""
qui imprimera:
a is /bin/sh
b is /bin/bash
voir" valeurs des variables cibles spécifiques " dans la documentation pour plus de détails. Cette ligne peut aller n'importe où dans le Makefile, il n'a pas à être immédiatement avant la cible.
vous pouvez appeler bash
directement, utilisez le drapeau -c
:
bash -c "diff <(sort file1) <(sort file2) > $@"
bien sûr, vous pouvez ne pas être en mesure de rediriger vers la variable $@, mais quand j'ai essayé de le faire, j'ai eu -bash: $@: ambiguous redirect
comme message d'erreur, donc vous pouvez vouloir regarder dans ce avant que vous obtenez trop dans ce (bien que j'utilise bash 3.2.quelque chose, donc peut-être que le vôtre fonctionne différemment).
si la portabilité est importante, vous pouvez ne pas vouloir dépendre d'un shell spécifique dans votre Makefile. Tous les environnements n'ont pas bash disponible.
vous pouvez appeler bash directement dans votre Makefile au lieu d'utiliser le shell par défaut:
bash -c "ls -al"
au lieu de:
ls -al
il y a une façon de le faire sans définir explicitement votre variable SHELL pour pointer vers bash. Cela peut être utile si vous avez beaucoup de makefiles puisque SHELL n'est pas hérité par les makefiles suivants ou pris de l'environnement. Vous devez également vous assurer que quiconque compile votre code configure son système de cette façon.
si vous lancez sudo dpkg-reconfigure dash
et répondez" non " à l'invite, votre système n'utilisera pas dash comme shell par défaut. Il indiquera ensuite à bash (à le moins à Ubuntu). Notez que l'utilisation de dash comme shell système est un peu plus efficace.