一个完整的makefile包含了什么
- 显示规则
- 隐式规则
- 变量
- 指令或者命令
- 注释
分行
这里描述2个概念:逻辑行、物理行
逻辑行:比如你在编程时,一行赋值语句,一行if判断语句都是逻辑行,它可以很长,占用多个物理行,也可以很短,不足一个物理行。
物理行:编辑器上你看到的一行就是物理行。
在makefile文件的语法规则中,如果逻辑行过长,影响阅读。可以使用‘\’分行,把一个逻辑行拆成多个物理行,比如第一章那个简单的makefile例子中有如下
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
makefile文件的命名规则
默认地,make程序会在执行命令的当前路径下尝试搜索GNUmakefile、makefile和Makefile。如果你是一个不喜欢被定制的人,那么可以随便命名自己的makefile。但是,如果你自定义了makefile文件的名称,那么在使用make命令时,需要指定你的makefile文件名,语法如下:
$make -f yourMakefile
or
$make --file yourmakefile
or
$make --file=yourmakefile
包含其他的makefile
以本人经历过的一个项目为例。该项目大约有300+个源文件,归类为8个不同的模块,模块之间的直接调用非常地少。所以,每个模块独立成一个文件夹,里面放着属于该模块地源文件。每个模块地编译条件不是完全一样地,所以每个模块都有自己的makefile,所以这些makefile包含在的main文件下的makefile。
语法一:
include filenames ...
所以你有2种方式写包含makefile
include mkf1 mkf2 ...
or
include mkf1
include mkf2
如果你的makefile文件数比较少且不会增删,用变量替换罗列的makefile会比较方便。如果遇到makefile文件很多,还时不时地增删,那么使用通配符也是很方便的。
bar = a.mk b.mk c.mk
include $(bar)
or
include *.mk
语法一中,如果包含的makefile不存在,报告警告,如果因为包含的文件出现了错误,会影响makefile的编译。所以还存在一种忽略经过和错误的include语法
语法二
-include a.mk b.mk c.mk
语法一和二的差别仅仅在警告和错误的处理方式不一样。语法二忽略警告和错误,不影响编译。
环境变量MAKEFILES
makefile的命名规则已经讲过,要么使用默认的名称,要么在使用make时为它指定文件。但是还有一种方法,那就是设定环境变量MAKEFILES,把需要编译的makefile设置给它。该方法不推荐。