makefile之嵌套shell命令

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/joan11_3/article/details/51570641

参考: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/"


展开阅读全文

没有更多推荐了,返回首页