示例(3个头文件和8个C文件)
> make
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
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
常用makefile目标名
• Clean一般用来清除编译过程中的中间文件。
• Install目标名常会把最终的二进制文件、所支持的库文件和shell脚本以及相关文档移到文件系统中与它对应的位置,同时设置文件的权限和所有者。
• Uninstall用来删除install目标安装的文件。
• Dist常常用于删除编译工作目录中旧的二进制文件和目标文件并且创建归档文件。
• Depend用来设置makefile文件中各个目标所需要的依赖文件列表。
• Installtest和installcheck一般用于验证install目标的安装过程。
Rules(规则)
• 显式规则
• 变量定义
• 隐晦规则
• 文件指示
• 注释
变量
• 前面例子中重复使用2次
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
• Makefile的变量可以理解为C语言中的宏 ,可以定义变量objects:
• objects = main.o kbd.o command.o
display.o \
insert.o search.o files.o utils.o

隐讳规则:自动推导
• Make具有自动推导文件以及文件依赖关系后面的命令,没必要在每一个.o文件后写同名的.c文件,以及编译命令
• 此既是make的“隐晦规则”

文件指示
包括三个部分:
• 在一个Makefile中引用另一个Makefile
• 根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样
• 定义一个多行的命令
文件引用
• include
• Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
注释
• Makefile中只有行注释:#
• 就像C/C++中的“//”一样
• 如果你要在你的Makefile中使用“#”字符,可以用反斜杠进行转义,如:“\#”
清空目标文件的规则
• 一般的风格都是: clean: rm edit $(objects)
• 更为稳健的做法是:
.PHONY : clean clean :
-rm edit $(objects)
•.PHONY的意思表示clean是一个“伪目标”
• 在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事
Makefile简单化:另一种风格
• 这种类型简单,但是作为初学者,依赖关系不能够清楚。复杂一点的话,就很难搞明白

Make的工作过程
1、读入Makefile
2、读入被include的其它Makefile
3、初始化文件中的变量
4、推导隐晦规则,并分析所有规则
5、为所有的目标文件创建依赖关系链
6、根据依赖关系,决定哪些目标要重新生成
7、执行生成命令
Makefile的文件名
• make 命令会在当前目录下按顺序找寻文件“GNUmakefile”、“makefile”、“Makefile”
• 可以是其他名称,如:Make.Linux make -f Make.Linux
• 建议使用Makefile或makefile
显示命令
• echo
echo 正在编译XXX模块......,
make将输出:echo 正在编译XXX模块...
• @
@加在命令行前,则此命令不被make显示出来
“正在编译XXX模块......”字串,不输出命令