例二的执行可以采用如下的形式:
$ make clean
rm main.o right.o left.o
这时将直接执行命令 rm main.o right.o left.o。
2.6.2.3 make 工作原理示例
根据文件的依赖关系,可以建立一个 Makefile 来描述 try 的所有依赖关系,内容为:
例三:
try: left.o right.o main.o
<TAB> cc -o try left.o right.o main.o
main.o: main.c
<TAB> cc -c main.c
left.o: left.c
<TAB> cc -c left.c
right.o: right.c
<TAB> cc -c right.c
left.c: left_top left_btm;cat left_top left_btm >left.c
right.c: right_top right_btm
<TAB> cat right_top right_btm >right.c
clean:
<TAB> rm main.o left.o right.o left.c right.c
(1) 如果建立描述文件 Makefile 后第一次执行,即:
$ make
“make”将依次显示运行的命令如下:
cat left_top left_btm >left.c
cc -c left.c
cc -c main.c
cat right_top right_btm >right.c
cc -c right.c
cc -o try left.o main.o right.o
“make”将首先解析“终极目标”(try)所在的规则(例三中的第一个规则),根据其依赖文件
(left.o right.o main.o)依次(按照依赖文件列表从左到右的顺序)寻找创建这些依赖文件的规
则。首先为第一个依赖文件(left.o)寻找创建规则,如果第一个依赖文件依赖于其它文件
(left.c),则同样为这个依赖文件(left.c)寻找创建规则(left.c:left_top left_btm;cat left_top
left_btm >left.c)。之后 make 从最后一个规则(例三中目标为 left.c 的规则)回退开始执行,
最终完成终极目标的第一个依赖文件 left.o 的创建和更新。之后对第二个、第三个、第四个
……“终极目标”的依赖文件执行同样的过程(例三的的顺序是“right.o”、“ main.o”)。创建或
者更新每一个规则依赖文件的过程都是这样的一个过程,即按照依赖文件列表顺序,使用
同样方式(按照同样的过程)去重建每一个依赖文件,在完成对所有依赖文件的重建之后,
最后一步才是重建此规则的目标。从上文给出的显示结果可以清晰地看出“make”的这一执
行过程。
此后如果不修改任何文件而直接执行 make,将显示:
$ make
make: ‘try’ is up to date
伪目标“clean”没有出现在其它任何规则的依赖列表中,它不是一个文件。在 shell 环境
下运行 make clean:
$ make clean
rm main.o left.o right.o left.c right.c
(2) 如果修改了某个源文件,例如 right_top,然后再执行 make 命令,make 就会循着依赖
关系,发现 right_top 是 right.c 的依赖文件,根据递推原则,需要执行三条命令。执行
make 将依次显示运行的命令:
$ make
cat right_top right_btm >right.c 生成 right.c