0
votes

I'm using GNU make and Makefiles. Is it possible to set an environment variable for one build step?

Currently I'm doing something like this:

VAR:=valueA
step1:
    echo $(VAR)

Then, "make step1" will print "valueA".

Is it possible to redefine the env var for one build step?

VAR:=valueA
step1:
    echo $(VAR)
step2:
    VAR:=valueB
    echo $(VAR)

I want "make step1" to print "valueA", but "make step1" to print "valueB".

2

2 Answers

7
votes

First, those are not environment variables, they're make variables. It's really important to understand and remember the difference.

Second, yes, you can do this with target-specific variables:

VAR := valueA
step1:
        echo $(VAR)

step2: VAR := valueB
step2:
        echo $(VAR)

If you really do want the value to be present in the child process's environment, you can use make's export keyword:

export VAR := valueA

step1:
        echo $$VAR
1
votes

To complement MadScientist's answer: if you actually need to set an environment variable because a command you call expects it to be set, you need to do it within the shell commands that are your recipes:

VAR := value0

all: step1 step2
step1: VAR := value1
step2: VAR := value2

all step1 step2 step3:
        ENVVAR=$(VAR) sh -c 'echo the nested sh for $@ has ENVVAR = $$ENVVAR'