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 ça:

 file-differences: diff <(sort file1)  $@ 

Dans ma GNU Make 3.80, cela donnera une erreur car il utilise le shell au lieu de bash pour exécuter les commandes.

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. 

Donc, mettez SHELL := /bin/bash en haut de votre makefile, et vous devriez être prêt à partir.

BTW: Vous pouvez également le faire pour une cible, au moins pour GNU Make. Chaque cible peut avoir ses propres affectations de variables, comme ceci:

 all: ab a: @echo "a is $$0" b: SHELL:=/bin/bash # HERE: this is setting the shell for b only b: @echo "b is $$0" 

Ça va imprimer:

 a is /bin/sh b is /bin/bash 

Voir “Valeurs de variables spécifiques à la cible” dans la documentation pour plus de détails. Cette ligne peut aller n’importe où dans le Makefile, elle ne doit pas nécessairement être immédiatement avant la cible.

Vous pouvez appeler directement bash , utilisez le drapeau -c :

 bash -c "diff <(sort file1) <(sort file2) > $@" 

Bien sûr, vous ne pourrez peut-être pas redirect vers la variable $ @, mais lorsque j’ai essayé de le faire, j’ai reçu -bash: $@: ambiguous redirect tant que message d’erreur. aussi dans cela (bien que j’utilise quelque chose de bash 3.2, alors peut-être que le vôtre fonctionne différemment).

Si la portabilité est importante, vous ne voudrez peut-être pas dépendre d’un shell spécifique dans votre Makefile. Tous les environnements ne sont pas disponibles.

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 existe un moyen de le faire sans définir explicitement votre variable SHELL pour qu’elle pointe vers bash. Cela peut être utile si vous avez beaucoup de fichiers makefiles puisque SHELL n’est pas hérité par les makefiles ultérieurs ou par l’environnement. Vous devez également vous assurer que quiconque comstack votre code configure le système de cette manière.

Si vous exécutez sudo dpkg-reconfigure dash et répondez «non» à l’invite, votre système n’utilisera pas le tiret comme shell par défaut. Il pointera alors sur bash (au moins dans Ubuntu). Notez que l’utilisation de Dash comme shell de votre système est un peu plus efficace.