makefile的使用
- 一、makefile的三要素
- 1、makefile三要素是
- 2、怎么描述三要素之间的关系
- 二、makefile项目管理
- 三、makefile的变量、模式规则
- 1、make变量三大类
- 2、makefile变量的应用
- 3、模式匹配
- 4、默认规则
- 四、Makefile条件分支
- 五、Makefile常用函数
- 1、patsubst:模式替换函数
- 2、notdir:取文件名
- 3、wildcard:获取匹配模式文件名函数
- 4、foreach
一、makefile的三要素
1、makefile三要素是
目标、依赖和命令。
2、怎么描述三要素之间的关系
1 .PHONY:targetb #.PHONY:指定targetb为伪命令
2
3 targeta:targetb targetc #targeta表示命令
4 echo "targeta"
5
6 targetb: #targetb表示命令
7 echo "targetb"
8
9 targetc: #targetc表示命令
10 echo "targetc"
.PHONY: 可以用来指定伪目标
二、makefile项目管理
1 mp3:main.o mp3.o
2 gcc main.c mp3.c -o mp3
3
4 main.o:
5 gcc -c main.c -o main.o
6 mp3.o:
7 gcc -c mp3.c -o mp3.o
8
9 .PHONY:clean
10 clean:
11 rm mp3
~
三、makefile的变量、模式规则
1、make变量三大类
(1)系统变量
1 .PHONY:all
2
3 all:
4 echo "$(CC)" #系统变量指代编译器
5 echo "$(AS)" #系统变量指代汇编器
6 echo "$(MAKE)" #系统变量值make工具
(2)自定义变量
// =,延迟赋值
B=$(A)
// :=,立即赋值
B:=$(A)
// ?=,空赋值:只有 B 变量为空的时候赋值语句才有效
B?=123
// +=,追加赋值,如果A=123,B=456,则追加赋值的结果是456 123
B+=$(A)
(3)自动化变量
$ < :第一个依赖文件
$^:全部的依赖文件
$@:目标
2、makefile变量的应用
// 没有使用 make 变量前
1 mp3:main.o mp3.o
2 gcc main.c mp3.c -o mp3
3
4 main.o:
5 gcc -c main.c -o main.o
6 mp3.o:
7 gcc -c mp3.c -o mp3.o
8
9 .PHONY:clean
10 clean:
11 rm mp3
~
// 使用 make 变量后,通用性加强
1 cc=gcc
2 TARGET=mp3
3 OBJS=main.o mp3.o
4
5 $(TARGET):$(OBJS)
6 $(cc) $^ -o $@
7
8 main.o:
9 $(cc) -c main.c -o main.o
10 mp3.o:
11 $(cc) -c mp3.c -o mp3.o
12
13 .PHONY:clean
14 clean:
15 rm mp3
~
3、模式匹配
%,匹配任意对个非空字符
shell:*通配符
4、默认规则
.o文件默认使用.c文件来进行编译
四、Makefile条件分支
ifeq(var1,var2) //如果var1与var2相等
else
endif
ifneq(var1,var2) //如果var1与var2不相等
else
endif
五、Makefile常用函数
1、patsubst:模式替换函数
$(patsubst PATTERN,REPLACEMENT,TEXT)
**例子:** $(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果
是“x.c.o bar.o”
2、notdir:取文件名
函数功能:从文件名序列“NAMES…”中取出非目录部分。目录部分是指最后一个
斜线(“/”)(包括斜线)之前的部分。删除所有文件名中的目录部分,
只保留非目录部分。
3、wildcard:获取匹配模式文件名函数
例子
$(wildcard *.c)
返回值为当前目录下所有.c 源文件列表。
4、foreach
“foreach”函数的语法:
$(foreach VAR,LIST,TEXT)
¾ 函数功能:这个函数的工作过程是这样的:如果需要(存在变量或者函数的引
用),首先展开变量“VAR”和“LIST”的引用;而表达式“TEXT”中的变量
引用不展开。执行时把“LIST”中使用空格分割的单词依次取出赋值给变量
“VAR”,然后执行“TEXT”表达式。重复直到“LIST”的最后一个单词(为
空时结束)。“TEXT”中的变量或者函数引用在执行时才被展开,因此如果在
“TEXT”中存在对“VAR”的引用,那么“VAR”的值在每一次展开式将会到
的不同的值。
¾ 返回值:空格分割的多次表达式“TEXT”的计算的结果。
我们来看一个例子,定义变量“files”,它的值为四个目录(变量“dirs”代表的 a、