Bash 如何将shell命令的输出分配给所有make目标的Makefile变量?

Bash 如何将shell命令的输出分配给所有make目标的Makefile变量?,bash,makefile,gnu-make,Bash,Makefile,Gnu Make,我有一个随机字符串,它被生成并用于多个make目标。我的Makefile看起来像: VALUE := $(shell strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n') target_0: echo ${VALUE} $(MAKE) target_1 target_1: echo ${VALUE} 我希望VALUE在所有目标中都是相同的(设置一次并在整个文件中引用其值),但在我当前的实现

我有一个随机字符串,它被生成并用于多个make目标。我的
Makefile
看起来像:

VALUE := $(shell strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n')

target_0:
  echo ${VALUE}
  $(MAKE) target_1

target_1:
  echo ${VALUE}
我希望
VALUE
在所有目标中都是相同的(设置一次并在整个文件中引用其值),但在我当前的实现中,我得到了以下结果(值不同):

如何在
Makefile
的顶部设置
VALUE
,以便对所有目标只计算和设置一次,而不是每次调用一个目标?

$(MAKE)target\u 1
是一个递归MAKE调用,是一个全新的
MAKE
进程,从顶部读取
Makefile

如果确实要这样做,可以将
VALUE=${VALUE}
传递给递归make,它将优先于
:=
赋值

        $(MAKE) target_1 VALUE=${VALUE}
作为递归的替代方法,您可以使用依赖项依次调用一个规则

target_0: target_1
         ...

$(MAKE)target_1
是一个递归MAKE调用。@jamieguinan是的,我用它从另一个目标“调用”一个目标。这很完美,谢谢;如果使用递归make调用不是最佳实践,那么我应该做什么来从另一个目标调用一个目标呢?有“递归make被认为是有害的”人群,有很好的理由支持这种观点,但我有时还是会使用它。我将编辑答案以提出替代方案。
target_0: target_1
         ...