Makefile `echo -n’ not working

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 your b case.
  • If the command is complex, make will spawn a shell to interpret and run the recipe. This is what happens in your a 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 by bash. Also on Mac OS X, bash is compiled with --enable-strict-posix-default. One consequence of this flag is that the echo command does not understand the -n flag.
  • On Linux, the functionality of /bin/sh is implemented by dash which is less strict with respect to POSIX specification. Therefore the flag -n is implemented in the echo 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.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)