[makefile] Make file echo displaying "$PATH" string

I am trying to force make file to display next string:

"Please execute next commands:
setenv PATH /usr/local/greenhills/mips5/linux86:$PATH"

The problem is with "$PATH". Command

@echo "setenv PATH /usr/local/greenhills/mips5/linux86:$PATH"

cause a result

"setenv PATH /usr/local/greenhills/mips5/linux86:ATH"

any combinations of escape characters, quotes, "$(shell echo " didn't get required results...

Any suggestions?

This question is related to makefile

The answer is


In the manual for GNU make, they talk about this specific example when describing the value function:

The value function provides a way for you to use the value of a variable without having it expanded. Please note that this does not undo expansions which have already occurred; for example if you create a simply expanded variable its value is expanded during the definition; in that case the value function will return the same result as using the variable directly.

The syntax of the value function is:

 $(value variable)

Note that variable is the name of a variable; not a reference to that variable. Therefore you would not normally use a ā€˜$ā€™ or parentheses when writing it. (You can, however, use a variable reference in the name if you want the name not to be a constant.)

The result of this function is a string containing the value of variable, without any expansion occurring. For example, in this makefile:

 FOO = $PATH

 all:
         @echo $(FOO)
         @echo $(value FOO)

The first output line would be ATH, since the ā€œ$Pā€ would be expanded as a make variable, while the second output line would be the current value of your $PATH environment variable, since the value function avoided the expansion.


The make uses the $ for its own variable expansions. E.g. single character variable $A or variable with a long name - ${VAR} and $(VAR).

To put the $ into a command, use the $$, for example:

all:
  @echo "Please execute next commands:"
  @echo 'setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH'

Also note that to make the "" and '' (double and single quoting) do not play any role and they are passed verbatim to the shell. (Remove the @ sign to see what make sends to shell.) To prevent the shell from expanding $PATH, second line uses the ''.