makefile 的语法
1、变量替换
如: OBJS=*.o
$(OBJS) -- 使用变量
2、在命令前加了1个‘@’,使 make 不打印出命令
3、目标:依赖
先执行依赖,在执行目标
目标也可以写成多个
all test:
@echo "hello wrold"
all 被视为默认目标
4、增量编译
通过文件的时间戳 来进行增量编译,如果依赖的文件比目标的文件时间要新,那么就会进行编译
5、如果目标是all ,但是实际不生成all,而生成别的,
连续make2次的话,其实第2次还是会执行一个编译生成可执行程序的命令,
因为第2次make的时候,all没有找到(因为没有生成)
6、伪目标 .PHONY
采用.PHONY 关键字声明已个伪标后,make 并不会将其当作1个问件来处理,只是
当作1个概念上的目标。对于假目标,我们可以想像的是由于并不与⽂件关联,所以每1次 make 这个假
目标时,其所在的规则中的命令都会被执行
7、定义变量
使用$(变量名) 来使用
8、自动变量
$@ -- 目标
@^ -- 依赖
$< -- 依赖中的第一个 , 一般用在 依赖里面写.h的时候
例如
$(DIR_OBJS)/%.o: %.c foo.h
$(CC) -o $@ -c $<
这样子做的话,.h有更新的时候,makefile 也能识别到
9、系统的特殊变量
1、MAKE -- 编译工具
2、MAKEGOALS -- 编译的目标
10、条件赋值, ?=
条件赋值的意思是当变量以前没有定义时,就定义它并且将左边的值赋值给它
,如果已经定义了那么就不再改变其值
11、可以通过shell 命令行传入参数的值
make x=2
12、高级变量引用功能 修改后缀,或者替换指令字符
.PHONY:all clean
a=foo.o
b=$(a:.o=.c)
all clean:
@echo x = $(b)
13、override
修饰的变量,不会被shell传入的值所修改
14、模式, %.o,%.c 自动变量 的使用
15、函数,wildcard,patsubst
wildcard 获得我们所需的文件
patsubst 替换字符串函数
SRCS = $(wildcard *.c)
$(patsubst %.c,%.o,$(SRCS)) -》把.c 替换为.o
$(addprefix prefix,name)
filter 根据模式获取需要的字符串
file=a.c a.h b.o c.h g.c .p.cpp
$(filter pattern..., text)
all:
@echo filter= $(filter %.c,$(file))
filter-out 根据模式,过滤掉字符串
$(filter-out pattern..., text)
strip 去掉多余的空格
$(strip $(var))
16、在同一个shell中运行多个命令,用分号隔开,用\分行写
因为对于规则中的每一个命令,make都是在一个新的shell上运行它的