参考:http://blog.csdn.net/yusiguyuan/article/details/16951413
在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙。下面总结了一些。
1:尽在Makefile文件的目标项冒号后的另起一行的代码才是shell代码。
eg:
xx = xx1 // 这里时makefile代码
yy:xx = xx2 // 这是是makefile代码,makefile允许变量赋值时,'='号两边留空格
yy:
xx=xx3 // 只有这里是shell代码 ,shell不允许‘=’号两边有空格哦。
有一个例外:
xx=$(shell 这里的代码也是shell代码)
2.
在makefile中只能在target中调用shell脚本,如果命令放在了target之前,脚本执行后会报错。所有命令必须放在target之后,并且用tab键起行。
比如:
rm -rf ...
all:
...
makefile: *** commands commence before first target。 停止。
正确如下:
eg:
var=foo
all:
@echo $(var)
3.
Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递。如果你要让上一条命令的结果应用到下一条命令时,应该使用分号分隔这两条命令。比如第一条命令是cd,第二条命令在第一条的基础上运行,需要把两个命令写在一行并用;分隔。
错误实例:
all:
cd /home/joan/
pwd
结果:pwd并没有打印joan目录下的路径,而是脚本所在目录的。正确写法:
all:
cd /home/joan/;pwd
4、Makefile中所有以$打头的单词都会被解释成Makefile中的变量。如果你需要调用shell中的变量(或者正则表达式中锚定句位$),都需要加两个$符号($$)。实例如下:
PATH="/data/"
all:
echo ${PATH}
echo $$PATH
打印结果:
echo "/data/"
/data/
echo $PATH
"/data/"
对于第4点的说法表示怀疑。两个$$在一起表示一个真实的“$”,第二个echo输出echo $PATH 由于 $PATH为"/data/"故打印"/data/"