【发布时间】:2017-02-10 11:03:52
【问题描述】:
我有这样的文件目标
foo:
i = 1
@echo $(i)
当我像这样运行 make 文件时:
$ make foo
i = 1
make: i: 找不到命令
Makefile:2: 目标“foo”的配方失败
make: [foo] 错误 127
但是如果我在赋值中不给空格(即)
i=1
那么没有错误但没有输出,i的值没有打印出来
【问题讨论】:
标签: makefile
我有这样的文件目标
foo:
i = 1
@echo $(i)
当我像这样运行 make 文件时:
$ make foo
i = 1
make: i: 找不到命令
Makefile:2: 目标“foo”的配方失败
make: [foo] 错误 127
但是如果我在赋值中不给空格(即)
i=1
那么没有错误但没有输出,i的值没有打印出来
【问题讨论】:
标签: makefile
第一次尝试运行带有参数= 和2 的命令i。在 shell 中正确的赋值有no spaces on either side of the equals sign.
您的第二个问题是两条物理线路上的配方将运行两个不相关的 shell 实例。第一个将变量设置为一个值,然后退出并丢失该变量。第二个不相关的实例不知道第一个做了什么,当然也没有变量赋值的痕迹。解决方法是在逻辑上将两者合并为一行(只要它们之间有分号,您仍然可以将这些行拆分为多条物理行):
foo:
i=1; \
echo "$${i}"
还要注意我们如何需要将美元符号加倍以防止make 解释它们;和 proper use of quotes around strings in the shell.(在这种特殊情况下,我们知道字符串不包含任何 shell 元字符;但许多初学者也遇到了这个问题。)
GNU Make 也允许您指定 .ONESHELL,这会强制在单个 shell 实例中对配方中的所有命令进行评估;
.ONESHELL:
foo:
i=1
echo "$${i}"
【讨论】:
在第一种情况下,您指示 make 运行 shell 命令:i = 1。
如果你想在Makefile 中添加一个变量,你应该设置没有前导空格/制表符。
我假设您使用 GNU 的 make 并且您想检查 Recipe Syntax(或类似的其他 makes):
“规则上下文”中的变量定义,由制表符缩进 作为该行的第一个字符,将被视为 配方,而不是 make 变量定义,并传递给 shell。
【讨论】:
echo ${i},正如你所写:)
Makefile是什么?