How can i pass ENV variables between make targets

2019-05-04 19:55发布

问题:

I have like this in makefile

target1:
       export var1=test
       $(MAKE) target2

target2:
       echo $(var1)

This is coming as empty

I have other depencies so i want to set variable in first target and then all children dependencies should be able to access that

EDIT:

.ONESHELL:

target1:
        export var1=test
        echo $(var1)

output

make target1
export var1=test
echo

回答1:

By default make invokes a new shell environment for each recipe, the exported variable on the first line isn't in scope for the second.

You can fix this in multiple ways:

Export the variable with make's export directive

target1: export var1 := test
target1:
    $(MAKE) target2

Use make's command line variable assignment

target1:
    $(MAKE) target2 var1=test

Use shell command variable assignment

target1:
    var1=test $(MAKE) target2

Combine the two commands in a single recipe

target1:
    export var1=test; $(MAKE) target2

Force make to pass all recipes to the same shell instance

.ONESHELL:

target1:
    export var1=test
    $(make) target2