二、书写Makefile的规则

书写Makefile的规则

在上一篇文章《GNUmake与Makefile的简介》中我们了解了make的运行机制以及简单的Makefile规则的书写。那么这篇文章中,我们详细来介绍Makefile的规则的书写。

一、规则的组成

一个规则通常包含三部分:目标,依赖和命令。目标是我们执行make生成的目标文件,依赖是生成目标文件所参与的文件,命令则是生成我们目标文件的过程。

格式:
目标 : 依赖
[Tab]命令
再一次提醒,命令前面一定要输入一个制表符号,否则命令是无效的。

二、通配符

Makefile支持三种通配符:*,?,[...]。与bash shell中的通配符完全相同。
*:表示零个或多个任意字符
?:表示任务单个字符
[need]:任何need里包含的字符
[!notneed}:任何notneed里包含的字符

通配符的使用规则:

1. 在目标、依赖中的通配符 , make 在读取时会自动为其进行匹配处理(即展开)
2. 在命令中的通配符不需要 make 来操心,他是 shell 执行的。
3. 除了目标和依赖之外的地方,无法直接使用通配符,只能通过 wildcard 函数来达到目的。

三、文件的查找

当 make 需要寻找依赖文件 时,最好的办法是告诉 make 路径,让 make 自动去查找。 make 中有两种指定文件与路径关系的方法。

1. VPATH变量

在 make 中,有一个类似于 Linux 中的 PATH 类似的变量。 设置的方式也是与Linux 中的 PATH 类似。
VPATH = path1:path2

2. vpath关键字

vpath不是变量,是make的关键字,它可以为不同类型的文件指定不同的搜索目录。
格式:
vpath 模式 文件路径
模式需要包含%,意思是匹配一个或多个字符,文件路径可以有多个目录,以冒号分隔。

四、伪目标

伪目标是一个规则,这个规则不真正的生成目标文件,也不存在依赖文件,它只是单纯的执行命令本身。用.PHONY : 目标名来显示的告诉make,这个目标是一个伪目标,无论目录下是否存在这个和这个目标名一样的文件,都会执行命令。相反的如果没有加上这个显示的表示,如果目录下存在这个文件,那么由于其没有依赖,所以这个文件总是最新的,命令总是得不到运行。

.PHONY : clean
clean :
(制表符)rm -f *.o

五、空目标文件

空目标文件时伪目标的一个变种,空目标文件时一个文件,我们并不关心文件内容,这个空文件用来记录此规则命令执行的最后时间。这样的规则中,命令都会使用touch命令在完成所有的命令之后来更新目标文件的时间戳。

六、隐藏命令回显

命令在执行之前,会把当前的所要执行的命令输出到标准输出中,如果我们不想在命令执行的时候回显,就在命令前加上@符号。或者执行make时,加上-s参数,表示禁止所有的命令回显。

七、命令的执行

Makefile中书写在同一行的多个命令属于完整的shell命令。独立写在每一行的命令是一个独立的shell命令。因此如果下一条命令依赖于上一条命令的运行环境,我们就不能够将命令独立开来,而应该将其书写在同一行,用分号隔开。也就是说,独立一行的上一条命令cd的结果,并不会再下一行中产生影响。

八、make的递归执行

当make执行过程中,需要调用子目录下的makefile,这就需要我们递归执行make。假设存在子目录subdir,子目录下存在Makefile,我们需要在父目录执行make的时候调用目录下的make。$(MAKE) –C subdir,$(MAKE)是预定义变量,其值是带参数或不带参数的make命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值