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)
当前目录文件为
[email protected]:~/myFile/k$ ls a.c b.c makefile
相应的输出结果为:
[email protected]:~/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 [email protected] 14 clean : 15 rm -rf %.o 16 .PHONY:clean如此将自动添加相应的头文件