Makefile在目标正文中设置全局变量

Makefile在目标正文中设置全局变量,makefile,Makefile,我想通过一个配方设置一个全局变量,然后在另一个独立的配方中引用该变量 下面的代码是一个示例代码,用于在配方内设置变量,但如果在配方外引用,则该变量将保留初始值 ACTIVE = a switch: ifeq ($(ACTIVE),b) ACTIVE=$(shell echo 'a') else ACTIVE=$(shell echo 'b') endif print: $(info acitve = $(ACTIVE)) 我知道有一些方法可以将特定于目标的变量的值广

我想通过一个配方设置一个全局变量,然后在另一个独立的配方中引用该变量

下面的代码是一个示例代码,用于在配方内设置变量,但如果在配方外引用,则该变量将保留初始值

ACTIVE = a

switch:
ifeq ($(ACTIVE),b)
    ACTIVE=$(shell echo 'a')
else
    ACTIVE=$(shell echo 'b')
endif

print:
    $(info acitve = $(ACTIVE))
我知道有一些方法可以将特定于目标的变量的值广播给相关目标,但这不是我想要的。

您可以使用
$(eval…
来实现这一点,尽管这几乎总是一个坏主意。我必须假设您的实际情况要复杂得多,因为有很多更好的方法来完成您在示例makefile中实际提供的内容

switch:
        $(eval ACTIVE=$(if $(filter-out a,$(ACTIVE)),a,b))

eval函数在配方范围内工作。运行
make print
时,值仍然是
a
如何调用make?如果未运行
开关
目标,则不会重置
活动
<代码>评估修改品牌的全局状态,因此,在
switch
目标运行后,
ACTIVE
的全局值在任何地方都会不同。
make switch
然后
make print
prints
a
静止,但是
make switch print
工作是否正常确保:运行
make switch
更改
ACTIVE
变量的值调用
make
。一旦退出,make调用所知道的一切都消失了。再次启动
make
时,它已返回默认设置。如果您希望在make的调用中保持更改,而不仅仅是单个make调用中的目标之间,那么这与您所问的问题完全不同。为此,您必须在文件系统中保留
ACTIVE
的“当前”值,以便下次调用
make
可以检索它。