【说明:本文是对于《跟我一起写Makefile》自我总结,原作者:陈皓】
【参考链接】https://seisman.github.io/how-to-write-makefile/index.html
Makefile 书写规则
一、 规则包含两个部分:一是:依赖关系;二是:生成目标的方法
二、 规则的语法
(1) targets : prerequisites
(2)(Tab键开头) command
(3) #如果命令太长可以使用 ’ \ ',作为换行符
三、在规则中使用通配符
(1)make支持三个通配符:“*”、“ ? ” 、 “ […] ”
(2)举例说明
//例一
clean:
rm -f *.o
//例二
//目标test依赖于所有的【.c】文件
test:*.c
//例三
//不是说【*.o】会展开,objects的值就是“*.o”
objects = *.o
//例四
//1.如果你要让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合
//2.利用关键字“wildcard”指出
objects := $(wildcard *.o)
四、文件搜寻
(1)在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。
(2)Makefile 文件中的特殊变量“VPATH”就是完成这个功能(方式一)
(3)若没有指明这个变量,make 只会在当前的目录去找寻依赖文件和目标文件。
(4)若定义了这个变量,那么make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。
/* 不同目录之间由 “冒号” 分隔(搜索的最高优先级永远都是当前目录)
* 【src】和 【../header】,make会按照这个顺序进行搜索
*/
VPATH = src:../headers --- 方式一
(5) 方式二:设置文件搜索路径的方法是使用 make 的“vpath”关键字【注意,它是全小写的,是一个关键字】,它可以指定不同的文件在不同的搜索目录中。使用上比VPATH灵活。它的使用方法有三种:
1、vpath <pattern> <directories>
// 为符合模式<pattern>的文件指定搜索目录<directories>
2、vpath <pattern>
// 清除符合模式<pattern>的文件的搜索目录
3、vpath
// 清除所有已被设置好了的文件搜索目录
(6) vpath 使用方法中的需要包含“%”字符
(7) “%”的意思是匹配零或若干字符
(8) 例如,“%.h”表示所有以“.h”结尾的文件
(9) 指定了要搜索的文件集
(10)则指定了的文件集的搜索的目录
//要求make在【../headers】目录下搜索所有【*.h】结尾的文件
vpath %.h ../headers ---方式二
五、伪目标(是一个标签,不是文件)
(1)伪目标取名不能和文件名重名
(2)为了避免重名,可以使用一个特殊标记【.PHOUY】,指明这是伪目标
(3)整个过程书写方式
.PHOUY:clean
clean:
rm -f *.o test
六、多目标
(1)Makefile 的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件
(2)多个目标的生成规则的执行命令是同一个,可以通过使用
(3)一个自动化变量“$@” — 表示目标的集合,像一个数组一样
七、静态模式可以更容易定义多目标的规则
(1)语法
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
......
(2)举例
// 【$<】 表示所有的依赖目标集(也就是“foo.c bar.c”)
// 【$@】表示目标集(也就是“foo.o bar.o”)
objects = foo.o bar.o
all: $(objects)
$(objects): %.o:%.c
$(CC) -c $(CFLAGS) $< -o $@