I often find bash syntax very helpful, e.g. process substitution like in diff <(sort file1) <(sort file2).
Is it possible to use such bash commands in a Makefile? I'm thinking of something like this:
file-differences:
diff <(sort file1) <(sort file2) > $@
In my GNU Make 3.80 this will give an error since it uses the shell instead of bash to execute the commands.
-
You can call
bashdirectly, use the-cflag:bash -c "diff <(sort file1) <(sort file2) > $@"Of course, you may not be able to redirect to the variable $@, but when I tried to do this, I got
-bash: $@: ambiguous redirectas an error message, so you may want to look into that before you get too into this (though I'm using bash 3.2.something, so maybe yours works differently). -
From the 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.So put
SHELL := /bin/bashat the top of your makefile, and you should be good to go. -
You can call bash directly within your Makefile instead of using the default shell:
bash -c "ls -al"instead of:
ls -alOr force make to use a specific shell with either (only export once):
export SHELL=$(whence bash) make ...or:
SHELL=$(whence bash) make ... -
If portability is important you may not want to depend on a specific shell in your Makefile. Not all environments have bash available.
0 comments:
Post a Comment