执行命令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)
......
答案 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
函数)。