版权申明:本文为水煮鱼为 水煮鱼@博客园 撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。
编写Make的规则:
通过上节的介绍,知道了怎么去生成一个makefile文件。当文件较少的时候,采用上述的方法是可行的。但是随着文件数目的增加,已经各个文件相互依赖关系变复杂以后,以上生成makefile的方式已经不再具有可行性了。
幸好很多编译器都具有自动生成makefile的功能。以gcc为例:打开-m开关,则gcc可以将你输入的C文件,根据其中包含的头文件自动生成依赖文件。注意,如果采用-mm的方式,采用“<”,“>”方式包含的头文件将不生成依赖文件。
通过gcc生成的makefile,不会包含命令部分,该部分你可以自己补充,或者直接使用它的隐藏规则。
为了便于编写makefile文件,下面将具体介绍生成的makefile文件中的一些基本概念:
1、makefile变量
makefile变量类似于环境变量,起对大小写敏感,一般使用大写字母表示,它可以在任何地方引用,主要具有如下的功能:
a. 用于存储文件列表名。
生成可执行文件的makefile,需要指定一些目标文件作为依赖文件;或者在命令行部分,需要会执行那些文件作为gcc命令的输入文件,通过变量的方式来存储这些文件名,更便于makefile的维护;
b.用于存储可执行文件名。
如果你使用的是一个非gcc的编译器,则可能你需要修改所有命令行的使用的gcc的编译名部分,你可以定义一个变量保存编译器名称,则当编译器不同时,简单的修改该变量名称从而实现对不同编译器的命令的整体替代修改。
c.存储编译器的旗标。
如果你某些编译命令的选项使用的地方很多,你可以将该部分相同的选项部分定义为一变量,便于对编译命令的维护。
其实从上可以看出,这里makefile中变量的功用和一般的代码文件中的变量的功用是一致的。
变量的设定:变量名 = 变量的值
变量的引用:$(变量名)
使用上述规则将前面提到的一个makefile重新整理:
====make file 开始====
OBJS = foo.o bar.o
CC = gcc
CFLAGS = -Wall -O -g
myprog:$(OBJS)
$(CC) $(OBJS) -o myprog
foo.o: foo.c foo.h bar.h
$(CC) $(CFLAGS) -c foo.c -o foo.o
bar.o: bar.c bar.h
$(CC) $(CFLAGS) -c bar.c -o bar.o
====make file 结束====
此外还有一些已经定义好的内部变量可以直接引用,常用的有如下几个:
i. @: 当前规则的目的文件名;
ii. <:依赖文件列表中的第一个依赖文件名;
iii. ^: 依赖文件列表中的所有依赖文件名(已经去除了重复的文件名称);
注意:内部变量的引用不需要加括号;
利用上述的内部文件名,上面的makefile可以重新改写为:
====make file 开始====
OBJS = foo.o bar.o
CC = gcc
CFLAGS = -Wall -O -g
myprog:$(OBJS)
$(CC) $^ -o $@
foo.o: foo.c foo.h bar.h
$(CC) $(CFLAGS) -c $< -o $@
bar.o: bar.c bar.h
$(CC) $(CFLAGS) -c $< -o $@
====make file 结束====
正如代码中常常使用的变量一样,makefile中变量的使用也非常灵活!