web-dev-qa-db-fra.com

Comment utiliser la syntaxe Bash dans les cibles Makefile?

Je trouve souvent la syntaxe Bash très utile, par exemple. 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) <(sort file2) > $@

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

187
Frank

À partir de GNU Make documentation,

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.

Alors mettez Shell := /bin/bash au sommet 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 variable, comme celle-ci:

all: a b

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 variable spécifiques à la cible" dans la documentation pour plus de détails. Cette ligne peut aller n'importe où dans le Makefile, il n'est pas nécessaire qu'elle soit juste avant la cible.

341
derobert

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

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

Bien sûr, vous ne pourrez peut-être pas rediriger vers la variable $ @, mais lorsque j’ai essayé de le faire, j’ai eu -bash: $@: ambiguous redirect en tant que message d'erreur, vous voudrez peut-être vérifier cela avant de vous lancer dans le même sujet (bien que j'utilise bash 3.2. quelque chose, le vôtre fonctionnera peut-être différemment).

15
Chris Lutz

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
4
paxdiablo

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.

4
Menno Smits

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 plusieurs makefiles, car Shell n'est pas hérité par les makefiles suivants ni pris de l'environnement. Vous devez également vous assurer que toute personne compilant votre code configure son 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 dash comme shell par défaut. Il va ensuite pointer sur bash (au moins dans Ubuntu). Notez que l'utilisation de dash en tant que système est un peu plus efficace.

2
Bill G