1 基础知识复习
目标:依赖1 依赖2
[TAB]命令
当"目标文件"不存在, 或某个依赖文件比目标文件"新",则: 执行"命令"
makefile 语法
a. 通配符: %.o
$@ 表示目标
$< 表示第1个依赖文件
$^ 表示所有依赖文件
$@ 表示目标
$< 表示第1个依赖文件
$^ 表示所有依赖文件
b. 假想目标: .PHONY
c. 即时变量、延时变量, export
简单变量(即时变量) :
A := xxx # A的值即刻确定,在定义时即确定
B = xxx # B的值使用到时才确定
简单变量(即时变量) :
A := xxx # A的值即刻确定,在定义时即确定
B = xxx # B的值使用到时才确定
:= # 即时变量
= # 延时变量
?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
+= # 附加, 它是即时变量还是延时变量取决于前面的定义
= # 延时变量
?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
+= # 附加, 它是即时变量还是延时变量取决于前面的定义
003_Makefile函数
a. $(foreach var,list,text)
b. $(filter pattern...,text) # 在text中取出符合patten格式的值
$(filter-out pattern...,text) # 在text中取出不符合patten格式的值
a. $(foreach var,list,text)
b. $(filter pattern...,text) # 在text中取出符合patten格式的值
$(filter-out pattern...,text) # 在text中取出不符合patten格式的值
c. $(wildcard pattern) # pattern定义了文件名的格i式,
# wildcard取出其中存在的文件
d. $(patsubst pattern,replacement,$(var)) # 从列表中取出每一个值
# 如果符合pattern
# wildcard取出其中存在的文件
d. $(patsubst pattern,replacement,$(var)) # 从列表中取出每一个值
# 如果符合pattern
如下makefile文件
1 A=q w e
2
3 B=$(foreach n,$(A),$(n).o)
4
5 C=a b c d/
6 D=$(filter %/,$(C))
7 E=$(filter-out %/,$(C))
8
9 files=$(wildcard *.c)
10 file0=a.c b.c c.c d.c
11 file1=$(wildcard $(file0))
12 all:
13 @echo B=$(B)
14 @echo D=$(D)
15 @echo E=$(E)
16 @echo files=$(files)
17 @echo file1=$(file1)
当前目录文件为
book@www.100ask.org:~/myFile/k$ ls
a.c b.c makefile
相应的输出结果为:
book@www.100ask.org:~/myFile/k$ make
B=q.o w.o e.o
D=d/
E=a b c
files=a.c b.c
file1=a.c b.c
自动添加头问价
gcc -c -o c.o c.c -MD -MF c.d // 编译c.o, 把依赖写入文件c.d c.d问价将包含生成程序所需的头文件信息
gcc -c -o c.o c.c -MD -MF c.d // 编译c.o, 把依赖写入文件c.d c.d问价将包含生成程序所需的头文件信息
则相应的Makefile文件为:
1 objs =b.o helloWorld.o
2 devfile:=$(patsubst %,.%.d,$(objs))
3 devfile:=$(wildcard $(devfile))
4
5 test:$(objs)
6 gcc -o $@ $^
7 #@echo devfile =$(devfile)
8 @echo $(B)
9 ifneq ($(devfile),)
10 include $(devfile)
11 endif
12 %.o:%.c
13 gcc -c -o $@ $< -MD -MF .$@.d
14 clean :
15 rm -rf %.o
16 .PHONY:clean
如此将自动添加相应的头文件