56

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?

Joseph Quinsey
  • 9,185
  • 10
  • 53
  • 75
BaruchLi
  • 979
  • 2
  • 10
  • 18

2 Answers2

58

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.

gsingh2011
  • 11,632
  • 22
  • 95
  • 144
  • Thanks for pointing out that variable declaration is done outside of target. Can they be defined inside a target? – kgui Nov 14 '16 at 19:03
28

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 ''.

Dummy00001
  • 15,836
  • 5
  • 37
  • 58
  • Thank you, you gave me the direction! @echo "setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH" case to whole $PATH to be printed, but @echo 'setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH' do the job! – BaruchLi Sep 14 '10 at 09:44
  • Because, as I have noted the `""` and `''` are passed to the shell. Inside the `""` shell would expand the `$PATH`, but not inside the `''`. – Dummy00001 Sep 14 '10 at 09:57
  • Thanks for the reminder it's been soooo long since I used make – Steve Weet Sep 14 '10 at 10:03
  • To be perfectly honest, I always forget the bit myself and at first do the same mistake too ;) – Dummy00001 Sep 14 '10 at 10:11