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)
于是如果有新的 .o 文件加入,我们只需简单地修改一下 objects 变量就可以了。
关于变量更多的话题,我会在后续给你一一道来。
五、让 make 自动推导
GNU 的 make 很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们
就没必要去在每一个 [.o] 文件后都写上类似的命令,因为,我们的 make 会自动识别,
并自己推导命令。
只要 make 看到一个 [.o] 文件,它就会自动的把 [.c] 文件加在依赖关系中,如果 make 找
到一个 whatever.o ,那么 whatever.c ,就会是 whatever.o 的依赖文件。并且 cc -c
whatever.c 也会被推导出来,于是,我们的 makefile 再也不用写得这么复杂。我们的是
新的 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)
这种方法,也就是 make 的 “ 隐晦规则 ” 。上面文件内容中, “ .PHONY ” 表示, clean 是
个伪目标文件。
关于更为详细的 “ 隐晦规则 ” 和 “ 伪目标文件 ” ,我会在后续给你一一道来。
六、另类风格的 makefile
即然我们的 make 可以自动推导命令,那么我看到那堆 [.o] 和 [.h] 的依赖就有点不爽,那
么多的重复的 [.h] ,能不能把其收拢起来,好吧,没有问题,这个对于 make 来说很容
易,谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的 makefile 吧。