makefile中定义了一个变量,但Make会忽略它。为什么?

makefile中定义了一个变量,但Make会忽略它。为什么?,makefile,Makefile,从: 目标特定变量还有一个特殊特性:定义目标特定变量时,该变量值对该目标的所有先决条件及其所有先决条件都有效(除非这些先决条件使用其自身的目标特定变量值覆盖该变量) 因此,给定一个makefile: $(壳牌rm-rf x D) $(shell mkdir D) $(shell touch D/x) VPATH=D 全部:x; x:: @回音“foo is:$(foo)” .无声:D/x 全部:foo=bar 跑步,我得到: foo是: 我想,我在上面定义了:foo=bar 或者,是吗?事实

从:

目标特定变量还有一个特殊特性:定义目标特定变量时,该变量值对该目标的所有先决条件及其所有先决条件都有效(除非这些先决条件使用其自身的目标特定变量值覆盖该变量)

因此,给定一个makefile:

$(壳牌rm-rf x D)
$(shell mkdir D)
$(shell touch D/x)
VPATH=D
全部:x;
x::
@回音“foo is:$(foo)”
.无声:D/x
全部:foo=bar
跑步,我得到:

foo是:
我想,我在上面定义了:
foo=bar


或者,是吗?

事实上,你和,和

您的
Makefile
可以解释为:

  • all
    是第一个目标
  • 所有
    都有一个先决条件:
    x
  • 由于
    VPATH
    D
    所有的
    都有一个间接的先决条件:
    D/x
  • D/x
    目标处于静默状态
  • all
    和所有这些先决条件都有一个目标特定变量
    foo
    等于
    bar
对于特定于目标的事物,似乎没有考虑到间接先决条件
D/x


交互测试:
Makefile
的末尾添加
x:foo=bar
,然后
make
过程将被卡住


变通办法

  • 删除
    .SILENT
    行(我在一些测试后发现了这一点,它也解决了上述问题…)
  • Makefile
    的末尾添加
    D/x:foo=bar
    ,为
    D/x
    目标明确添加
    foo
    变量