一、术语解析
1.自动化变量
$<:所有的依赖集合,如fs.c,pipe.c。扩展成依靠列表中的第一个依靠文件
$@:规则的目标所对应的所有文件,扩展成当前规则的目的文件名。注:&(OBJECTS)才是所有目标的集合。
$?:
$^:扩展成整个依靠的列表(除掉了里面所有重复的文件名)
$@ 扩展成当前规则的目的文件名, $ < 扩展成依靠列表中的第一个依靠文件(如foo.o : foo.c foo.h bar.h ,则$<代表foo.c),而 $^ 扩展成整个依靠的列表(除掉了里面所有重复的文件名)。利用这些变量,我们可以把上面的 makefile 写成:
=== makefile 开始 === OBJS = foo.o bar.o CC = gcc CFLAGS = -Wall -O -g myprog : $(OBJS) $(CC) $^ -o $@ //此时,$^代表整个依靠的列表,是foo.c,bar.c(隐规则)??? $@代表myprog吧 foo.o : foo.c foo.h bar.h $(CC) $(CFLAGS) -c $ < -o $@ //{1}lt;代表foo.c,&@代表foo.o bar.o : bar.c bar.h $(CC) $(CFLAGS) -c $ < -o $@ === makefile 结束 ===
2.关键字
1)wildcard:
比较:objects = *.o //不展开
objects := $(wildcard *.o) //展开. 让objects的值是所有.o文件的集合
2)foreach n
3.伪目标.PHONY,clean,all
all : $(OUTDIR) $(OUTDIR)/$(OUTBINNAME)
.PHONY : all
===============================温馨提示:伪目标=======================================
all : prog1 prog2 prog3 .PHONY : all prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -o prog2 prog2.o prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o====================================================================================
3.标签label
4..PHONY : clean //代表clean是个伪目标文件
5.环境变量MAKEFILES:建议不用,因为它类似于全局变量,会使你所有的Makefile都受其影响。当你的makefile出现怪事时,可以检查环境变量中是否有它。
6.
#方式一:定义多行变量 define variable value value endef #方式二: variable = value #方式三: variable := value #方式四: variable += value #方式五: variable ?= value三、通配符
*
?
...
~
%
注意:若文件句中有*,则可以加上转义字符\*
=========== 实例解析 ==============
1)*.c与%.c是同义吗?
===================================
四、使用函数
1. $(subst <from>,<to>,<text>)
把字串text中的from替换成to
2.$(patsubst <pattern>,<replacement>,<text>)
模式字串替换函数:pattern(模式)
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把 x.c.c bar.c符合模式%.c替换成%.o,替换结果为x.c.o bar.
3.
五、其它
1.文件搜寻
1)
VPATH = src:../headers
上面指令指定 了两个目录“src”和“../headers”,当然当前目录永远是最先搜索的对象。目录由“:”分开。
2)
vpath %.c foo vpath %.c blish vpath %.c bar
上面指令表示先在foo目录中搜索.c文件,然后依次在blish目录,bar目录搜索。
3)
vpath %.h ../headers
上面是模式搜索
六、Makefile规则
target ... : prerequisites ...
command
target:是一个目标文件,可以是object file(多个文件),也可以是执行文件,还可以是标签。
prerequisites:是生成 target所需要的文件或目标
====================== 温馨提示 ===============================
edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o //小心观察比较,这里的CC跟的是-o,后面跟的是edit,main.o等。下面的CC跟的是-c,其后 //跟的是.c main.o : main.c defs.h cc -c main.c
==============================================================
七、 让make自动推导
1.只要makefile看到.o文件它就会自动推导找到生成自己的.c文件
自动推导文件及文件所依赖的命令