规则解释如何和何时重做该规则中的文件,make根据依赖关系执行产生或更新目标;规则也说明如何和何时执行动作 。有的规则看起来很复杂,但都符合上述模式 。
1.4make工作原理
缺省make从第一个target开始(第一个非 "." 开始的target),这称作缺省目标 。在上述的makefile中,缺省目标是更新执行程序"edit",将这个目标置于最前面 。当执行make的时候,make程序从当前目录读入makefile开始处理第一个规则;在例子中,这个规则是重新链接"edit";在make处理这个规则之前,必须处理"edit"所依赖的那些文件的规则,例子中是目标文件 。这些文件按照他们自己的规则处理:通过编译源文件来更新每个".o"文件;当依赖关系中的源文件或头文件比目标文件新,或目标文件不存在时,必须重新编译 。
其它的规则被处理是因为他们的target是目标的依赖,和目标没有依赖关系的规则不会被处理,除非指定make处理(如make clean) 。
在重新编译目标文件之前,make会试图更新它的依赖:源文件和头文件 。例子中的makefile对源文件和头文件未指定任何操作:".c"和".h"文件不是任何规则的目标 。确认所有的目标文件都是最新的之后,make决定是否重新链接"edit":如果"edit"不存在,或者任何一个目标文件都比它新,则链接工作将进行 。
这样,如果我们改变insert.c运行make,make会编译这个文件来更新"insert.o",然后链接"edit";如果修改了"command.h"运行make,"kbd.o","command.o","files.o"会重新生成,链接"edit" 。
1.5使用变量
在例子中,在规则"edit"中,目标文件被列出来两次:
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中,可以写这样一行来定义"object"变量:
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
于是在需要目标文件名列表的地方,使用$(object) 来代替变量的值 。以下是使用了变量以后的makefile:
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
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 $(objects)
1.6简化命令
为每个文件写出编译命令不是必要的,因为make可以自己来做;以".c"文件更新".o"文件有一个隐含的规则,使用"cc -c"命令 。Make将利用"cc –c main.c –o main.o"来将main.c编译为main.o,因此在生成目标文件的规则中,可以省略命令 。
当".c"文件以这样的方式使用时,将自动加入到依赖关系中;由是在省略命令的前提下,可以将".c"文件从依赖关系中省略 。以下是简化过的makefile:
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
-rm edit $(objects)
1.7另一种风格
推荐阅读
- 老年人监护人确定是怎样的
- 樱桃果酱的制作方法
- 怎样看地球仪的经纬度数
- 绿色的东西有哪些
- SCO UNIX5的几个主要系统进程
- 晚上脸红是怎么回事
- 怎么有些聊天记录恢复不了的
- 什么动物眼睛是方的
- 8和15的公因数有哪些 8和15的公因数有什么
- 6101的简单评测
