《让makefile变得简单》系列--第二章--让我们来写一个makefile

一个完整的makefile包含了什么

  1. 显示规则
  2. 隐式规则
  3. 变量
  4. 指令或者命令
  5. 注释

分行

这里描述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设置给它。该方法不推荐。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章