gmake:如何从 shell 命令分配全局变量?
gmake: How to assign global variable from shell command?
我有一个执行某些 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 脚本。所以,如果你想在食谱中分配一个 shell 变量,只需:
all:
GLOBVAR="$$(echo 'X')"
注意 $$
以逃避 make 在将配方传递给 shell 之前执行的扩展。
配方的不同行在不同的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 函数,您可能会进入危险区域。
我有一个执行某些 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 脚本。所以,如果你想在食谱中分配一个 shell 变量,只需:all: GLOBVAR="$$(echo 'X')"
注意
$$
以逃避 make 在将配方传递给 shell 之前执行的扩展。配方的不同行在不同的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 函数,您可能会进入危险区域。