Makefile 之 include

  本节我们讨论如何在一个 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 所支
持的方式)  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值