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 的其他几个问题。

  1. 不建议在食谱中使用 $(shell...),因为食谱已经是 shell 脚本。所以,如果你想在食谱中分配一个 shell 变量,只需:

     all:
         GLOBVAR="$$(echo 'X')"
    

    注意 $$ 以逃避 make 在将配方传递给 shell 之前执行的扩展。

  2. 配方的不同行在不同的shell中执行。所以,如果你想在一行中使用一个在前一行中分配的 shell 变量,你必须加入它们:

     all:
         GLOBVAR="$$(echo 'X')"; echo $$GLOBVAR
    

    (与之前关于 $$ 的评论相同)。如果您愿意,可以使用续行:

     all:
         GLOBVAR="$$(echo 'X')"; \
         echo $$GLOBVAR
    
  3. 最后,如果你想在食谱中分配 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 函数,您可能会进入危险区域。