.ONESHELL在makefile中无法正常工作

时间:2015-08-22 06:18:40

标签: makefile gnu-make

来自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)



为什么?

1 个答案:

答案 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,我也不确定我是否会担心它。但是,在将来的测试中,您需要考虑这种奇怪的行为。