如何解决gmake:如何从shell命令分配全局变量?
我有一个执行一些shell命令的makefile,我想将输出存储到全局变量中:
GLOBVAR = a
all:
GLOBVAR=$(shell echo 'X')
$(info $(GLOBVAR))
GLOBVAR
为空。我在做什么错了?
解决方法
您正在混合make和shell变量。在GLOBVAR=$(shell echo 'X')
中,它是您分配的shell变量,而在$(info $(GLOBVAR))
中,它是您扩展的make变量。
尝试以下方法:
GLOBVAR = $(shell echo 'X')
all:
$(info $(GLOBVAR))
但是您的Makefile可能还有其他一些问题,您应该考虑。
-
不建议在配方中使用
$(shell...)
,因为配方已经是Shell脚本。因此,如果要在配方中分配外壳变量,只需:all: GLOBVAR="$$(echo 'X')"
请注意,
$$
会在将配方传递到外壳之前避免make进行的扩展。 -
配方的不同行在不同的shell中执行。因此,如果要在一行中使用在上一行中分配的shell变量,则必须将它们加入:
all: GLOBVAR="$$(echo 'X')"; echo $$GLOBVAR
(关于
$$
的注释与以前相同)。如果您愿意,可以使用行继续:all: GLOBVAR="$$(echo 'X')"; \ echo $$GLOBVAR
-
最后,如果您想在配方中分配make变量,可以使用
eval
make函数,但是我强烈不鼓励您这样做,直到您完全了解make何时执行的操作为止:>$ cat Makefile .PHONY: all lla all: $(eval GLOBVAR = $(shell echo 'X')) @echo all: $(GLOBVAR) lla: @echo lla: $(GLOBVAR) $ make all all: X $ make lla lla: $ make all lla all: X lla: X $ make lla all lla: all: X
我想让您想象一下并行make的结果是什么...总之,如果您开始在配方中使用make函数,您可能会徘徊在危险区域中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。