The problem comes from the unfortunate interaction of two facts.
First, make
has two modes of operations depending on the complexity of the recipe to be run:
- If the command is easy,
make
will directly run the recipe with its builtin commands. This is what happens in yourb
case. - If the command is complex,
make
will spawn a shell to interpret and run the recipe. This is what happens in youra
case.
Second, make
uses /bin/sh
as a shell but the functionality of /bin/sh
is implemented differently on Mac OS X and Linux:
- On Mac OS X, the functionality of
/bin/sh
is implemented bybash
. Also on Mac OS X,bash
is compiled with--enable-strict-posix-default
. One consequence of this flag is that theecho
command does not understand the-n
flag. - On Linux, the functionality of
/bin/sh
is implemented bydash
which is less strict with respect to POSIX specification. Therefore the flag-n
is implemented in theecho
command.
BTW, the Makefile buitlin echo
command understands the -n
flag which explains why the b
case always works.
The clean and portable way of fixing your problem is to replace your @echo -n
recipes with @printf
recipes.