Search code examples
shellvariablesmakefilegnurecipe

GNU make variable and shell variable in recipe


I'm little confused the make variable and shell variable in recipe.
as the each line of recipe is interpret as the shell, can i do the shell variable assignment? following is the example:

.ONESHELL:
all:
    param="hello"
    echo $(param)

//--------------------
no output...
and I know we can use eval to the variable assignment, but it looks as make variable.
how can I just perform the normal shell variable assignment which I want to hold the shell command return value?


Solution

  • $(param) is expanded by GNU make. To make it expanded by the shell do $${param}. Using Variables in Recipes:

    Variable and function references in recipes have identical syntax and semantics to references elsewhere in the makefile. They also have the same quoting rules: if you want a dollar sign to appear in your recipe, you must double it (‘$$’). For shells like the default shell, that use dollar signs to introduce variables, it’s important to keep clear in your mind whether the variable you want to reference is a make variable (use a single dollar sign) or a shell variable (use two dollar signs).