前言 :
在 [GNU Make] 規則 : 自動產生依存關係 有稍微提到 include 指令, 現在我們會在這裡進行討論, 一個 makefile 可以引入 (include) 其他檔案, 此功能常用來引入 make 標頭檔中所擺放之共同的 make 定義, 或是用來自動產生依存關係的資訊. include 指令用法如下所示 :
你可以為這個指令提供任何數目的檔案, shell 通配符以及 make 變數.
引入檔與依存關係 :
當 make 看到 include 指令時, 會事先對通配符以及變數參照進行展開 動作, 然後試著讀進引入檔. 如果檔案存在整個處理過程就會繼續下去. 然而如果檔案不存在, make 會回報此問題並且繼續讀取其餘的 makefile . 當所有讀取動作皆已完成後, make 會從規則中找出任何可用來更新引入檔的規則. 如果找到一個引入檔遭到規則更新, make 接著會清除它的內部資料庫並且重新讀取整個 makefile . 如果完成讀取, 更新與重新讀取程序之後, 仍有 include 指令因為檔案不存在而執行失敗, 那麼 make 就會顯示錯誤並終止執行.
我們可以在下面的例子中看到此過程. 使用 warning 這個內建函式, 我們可以從 make 印出簡單訊息. 下面就是我們的 makefile 範例 :
* Makefile3-7-2 內容 :
* bar.mk 內容 (bar.mk 是上面 makefile 的引入來源) :
對這個 makefile 執行 make 將會有如下訊息產生 :
找不到引入檔>在 [GNU Make] 規則 : 自動產生依存關係 有稍微提到 include 指令, 現在我們會在這裡進行討論, 一個 makefile 可以引入 (include) 其他檔案, 此功能常用來引入 make 標頭檔中所擺放之共同的 make 定義, 或是用來自動產生依存關係的資訊. include 指令用法如下所示 :
你可以為這個指令提供任何數目的檔案, shell 通配符以及 make 變數.
引入檔與依存關係 :
當 make 看到 include 指令時, 會事先對通配符以及變數參照進行展開 動作, 然後試著讀進引入檔. 如果檔案存在整個處理過程就會繼續下去. 然而如果檔案不存在, make 會回報此問題並且繼續讀取其餘的 makefile . 當所有讀取動作皆已完成後, make 會從規則中找出任何可用來更新引入檔的規則. 如果找到一個引入檔遭到規則更新, make 接著會清除它的內部資料庫並且重新讀取整個 makefile . 如果完成讀取, 更新與重新讀取程序之後, 仍有 include 指令因為檔案不存在而執行失敗, 那麼 make 就會顯示錯誤並終止執行.
我們可以在下面的例子中看到此過程. 使用 warning 這個內建函式, 我們可以從 make 印出簡單訊息. 下面就是我們的 makefile 範例 :
* Makefile3-7-2 內容 :
- include foo.mk
- $(warning Finished include)
- foo.mk: bar.mk
- m4 --define=FILENAME=$@ bar.mk > $@
* bar.mk 內容 (bar.mk 是上面 makefile 的引入來源) :
- # 當我們在讀取時後回報訊息
- $(warning Reading FILENAME)
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 指令前置一個破折號 :
為了與其他版本 make 相容, GNU make 為 -include 提供了 sinclude 這個名稱.
Supplement
* GNU Make Doc - Including Other Makefiles
沒有留言:
張貼留言