二、内部规则
迄今为止,我们已经能够在makefile中给出相应的规则来指出具体的处理过程。实际上,除了我们显式给出的规则外,make还具有许多内部规则,这些规则是由预先规定的目标、依赖文件及其命令组成的相关行。在内部规则的帮助下,可以使makefile变得更加简洁,尤其是在具有许多源文件的时候。现在以实例加以说明,首先建立一个名为foo.c的C程序源文件,文件内容如下所示:
#include #include int main() { printf(“Hello World\n”); exit(EXIT_SUCCESS); } |
现在让我们用make命令来编译它:
$ make foo cc foo.c -o foo $ |
您会惊奇地发现,尽管我们没有指定makefile,但是make仍然能知道如何调用编译器,并且调用的是cc而不是gcc编译器。这在Linux上没有问题,因为cc常常会链接到gcc程序。这完全得益于make内建的内部规则,另外这些内部规则通常使用宏,所以只要为这些宏指定新的值,就可以改变内部规则的默认动作,如下所示:
$ rm foo $ make CC=gcc CFLAGS=”-Wall -g” foo |
用make命令加-p选项后,可以打印出系统缺省定义的内部规则。它们包括系统预定义的宏、以及产生某些种类后缀的文件的内部相关行。内部规则涉及的文件种类很多,它不仅包括C源程序文件及其目标文件,还包括SCCS文件、yacc文件和lex文件,甚至还包括Shell文件。
当然,我们更关心的是如何利用内部规则来简化makefile,比如让内部规则来负责生成目标,而只指定依赖关系,这样makefile就简洁多了,如下所示:
main.o: main.c def1.h f1.o: f1.c def1.h def2.h f2.o: f2.c def2.h def3.h |