我在下面的makefile中为if语句得到/bin/sh: -c: line 1: syntax error: unexpected end of file
- 出了什么问题? (我的提示是/tmp >
。)
/tmp > make test
set -e
if [[ -f /tmp/device ]] ; then
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [test] Error 2
/tmp > cat Makefile
.ONESHELL:
test:
set -e
if [[ -f /tmp/device ]] ; then
echo 'Do something'
fi
我正在使用GNU Make 3.81。
答案 0 :(得分:5)
使用GNU Make 3.81,.ONESHELL
功能明显不受支持 - 你展示了,我展示了这一点。我在Mac OS X 10.11.5上进行了测试,提供的/usr/bin/make
为GNU Make 3.81。我通过在echo PID=$$$$
之前,之后添加战略性放置的set -e
行来证明我的满意度,依此类推,并观察到不同的PID值。 GNU Make 3.81版本是从2006年开始的(从版本4.x发布之前的版本3.x开始,从2010年开始3.82版本,从2013年的4.0开始)。
当前版本的GNU Make是4。2。1(2016年6月)。该版本确实支持该功能;使用最新版本的GNU Make时,您的脚本按预期工作。这是一个已经存在一段时间的功能 - 您可能不必升级到最新版本以获得支持,但是如果您要进行升级,为什么还要使用降版版本?
如果您希望使用.ONSHELL:
功能,则必须确保使用足够新版本的GNU Make(比版本3.81更新)。如果这不可行,请不要使用此功能。
从4.2.1中读取NEWS文件,很明显{GNA Make 3.82版已添加ONESHELL
:
Version 3.82 (28 Jul 2010) … * New special target: .ONESHELL instructs make to invoke a single instance of the shell and provide it with the entire recipe, regardless of how many lines it contains. As a special feature to allow more straightforward conversion of makefiles to use .ONESHELL, any recipe line control characters ('@', '+', or '-') will be removed from the second and subsequent recipe lines. This happens _only_ if the SHELL value is deemed to be a standard POSIX-style shell. If not, then no interior line control characters are removed (as they may be part of the scripting language used with the alternate SHELL).