gpt4 book ai didi

makefile - .ONESHELL 在 makefile 中无法正常工作

转载 作者:行者123 更新时间:2023-12-02 19:59:14 25 4
gpt4 key购买 nike

来自 docs :

.ONESHELL

If .ONESHELL is mentioned as a target, then when a target is built all lines of the recipe will be given to a single invocation of the shell rather than each line being invoked separately (*note Recipe Execution: Execution.).



所以,一个 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 :

To ignore errors in a recipe line, write a '-' at the beginning of the line's text (after the initial tab). The '-' is discarded before the line is passed to the shell for execution.


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)



为什么?

最佳答案

GNU Make 3.81 不支持 .ONESHELL,但 3.82 支持。

$ /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(或者可能是更早的版本,但 3.80 是 2002 年的); 3.82 是从 2010 年开始的。当前版本是从 2014 年开始的 4.1。在线文档适用于当前版本。虽然许多 Material 也适用于旧版本,但并非全部都适用。

我还观察到,即使在 GNU Make 3.82 中,原始的 makefile 在第一行有一个单引号,第二行有另一个单引号似乎也会造成麻烦。然而,当线路都正常时,它似乎确实有效。这有点令人费解。而且,现在我还安装了 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 是如何对此感到困惑的。可能值得为此提交一个错误。 OTOH,我也不确定我是否会为此担心。但您需要在未来的测试中考虑这种奇怪的行为。

关于makefile - .ONESHELL 在 makefile 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32153034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com