Makefile `echo -n' not working

bash, echo, makefile

Solution

Something about the quotes confuses `make`. Your code behaves the same for me, but the following works as expected:

help:
        @echo -n Shouldn\'t print a newline

Hardcoding the path to the executable also works:

help:
        @/bin/echo -n "Shouldn't print a newline"

The Mac OS X man page for `echo`, while discussing the existence of shell built-in `echo`s, mentions that the `echo` of `sh(1)` does not support the `-n` option, but that fails to explain (to me, anyway) why my first alternative works.

Confirmation that `make` is using `sh` to execute the commands by default. Make manual 5.3.2 Choosing the Shell specifies this hehavrior:

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. The argument(s) passed to the shell are taken from the variable .SHELLFLAGS. The default value of .SHELLFLAGS is -c normally, or -ec in POSIX-conforming mode.

In

SHELL = bash
help:
        @echo -n "Shouldn't print a newline"
        @echo -n Shouldn\'t print a newline

both echo statements behave the same (no newlines printed). So without that variable, we have `bash` pretending to be `sh`, but evaluating the two lines differently. Question 1: why? Question 2: is the second line the native `bash` echo or `/bin/echo`, rather than the emulated `sh` `echo`?

Problem

I am trying to have my Makefile echo text without the trailing new line, but am unable to. I am experiencing the behavior on OS X (on Linux everything works as expected). Makefile ``` a: @echo -n "hello" b: @echo -n hello c: @/bin/echo -n "hello" ``` Output: ``` $make a -n hello $make b hello$make c hello$ ``` In other words, the `make a` is broken. What exactly is happening? Is make using a built-in echo? Clearly the presence of the double quotes changes the behavior, but why? Update As discovered by @chepner, using the full path to `/bin/echo` in the makefile understands the -n flag correctly.

Original source