Makefile gmake:如何从shell命令分配全局变量?

Makefile gmake:如何从shell命令分配全局变量?,makefile,gnu-make,Makefile,Gnu Make,我有一个执行一些shell命令的makefile,我想将输出存储到一个全局变量: GLOBVAR = a all: GLOBVAR=$(shell echo 'X') $(info $(GLOBVAR)) GLOBVAR为空。我做错了什么?您混淆了make和shell变量。在GLOBVAR=$(shell echo'X')中,它是一个您分配的shell变量,而在$(info$(GLOBVAR))中,它是一个您展开的make变量 请尝试以下方法: GLOBVAR = $(she

我有一个执行一些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))
<>但是你的Mag文件还有几个其他问题,你应该考虑。

  • 不建议在配方中使用
    $(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函数,您可能正在进入危险区域