在Makefile

时间:2018-10-15 12:40:31

标签: shell makefile

执行命令make时,我收到一条错误消息

  

Makefile:4:***缺少分隔符。停止。

Makefile中的命令是:

$(shell ./makejce common/jce jce)

怎么了?

------- makejce ---------

#!/bin/bash
FLAGS=""
local_protoc=""
dir0=`pwd`
dir=`pwd`
......

if [ $# -gt 1 ]
then
    mkdir -p $2
    cd $2
    dir=`pwd`
    cd $dir0
fi

cd $1
jce_dir=`pwd`

#sub dir
for d in `ls -d */`
do
    if [ -d $d ]
    then
            cd $d
            for f in `find . -name '*.jce'`
            do  
                    ${local_protoc} ${FLAGS} --dir=${dir} $f
            done
            cd $jce_dir
    fi
done

#current dir
for f in `ls *.jce`
do
    ${local_protoc} ${FLAGS} --dir=${dir} $f
done

cd $dir0

----- makefile ------

......
$(shell ./makejce common/jce jce)
......

1 个答案:

答案 0 :(得分:2)

信息太少,看起来就很奇怪(为什么要在shell脚本中运行所有构建步骤,然后使用shell makefile函数调用该脚本?makefile的全部目的是管理构建步骤...),但没有更多信息,我只会回答您的特定问题:

make shell函数在shell脚本中的作用类似于反引号或$(...):也就是说,它在shell中运行命令,并扩展到命令的标准输出。 / p>

在makefile中,如果有:

$(shell echo hi)

然后运行shell命令echo hi并扩展到标准输出(即hi)。然后make将尝试将其解释为某些makefile文本,因为这是您将函数调用(单独放在一行上)的地方。这是语法错误,因为make不知道如何处理字符串hi

如果您要运行shell函数,则(a)重定向其输出以使其不输出任何内容:

$(shell ...command... >/dev/null 2>&1)

或(b)在不会打扰的地方捕获输出,例如在这样的变量中:

_dummy := $(shell ...command...)

(通过在此处使用:=,我们可以确保在解析Makefile时评估shell函数)。