如果ONESHELL Makefile中的语句不起作用

时间:2016-06-28 20:49:58

标签: makefile

我在下面的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。

1 个答案:

答案 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).