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