Macros Makefile:如何使在一个目标中计算的宏值可用于另一个目标?

Macros Makefile:如何使在一个目标中计算的宏值可用于另一个目标?,macros,makefile,target,Macros,Makefile,Target,我正试图在Makefile中执行此操作: VAL= TARGET1: VAL= ... #compute value of VAL #run some command that uses the value of VAL TARGET2: $(MAKE) TARGET1 #run other command that uses the value of VAL 但事实证明,VAL的值在达到目标时被重置!在TARGET2中完成。因此,当我尝试在TARGET2中运

我正试图在Makefile中执行此操作:

VAL=

TARGET1:
    VAL= ... #compute value of VAL
    #run some command that uses the value of VAL
TARGET2:
    $(MAKE) TARGET1
    #run other command that uses the value of VAL

但事实证明,VAL的值在达到目标时被重置!在TARGET2中完成。因此,当我尝试在TARGET2中运行另一个命令时,VAL的计算值不可用。有没有办法保持在TARGET1中计算的值?谢谢。

你有一个基本的误解。在
TARGET1
配方中设置的变量
VAL
根本不是make变量:它是一个shell变量。您可以判断,因为如果您将赋值语法更改为其他仍然有效的make变量赋值,但不是有效的shell变量赋值,例如:

TARGET1:
        VAL := foo
它会给你一个语法错误。基本上在make中,make根本不解释任何配方行(目标后面以TAB字符开头的行):它们被传递给make调用的shell。当然,shell中发生的任何事情都不会对make变量的值产生任何影响

你没有给我们太多细节。您不会说命令是使用环境变量还是通过命令行使用变量。你不会说你使用的是哪个版本的make。如果是GNU make,您有很多选择。最简单的方法是始终设置值;如果需要shell语法,可以使用shell函数:

VAL := $(shell #compute value of VAL)

TARGET1:
        #run some command that uses $(VAL)
TARGET2:
        #run another command that uses $(vAL)
在我们为您提供更多可能性之前,我们需要了解需求:如果您必须在
TARGET1
中设置值,我们需要知道原因,然后才能提供可能的解决方案