How to handle shell expansions in GNU Make under Ubuntu? How to handle shell expansions in GNU Make under Ubuntu? bash bash

How to handle shell expansions in GNU Make under Ubuntu?


The problem is probably that Make spawns /bin/sh. It is usually a symlink to your system's default shell.

Option 1

You could make sure it points to bash (as this is a bashism). Probably, it is now /bin/dash or /bin/sh, depending on your version of Ubuntu.

Option 2

Easier option:

SHELL=/bin/bashall:    @echo a{3,4}    @bash -c 'echo a{3,4}'

This prints the same output twice unless you comment-out the SHELL= line

Option 3

If you can't/don't want to modify the make file, you can invoke it like so:

make SHELL=/bin/bash

beware of interactions with sub-makefiles or includes. You might want to look at the make -e option and the make export keyword: http://www.gnu.org/s/hello/manual/make/Variables_002fRecursion.html


It's been a long, long time since I've used Make...

There are several ways to specify a particular shell to use. The default shell for old Make was the original Bourne shell. If you wanted a different shell, you had to set it yourself.

You're using Linux and GNU, so I'll assume that you're using BASH as the default shell. Try this command in your Make:

echo "random = $RANDOM"

If this simply prints random = and doesn't include a random number, your Make is using Bourne shell as its default shell instead of BASH. (Which is weird because I didn't think there was a real Bourne shell in Linux...) To get around this:

  • You can add in a SHELL macro pointing to the BASH shell.
  • You can include the shell in your command.

Instead of:

@mkdir -pv test/{a,b}

Put this:

/bin/bash -c @mkdir -pv test/{a,b}

This specifies you want to use BASH and not the standard /bin/sh Bourne shell.

If the echo random = $RANDOM does print a random number, you're using BASH (or at least Kornshell), but the BRACE EXPANSION might not be set. Try using this in your Makefile:

set -o

And make sure braceexpand is on. It could be off when you run Make.