Makefile:为一个构建步骤设置环境变量

Makefile:为一个构建步骤设置环境变量,makefile,environment-variables,Makefile,Environment Variables,我正在使用GNU make和Makefiles。是否可以为一个构建步骤设置环境变量 VAR:=valueA step1: echo $(VAR) step2: VAR:=valueB echo $(VAR) 目前我正在做这样的事情: VAR:=valueA step1: echo $(VAR) 然后,执行步骤1将打印值A 是否可以为一个构建步骤重新定义环境变量 VAR:=valueA step1: echo $(VAR) step2: VAR:

我正在使用GNU make和Makefiles。是否可以为一个构建步骤设置环境变量

VAR:=valueA
step1:
    echo $(VAR)
step2:
    VAR:=valueB
    echo $(VAR)
目前我正在做这样的事情:

VAR:=valueA
step1:
    echo $(VAR)
然后,执行步骤1将打印值A

是否可以为一个构建步骤重新定义环境变量

VAR:=valueA
step1:
    echo $(VAR)
step2:
    VAR:=valueB
    echo $(VAR)
我想让step1打印valueA,但让step1打印valueB。

首先,这些不是环境变量,它们是make变量。理解并记住两者的区别是非常重要的

第二,是的,您可以通过以下方式实现:

如果确实希望值出现在子进程的环境中,可以使用make的导出关键字:


为了补充疯狂科学家的答案: 如果您确实需要设置环境变量,因为您调用的命令需要设置环境变量,那么您需要在shell命令中进行设置,这些shell命令是您的:


您也可以只使用makeexport操作:export VAR:=。。。比运行第二个shell简单得多。嗯。。。非常正确。也许你可以把它加到你的答案里?然后我可以删除我的。好的,但我认为从问题中可以很清楚地看出,haael并不是在谈论环境变量,他所有的规则都是使用make变量。@Madscitist实际上,shell配方和make的export关键字之间是有区别的。导出的目标特定变量也将导出到目标先决条件配方的shell环境中。就我个人而言,我更喜欢shell版本同时更明确和更私密。我认为这很难理解,除非你对shell非常了解。我也不认为限制环境的价值通常是很有趣的,因为用户的整个环境已经被传递了,谁知道他们有什么!但是,当然,如果这是一个真正的问题,最好是明确的。例如,我会更小心地使用像LD_LIBRARY_PATH这样的变量,尽管我可能会放弃sh-c而只使用LD_LIBRARY_PATH='$LD_LIBRARY_PATH'mycommand。。。直接地
export VAR := valueA

step1:
        echo $$VAR
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'