为什么在这个最小的Makefile中需要括号(或大括号)?

时间:2018-06-08 14:08:28

标签: bash variables makefile variable-expansion

我很困惑为什么我需要回复$(VAR1)${VAR1}以获得输出" abcd"在这个Makefile中:

VAR1=abcd

myTarget:
        @echo $VAR1

all: myTarget

.PHONY: all

相反,make将回显$V(这是空字符串),然后是" AR1",这是我的输出。

我知道在bash中,echo $VAR1可以获得" abcd",我的理解是代码的缩进部分在bash中运行。我使用的是GNU Make 3.81。

2 个答案:

答案 0 :(得分:1)

需要它,因为语法用来引用变量。例如,请参阅GNU make manual,甚至是make的POSIX标准定义。

请注意,makefile是不是 shell脚本,并且不具有与shell脚本相同的语法。 Makefile在配方中包含 shell脚本(或至少是shell命令)。

通过设置变量:

VAR1 = abcd
在您的makefile中

创建 make 变量,而不是 shell 变量。

首先由make解析一个配方(由TAB缩进的命令),并扩展所有的make变量引用。然后将该扩展的结果传递给shell。由于您要在配方中引用 make 变量,因此必须使用make变量引用语法。

答案 1 :(得分:0)

  

我知道在bash中,echo $VAR1可以获得“abcd”,我的理解是代码的缩进部分是bash执行的内容。

$VAR1扩展为make(不是bash),实际上相当于展开$(V)AR1。扩展后生成的行是bash执行的行。

您需要转义$中的前导$VAR1,以防止make扩展变量。逃避可以通过在$之前增加$VAR1来实现,即:

myTarget:
        @echo $$VAR1

这样,bash会收到第echo $VAR1行。