来自docs:
.ONESHELL
如果提到.ONESHELL
作为目标,那么当目标是 构建的所有行的配方都将被赋予一次调用 shell而不是单独调用每一行(* note 食谱执行:执行。)。
因此,一个makefile,如:
.ONESHELL :
all ::
echo 'foo
bar'
正在运行,我得到:
$ make
echo 'foo
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:4: recipe for target 'all' failed
make: [all] Error 2 (ignored)
尝试使用几乎相同的makefile,但在配方中添加-
前缀,以忽略错误,如documented: < / p>
要忽略配方行中的错误,请写一个&#39; - &#39;在。。。之初 行的文本(在初始标签之后)。 &#39; - &#39;之前被丢弃了 该行被传递给shell执行。
makefile,如:
.ONESHELL :
all ::
-echo 'foo
bar'
正在运行,我得到:
$ make
echo 'foo
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:4: recipe for target 'all' failed
make: [all] Error 2 (ignored)
bar'
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:4: recipe for target 'all' failed
make: [all] Error 2 (ignored)
为什么?
答案 0 :(得分:12)
GNU Make 3.81不支持.ONESHELL
,但3.82支持。{/ p>
$ /usr/gnu/bin/make --version
GNU Make 3.82
$ /usr/bin/gmake --version
GNU Make 3.81
$ cat gnu.mk
.ONESHELL:
all:
echo 'foo' "$$$$"
echo 'bar' "$$$$"
$ /usr/bin/gmake -f gnu.mk
echo 'foo' "$$"
foo 3100
echo 'bar' "$$"
bar 3101
$ /usr/gnu/bin/make -f gnu.mk
echo 'foo' "$$"
echo 'bar' "$$"
foo 3103
bar 3103
$
我推断你从2006年开始使用GNU Make 3.81(或者可能是早期版本,但是从2002年开始使用3.80); 3.82是2010年。当前版本是2014年的4.1。在线文档适用于当前版本。虽然许多材料也适用于旧版本,但并非所有版本都适用。
我还观察到原始的makefile
在第一行有单引号而在第二行有另一个似乎在GNU Make 3.82中引起麻烦。但是,当线条都正常时,它似乎确实有效。这有点令人费解。而且,现在我还安装了GNU Make 4.1(我已经下载了它,但还没有构建它),它也存在以下bust.mk
文件的问题。
$ cat bust.mk
.ONESHELL:
all:
echo 'foo
bar' "$$$$"
$ /usr/gnu/bin/make -f bust.mk
echo 'foo
/bin/sh: -c: line 0: unexpected EOF while looking for matching `''
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [all] Error 2
$
我不确定我是否理解GNU Make如何对此感到困惑。可能值得为它提交一个bug。 OTOH,我也不确定我是否会担心它。但是,在将来的测试中,您需要考虑这种奇怪的行为。