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 所支持的方式)   。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章