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) <(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.
/bin/sh: -c: line 0: syntax error near unexpected token
(''Réponses:
Dans la documentation GNU Make,
Alors 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:
Cela imprimera:
Voir «Valeurs 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 être immédiatement avant la cible.
la source
man
. Parlez des horaires. : Pinfo
en fait, mais je suppose que cela a vraiment aidé Andy. Je sais que j'ai eu des jours comme ça ...SHELL=/bin/bash
comme la première ligne du Makefile (ou juste après le commentaire).Vous pouvez appeler
bash
directement, utilisez le-c
drapeau:Bien sûr, vous ne pourrez peut-être pas rediriger vers la variable $ @, mais quand j'ai essayé de le faire, j'ai reçu
-bash: $@: ambiguous redirect
un message d'erreur, donc vous voudrez peut-être examiner cela avant de vous lancer trop dans ce (bien que je sois en utilisant bash 3.2.quelque chose, alors peut-être que le vôtre fonctionne différemment).la source
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 disposent pas de bash.
la source
Vous pouvez appeler bash directement dans votre Makefile au lieu d'utiliser le shell par défaut:
au lieu de:
la source
make
ignore la valeur de la variable d'environnement SHELL.Il existe un moyen de le faire sans définir explicitement votre variable SHELL pour pointer vers bash. Cela peut être utile si vous avez plusieurs makefiles car SHELL n'est pas hérité par les makefiles suivants ou pris dans l'environnement. Vous devez également vous assurer que toute personne qui compile votre code configure son système de cette façon.
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 pointera alors vers bash (au moins dans Ubuntu). Notez que l'utilisation de dash comme shell de votre système est un peu plus efficace.la source
sh
, bash s'exécute en mode de compatibilité (set -o posix
). La fonctionnalité que l'OP essaie d'utiliser, la substitution de processus, n'est pas disponible dans ce mode.Une façon qui fonctionne également est de le mettre de cette façon dans la première ligne de votre cible:
la source