make总结(一):基础
一、make是一条条规则组成的。规则由目标,依赖,命令组成。
1. 执行make “target”是为了生成我们想要的目标,单独执行make则会生成默认目标(第一个目标)。而为了生成目标会先去生成依赖,造成链式反应。
2. make中有所谓的假目标,用.PHONY定义。因为make通常将目标当做文件(或目录)来处理,当目录文件名与目标重叠时会造成无法执行想要目标。
采用假目标后,执行make “target”一定会执行相应规则中的命令。
二、make中的变量
1. 自动变量:$@, $^, $<
2. 特殊变量:MAKE, MAKECMDGOALS.
MAKE:当前处理Makefile的命令名是什么。 MAKECMDGOALS:当前构建的目标名。
3. 几种变量赋值方式:=, :=, ?=, +=
=: 所谓递归扩展变量。:= :所谓简单扩展变量。+=:追加变量。 ?= :条件赋值。
4. makefile中的变量可以来自make命令的参数(可以覆盖makefile中的原来的值, override foo=x可以避免覆盖),也可以来自shell环境。
5. 变量赋值的同时完成文件名后缀的替换:bar:=$(foo:.c=.o)
三、利用“模式”精简规则
1. 模式类似于通配符,但是有区别。%多用于规则描述。
2. 关于%和*:此两者均为通配符,但更准确的讲,%为Makefile规则通配符,一般用于规则描述,如
%.o:%c
$(CC) $< -o $@
表示所有的目标文件及其依赖文件,或者$(filter %.c ,SOURCES)
此处SOURCES表示包含.c .cc .cpp等多类型源文件,该过滤器函数将c文件过滤出来,而%.c即为此过滤器规则。
通配符*则不具备上述功能。尤其是在Makefile,当变量定义或者函数调用时,该通配符的展开功能就失效了,即不能正常使用了,
此时需要借助wildcard函数。二者应用范围不同。
四、make中的函数
1. 函数调用格式:$(func args)
2. wildcard: 通配符函数 $(wildcard pattern)
SRC=$(wildcard *.c)
3. patsubst:模式替换函数 $(patsubst pattern, replacement, text)
4. abspath: 绝对路径函数 $(abspath name)
5. addprefix: 增加前缀 $(addprefix prefix, name)
6. addsuffix: 增加前缀 $(addsuffix suffix, name)
7. eval: 再次解析text $(eval text)
8. filter: 过滤器函数 $(filter pattern, name)
9. filter-out: 过滤器函数 $(filter-out pattern, name)
10. notdir:从路径抽取文件名 $(notdir name)
11. realpath: 获取真实路径名 $(realpath name)
12. strip 去除多余空格 $(strip string)
五、举例
假想项目simple,simple目录里有main.c foo.c,内容如下:
1 extern void foo(); 2 3 int main() 4 { 5 foo(); 6 return 0; 7 }
1 #include <stdio.h> 2 3 void foo() 4 { 5 printf("this is foo()\n"); 6 }
Makefile内容如下:
1 .PHONY:clean 2 3 CC=gcc 4 RM=rm 5 6 ALL=simple 7 SRCS=$(wildcard *.c) 8 OBJS=$(patsubst %.c, %.o, $(SRCS)) 9 10 11 $(ALL):$(OBJS) 12 $(CC) -o $@ $^ 13 14 %.o:%.c 15 $(CC) -c -o $@ $^ 16 clean: 17 rm $(OBJS) $(ALL)
浙公网安备 33010602011771号