Makefile文件的重建過程

最近在理解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 show
root@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,如果有寫錯的地方,懇請路過的大神指教。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章