本节我们讨论如何在一个 Makefile 中包含其它的 makefile 文件。Makefile 中包含其它文件
的关键字是“include”,和 C 语言对头文件的包含方式一致。
“include”指示符告诉 make 暂停读取当前的 Makefile,而转去读取“include”指定的一
个或者多个文件,完成以后再继续当前 Makefile 的读取。Makefile 中指示符“include”书写在
独立的一行,其形式如下:
include FILENAMES...
FILENAMES 是 shell 所支持的文件名(可以使用通配符)。
指示符“include”所在的行可以一个或者多个空格(make程序在处理时将忽略这些空格)开
始,切忌不能以 [Tab] 字符开始(如果一行以 [Tab] 字符开始 make 程序将此行作为一个命令行来处
理)。指示符“include”和文件名之间、多个文件之间使用空格或者 [Tab] 键隔开。行尾的空白字
符在处理时被忽略。使用指示符包含进来的 Makefile 中,如果存在变量或者函数的引用。它们将会
在包含它们的 Makefile 中被展开(详细可参考第五章 Makefile 中的变量)。
来看一个例子,存在三个.mk 文件,
“$(bar)”被扩展为“bish bash”
。则
include foo *.mk $(bar)
等价于
include foo a.mk b.mk c.mk bish bash
make 程序在处理指示符 include 时,将暂停对当前使用指示符“include”的 makefile 文件
的读取,而转去依此读取由“include”指示符指定的文件列表。直到完成所有这些文件以后再回
过头继续读取指示符“include”所在的 makefile 文件。
通常指示符“include”用在以下场合:
1. 有多个不同的程序,由不同目录下的几个独立的Makefile来描述其创建或者更新规则。它
们需要使用一组通用的变量定义(可参考 5.5 如何设置变量 一节)或者模式规则(可参
考 9.5 模式规则一节) 。通用的做法是将这些共同使用的变量或者模式规则定义在一个文
件中(没有具体的文件命名限制) ,在需要使用的Makefile中使用指示符“include”来包
含此文件。
2. 当根据源文件自动产生依赖文件时;我们可以将自动产生的依赖关系保存在另外一个文件
中,主Makefile使用指示符“include”包含这些文件。这样的做法比直接在主Makefile
中追加依赖文件的方法要明智的多。其它版本的make已经使用这种方式来处理。 (参考
3.14 自动产生依赖 一节)
如果指示符“include”指定的文件不是以斜线开始(绝对路径,如/usr/src/Makefile...) ,
而且当前目录下也不存在此文件;make将根据文件名试图在以下几个目录下查找:首先,查找使
(参考 8.7make的命令行选项 一节)指定的目录,如
用命令行选项“-I”或者“--include-dir”
果找到指定的文件,则使用这个文件;否则依此搜索以下几个目录(如果其存在) :
“/usr/gnu/include”“/usr/local/include”和“/usr/include”
、 。 当在这些目录下都没有找到“include”指定的文件时,make将会提示一个包含文件未找到的
告警提示, 但是不会立刻退出。 而是继续处理Makefile的内容。 当完成读取所有的makefile文件后,
make将试图使用规则来创建通过指示符“include”指定的但未找到的文件(参考 2.7 makefile
文件的重建一节) ,当不能创建它时(没有创建这个文件的规则) ,make将提示致命错误并退出。
会输出类似如下错误提示:
Makefile:错误的行数:未找到文件名:提示信息(No such file or directory)
Make: *** No rule to make target ‘<filename>’. Stop
我们可使用“-include”来代替“include” ,忽略由于包含文件不存在或者无法创建时的错误
“-”的意思是告诉 make,忽略此操作的错误。make 继续执行)
提示( 。像下边那样:
-include FILENAMES...
使用这种方式时,当所要包含的文件不存在时不会有错误提示、make 也不会退出;除此之外,
和第一种方式效果相同。以下是这两种方式的比较:
使用“include FILENAMES...” ,make 程序处理时,如果“FILENAMES”列表中的任何一
个文件不能正常读取而且不存在一个创建此文件的规则时 make 程序将会提示错误并退出。
使用“-include FILENAMES...”的情况是,当所包含的文件不存在或者不存在一个规则去创
建它,make 程序会继续执行,只有在因为 makefile 的目标的规则不存在时,才会提示致命错误
并退出。
为了和其它的 make 程序进行兼容。也可以使用“sinclude”来代替“-include” (GNU 所支
持的方式) 。
的关键字是“include”,和 C 语言对头文件的包含方式一致。
个或者多个文件,完成以后再继续当前 Makefile 的读取。Makefile 中指示符“include”书写在
独立的一行,其形式如下:
始,切忌不能以 [Tab] 字符开始(如果一行以 [Tab] 字符开始 make 程序将此行作为一个命令行来处
理)。指示符“include”和文件名之间、多个文件之间使用空格或者 [Tab] 键隔开。行尾的空白字
符在处理时被忽略。使用指示符包含进来的 Makefile 中,如果存在变量或者函数的引用。它们将会
在包含它们的 Makefile 中被展开(详细可参考第五章 Makefile 中的变量)。
的读取,而转去依此读取由“include”指示符指定的文件列表。直到完成所有这些文件以后再回
过头继续读取指示符“include”所在的 makefile 文件。
而且当前目录下也不存在此文件;make将根据文件名试图在以下几个目录下查找:首先,查找使
用命令行选项“-I”或者“--include-dir”
果找到指定的文件,则使用这个文件;否则依此搜索以下几个目录(如果其存在)
“/usr/gnu/include”“/usr/local/include”和“/usr/include”
告警提示,
make将试图使用规则来创建通过指示符“include”指定的但未找到的文件(参考 2.7 makefile
文件的重建一节)
会输出类似如下错误提示:
提示(
和第一种方式效果相同。以下是这两种方式的比较:
个文件不能正常读取而且不存在一个创建此文件的规则时 make 程序将会提示错误并退出。
建它,make 程序会继续执行,只有在因为 makefile 的目标的规则不存在时,才会提示致命错误
并退出。
持的方式)