我很困惑为什么我需要回复$(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。
答案 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
行。