object=input.o calcu.o main.o #clean 声明为伪目标 .PHONY : clean main: $(object) #也可以写成:gcc $(object) -o main gcc $^ -o main #$@ 目标集合:也就是%.o;$<依赖文件集合中的第一个文件;$^所有依赖文件的集合 %.o: %.c gcc -c $< clean: rm main rm *.o
变量赋值:”=”相当于取地址,”:=”当前值,”?=”如果变量没有值测赋值
行业默许规则:果变量没clean:清除 distclean:比clean更加彻底,会删除makefile
自动化变量:
$@ 规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义的目标集合。
$% 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。
$< 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么“$<”就是符合模式的一系列的文件集合。
$? 所有比目标新的依赖目标集合,以空格分开。
$^ 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。
$+ 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
$* 这个变量表示目标模式中”%”及其之前的部分
MAKECMDGOALS make的最终目标,如make -s B=1 usart 那么MAKECMDGOALS=usart
MAKEFLAGS make的参数,如make -s B=1 usart 那么MAKEFLAGS=s — B=1
Tab按键:
makefile 中Tab按键不能乱用只有shell命令之前才可以用Tab,
自动依赖关系:
make遇到%.o 文件回自动把%.h %.c这2个依赖加进去
而且Makefile 函数使用
1.makefile 中函数变量的使用:$(函数) $(变量)
VALUEA=”Hello” VALUEB=Hello; VALUEA变量包含”,因此VALUEA!=VALUEB
2.调试信息info
VGB=Hello world
$(info $(filter Hello,$(VGB))) ==Hello
$(info $(filter-out Hello,$(VGB)))==word
$(info $(filter Hell,$(VGB)))==””
3.条件判断ifeq
ifeq (<参数 1>, <参数 2>)
ifdef <变量名>
4.字符串操作subst,patsubst
$(subst <from>,<to>,<text>) $(subst zzk,ZZK,my name is zzk)
$(patsubst <pattern>,<replacement>,<text>) $(patsubst %.c,%.o,a.c b.c c.c)
6.字符串操作,提取第一个单词firstword
$(firstword <text>) $(info $(firstword hello kitty)) 输出hello
7.字符提取filter
$(filter <filter_text>, <text>) 从text提取所有”filter_text”单词,$(info $(filter hello Wor,hello World)) 输出 hello
8.字符剔除filter-out
$(filter-out <filter_text>, <text>) 从text剔除所有”filter_text”单词,$(info $(filter hello Wor,hello World)) 输出 Word
9.ifeq与ifdef
第一个是函数,第二个是宏定义,引用的时候ifeq需要 $(ifeq , ),而ifdef不需要。但是两者接同样的 else endif