程式扎記: [GNU Make] 變數與巨集 : include 指令 - 引入共同 make 定義

標籤

2010年11月9日 星期二

[GNU Make] 變數與巨集 : include 指令 - 引入共同 make 定義

前言 :
在 [GNU Make] 規則 : 自動產生依存關係 有稍微提到 include 指令, 現在我們會在這裡進行討論, 一個 makefile 可以引入 (include) 其他檔案, 此功能常用來引入 make 標頭檔中所擺放之共同的 make 定義, 或是用來自動產生依存關係的資訊. include 指令用法如下所示 :
include definitions.mk

你可以為這個指令提供任何數目的檔案, shell 通配符以及 make 變數.

引入檔與依存關係 :
當 make 看到 include 指令時, 會事先對通配符以及變數參照進行展開 動作, 然後試著讀進引入檔. 如果檔案存在整個處理過程就會繼續下去. 然而如果檔案不存在, make 會回報此問題並且繼續讀取其餘的 makefile . 當所有讀取動作皆已完成後, make 會從規則中找出任何可用來更新引入檔的規則. 如果找到一個引入檔遭到規則更新, make 接著會清除它的內部資料庫並且重新讀取整個 makefile . 如果完成讀取, 更新與重新讀取程序之後, 仍有 include 指令因為檔案不存在而執行失敗, 那麼 make 就會顯示錯誤並終止執行.

我們可以在下面的例子中看到此過程. 使用 warning 這個內建函式, 我們可以從 make 印出簡單訊息. 下面就是我們的 makefile 範例 :
* Makefile3-7-2 內容 :
  1. include foo.mk  
  2. $(warning Finished include)  
  3.   
  4. foo.mk: bar.mk  
  5.         m4 --define=FILENAME=$@ bar.mk > $@  

* bar.mk 內容 (bar.mk 是上面 makefile 的引入來源) :
  1. # 當我們在讀取時後回報訊息  
  2. $(warning Reading FILENAME)  
對這個 makefile 執行 make 將會有如下訊息產生 :
linux-tl0r:~/gccprac # make -f Makefile3-7-2
Makefile3-7-2:1: foo.mk: No such file or directory makefile
 找不到引入檔>
Makefile3-7-2:2: Finished include <第一次讀取 makefile 列印的訊息>
m4 --define=FILENAME=foo.mk bar.mk > foo.mk <找到引入檔的更新規則, 並執行對應指令稿>
foo.mk:1: Reading foo.mk <讀取引入檔時列印的訊息>
Makefile3-7-2:2: Finished include <第二次讀取 makefile 列印的訊息>
make: `foo.mk' is up to date.
第一列顯示 make 並未找到引入檔, 不過第二列顯示 make 會繼續讀取以及執行 makefile. 完成讀取動作後, make 找到一個用來建立引入檔 (foo.mk) 規則, 所以它就會執行此規則, 然後 make 會重新啟動整個過程, 這次讀取引入檔不會遇到任何問題.

由上面動作可以知道 make 也可以把 makefile 本身當成一個可能的工作目標. 當 make 讀進了整個 makefile 後, make 會試著尋找可以用來重建當前所執行之 makefile 的規則, 如果找到, make 將會處理此規則然後檢查 makefile 是否已經完成更新. 如果已經完成更新, make 將會清除它的內部狀態, 並重新讀取 makefile, 重新完成整個分析動作.

搜尋引入檔 :
make 會到何處找尋引入檔? 顯然如果 include 的引數是一個絕對路徑檔案參照, make 會直接讀進該檔案 ; 如果這是一個相對檔案參照, make 會先在當前工作目錄尋找該檔案. 如果 make 還是無法找到該檔案, 他接著會到你在命令列以 --include-dir ( -I ) 選項所指定目錄繼續尋找. 如果還是找不到, make 會到自己被編譯時所使用的搜尋路徑尋找, 比如/usr/local/include , /usr/gnu/include/usr/include 等.

如果 make 最後沒有找到引入檔, 而且沒有用來建立該引入檔的規則, make 將會回報錯誤並結束執行. 如果想讓 make 忽略無法找到引入檔, 可以為 include 指令前置一個破折號 :
-include i-may-not-exist.mk

為了與其他版本 make 相容, GNU make 為 -include 提供了 sinclude 這個名稱.

Supplement
GNU Make Doc - Including Other Makefiles
The include directive tells make to suspend reading the current makefile and read one or more other makefiles before continuing. The directive is a line in the makefile that looks like this:
  1. include filenames…  


沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!