Makefile
Makefile 文件命名和规则
文件命名:一个Makefile可以有一个或者多个规则
目标... :依赖 ...
命令 (shell命令)
目标:最终要生成的文件
依赖:生成目标所需要的文件或者是目标
命令:通过执行命令对依赖操作生成目标(命令前必须 Tab 缩进)
Makefile 中的其它规则一般都是为第一条规则服务的。
命令在执行之前,需要先检查规则中的依赖是否存在
- 如果存在,执行命令
- 如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如果找到了,则执行该规则中的命令
检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
- 如果依赖的时间比目标的时间晚,(依赖更新了)需要重新生成目标
- 如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被
执行
自定义变量
变量名 = 变量值:var = hello
对变量名取值:$(var)
一些预定义的变量
预定义变量只能在规则的命令中使用
AR : 归档维护程序的名称,默认值为 ar
CC : C 编译器的名称,默认值为 cc
CXX : C++ 编译器的名称,默认值为 g++
$@ : 目标的完整名称
$< : 第一个依赖文件的名称
$^ : 所有的依赖文件
app:main.c a.c b.c
gcc -c main.c a.c b.c
app:main.c a.c b.c
$(CC) -c $^ -o $@
简单的模式匹配
常用的函数
$(wildcard PATTERN...)
功能:获取指定目录下指定类型的文件列表
参数:PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多
个目录,一般使用空格间隔
返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
示例:$(wildcard .c ./sub/.c)
返回值格式: a.c b.c c.c d.c e.c f.c
$(patsubst
功能:查找
%
,表示任意长度的字串。如果%
,那么,%
将是\
来转义,以\%
来表示真实含义的%
字符)
返回:函数返回被替换过后的字符串
$(patsubst %.c, %.o, x.c bar.c)
返回值格式: x.o bar.o
一个简单的Makefile
src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(src)
$(CC) $(src) -o target
%.o:%.c
$(CC) -c $< -o $@
.PHONY:clean
clean:
rm $(objs) -f