最近在理解Makefile自動推導依賴關係時,總感覺理解不動。原因是對Makefile的重建過程不清楚。所以學習一下。
感謝《GNU make中文手冊》。
下面時書中makefile文件重建的原文:
Makefile 可由其它文件生成,例如 RCS 或 SCCS 文件。如果 Makefile 由其它文
件重建,那麼在 make 在開始解析這個 Makefile 時需要重新讀取更新後的 Makefile、
而不是之前的 Makefile。make 的處理過程是這樣的:
make 在讀入所有 makefile 文件之後,首先將所讀取的每個 makefile 作爲一個目
標,尋找更新它們的規則。如果存在一個更新某一個 makefile 文件明確規則或者隱含
規則,就去更新對應的 makefile 文件。完成對所有的 makefile 文件的更新之後,如果
之前所讀取任何一個 makefile 文件被更新,那麼 make 就清除本次執行的狀態重新讀
取一遍所有的 makefile 文件(此過程中,同樣在讀取完成以後也會去試圖更新所有的
已經讀取的 makefile 文件,但是一般這些文件不會再次被重建,因爲它們在時間戳上
已經是最新的)。讀取完成以後再開始解析已經讀取的 makefile 文件並開始執行必要
的動作。
我自己的理解就是,makefile會讀取所有被include的文件,然後爲每一個被include進來的文件找一個生成規則,即使這些文件已經存在了。
如果找到了生成規則,並且這些被include進來的文件比依賴的文件要舊,那麼就會重新重新生成這個被include進來的文件,然後重新讀取整個makefile。
所以,做下面一個小實驗:
實驗器材:
4個文件:a.mk b.mk depend Makefile
其中前三個文件都是空的,並且depend文件要在a.mk b.mk建立之後再建立。也就是讓depend文件比a.mk b.mk新。
Makefile文件內容如下:
a.mk:depend
echo "name=chen" > a.mk
b.mk:depend
echo "city=henan" > b.mk
include a.mk b.mk
.PHONY:show
show:
echo $(city)
echo $(name)
然後,執行make showroot@chen-pc:/home/workspace/Makefile/mf4# make show
echo "city=henan" > b.mk
echo "name=chen" > a.mk
echo henan
henan
echo chen
chen
分析:
此時,打開a.mk和b.mk
a.mk
name=chen
b.mk
city=henan
所以,流程應該時這樣的:
Makefile讀取到include a.mk b.mk的時候,在目錄內都尋這兩個文件,然後,把文件的內容替換在Makefile的include的位置(這裏a.mk b.mk最初是空文件),然後,Makefile把所有文件都include進來之後,爲每個include的文件尋找生成規則,而我們顯式的爲a.mk和b.mk定義了生成規則,並且depend文件比這兩個新。所以,會執行a.mk和b.mk的生成規則。在這個例子中就是把兩個變量以及變量的值寫到a.mk b.mk中。
當所有被include進來的文件都被重新生成之後(當然,如果依賴的文件比較舊,那麼這個被include進來的文件不會重新生成)。make命令清楚本次的讀取狀態,重新讀取這個Makefile,再次讀取到include a.mk b.mk,然後把a.mk b.mk中的內容替換到include的位置,把所有的文件都include進來之後,又爲這些被include進來的文件尋找生成規則(例子中就是爲a.mk b.mk尋找生生成規則),然後再次找到了生成了生成規則。然後他們依賴的depend文件比較舊(因爲第一次讀取makefile的時候,對a.mk b.mk進行了寫操作),所以 a.mk b.mk不會重新生成。由於這次所有被include進來的文件都沒有重新生成,所以,make完成了對makefile的解析。
然後,執行make show,打印除了變量的值。
才接觸makefile,如果有寫錯的地方,懇請路過的大神指教。