Makefile中include、-include、sinclude

   本节我们讨论如何在一个 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来描述其创建或者更新规则。它们需要使用一组通用的变量定义或者模式规则 。通用的做法是将这些共同使用的变量或者模式规则定义在一个文件中(没有具体的文件命名限制) ,在需要使用的Makefile中使用指示符“include”来包含此文件。
  2.  当根据源文件自动产生依赖文件时;我们可以将自动产生的依赖关系保存在另外一个文件中,主Makefile使用指示符“include”包含这些文件。这样的做法比直接在主Makefile中追加依赖文件的方法要明智的多。其它版本的make已经使用这种方式来处理。
   如果指示符“include”指定的文件不是以斜线开始(绝对路径,如/usr/src/Makefile...) ,而且当前目录下也不存在此文件;make将根据文件名试图在以下几个目录下查找:首先,查找使用命令行选项“-I”或者“--include-dir”指定的目录,如果找到指定的文件,则使用这个文件;否则依此搜索以下几个目录(如果其存在) “/usr/gnu/include”“/usr/local/include”和“/usr/include”。 当在这些目录下都没有找到“include”指定的文件时,make将会提示一个包含文件未找到的告警提示,   但是不会立刻退出。而是继续处理Makefile的内容。 当完成读取所有的makefile文件后,make将试图使用规则来创建通过指示符“include”指定的但未找到的文件,当不能创建它时(没有创建这个文件的规则),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 所支持的方式)   。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章