书写Makefile的规则
在上一篇文章《GNUmake与Makefile的简介》中我们了解了make的运行机制以及简单的Makefile规则的书写。那么这篇文章中,我们详细来介绍Makefile的规则的书写。
一、规则的组成
一个规则通常包含三部分:目标,依赖和命令。目标是我们执行make生成的目标文件,依赖是生成目标文件所参与的文件,命令则是生成我们目标文件的过程。
二、通配符
3. 除了目标和依赖之外的地方,无法直接使用通配符,只能通过 wildcard 函数来达到目的。
三、文件的查找
1. VPATH变量
VPATH = path1:path2
2. vpath关键字
四、伪目标
.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命令。