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.

164
demandé sur Peter Mortensen 2009-02-26 08:56:16

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.

298
répondu derobert 2016-04-04 16:10:32

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).

12
répondu Chris Lutz 2009-02-26 06:03:31

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.

3
répondu Menno Smits 2009-11-19 12:34:25

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
3
répondu paxdiablo 2017-02-12 21:54:00

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.

1
répondu Bill G 2017-02-14 17:03:26