makefile使用目标中定义的变量

makefile使用目标中定义的变量,makefile,Makefile,如何使用make目标中定义的变量 .PHONY: foo VAR_GLOBAL=$(shell cat /tmp/global) foo: echo "local" > /tmp/local VAR_LOCAL=$(shell cat /tmp/local) echo ${VAR_GLOBAL} echo ${VAR_LOCAL} 以下是执行输出: $ echo global > /tmp/global $ make foo echo "loca

如何使用make目标中定义的变量

.PHONY: foo

VAR_GLOBAL=$(shell cat /tmp/global)

foo:
    echo "local" > /tmp/local
    VAR_LOCAL=$(shell cat /tmp/local)
    echo ${VAR_GLOBAL}
    echo ${VAR_LOCAL}
以下是执行输出:

$ echo global > /tmp/global
$ make foo
echo "local" > /tmp/local
VAR_LOCAL=local
echo global
global
echo

您可能希望在中使用,请尝试:

如果从未定义过
LS\u LOCAL
(即使是通过内置规则),则可能不需要使用
override
关键字

顺便说一句,您可以通过使用与(可能与)组合的方式避免
$(shell ls/var | tail-1)
,因此您可以编写
$(lastword$(通配符/var/*))
$(notdir$(lastword$(通配符/var/*))
。但是,请注意扩展顺序,以及带有空格的文件名。最后,可能会使用您的(如果在
/bin/ls
之前出现一些奇怪的
ls
程序,可能会发生奇怪的事情)。也许使用
$(shell/bin/ls/var |/usr/bin/tail-1)
会更好

也研究;考虑一些其他的工具,比如和/或生成你的代码> MaFixFix</代码>(或者其他的构建配置),比如生成的Vistor或./P> 还要注意,recipe中的命令可以由几个物理反斜杠行组成(因此在同一个shell中执行)。也许你会考虑一些类似的事情
  export MY_VAR=$$(ls /var | tail); \
  dosomething; \
  use $$MY_VAR

在一些配方中。

正如@KelvinSherlock指出的,这是

以下是我的问题的具体解决方案:

.PHONY: foo

VAR_GLOBAL=$(shell cat /tmp/global)

foo:
    echo "local" > /tmp/local
    $(eval VAR_LOCAL := $(shell cat /tmp/local))
    echo ${VAR_GLOBAL}
    echo ${VAR_LOCAL}

谢谢@KelvinSherlock你说得对,这是个骗局。有趣的是,当我早些时候发现它时,我忽略了它。。。谢谢你的时间。当看这个问题时,请使用第二个答案,它在几乎所有情况下都比公认的答案好。这是SO中的一个缺陷:有时一个不太好的答案被接受,然后一次又一次地被拒绝,对此无能为力,而不太好的方法会传播到世界各地的makefiles中:悲伤:。嗨,谢谢你的回复。这让我意识到我的榜样并没有反映我的现实。我已经修改了我的原始代码。重要的是,VAR_LOCAL是在目标中的某一点定义的,而不是在开始时系统地定义的,因为它的值将受到目标中其他操作的影响。这是不必要的复杂,具有奇怪的副作用。我建议使用带反斜杠的单个命令行,如Basile的最后一个示例(尽管该示例中不需要导出)或上述问题中的第二个答案。请原谅混淆,我知道这个例子非常愚蠢,但其精神是把命令的结果放在一个变量中,以后再使用这个变量。你说的“以后”是指同一个配方中的以后,还是其他配方中的以后?这听起来仍然很危险。如果从未调用此配方,会发生什么?如果总是调用它,那么为什么首先需要在配方中设置变量?这听起来像是你在问一个你不需要的问题的解决方案。当然不能肯定。@MadScientist我理解你的困扰,我知道在我给出的上下文中,不可能理解我为什么要做这样的事情,以及为什么对我的问题,
eval
解决方案有效,而不是另一个。要添加一点上下文,我需要做的第一个操作是调用cli并在输出中收集一些信息。第二个命令使用后者并执行第二个cli命令。在执行第二个命令之前,我还要对变量进行
测试
,以确保该变量已设置,否则将失败。尽管如此,makefile并不是我在这里所做的正确工具,但我必须遵守一些标准。
.PHONY: foo

VAR_GLOBAL=$(shell cat /tmp/global)

foo:
    echo "local" > /tmp/local
    $(eval VAR_LOCAL := $(shell cat /tmp/local))
    echo ${VAR_GLOBAL}
    echo ${VAR_LOCAL}