前 言
本篇旨在介紹GNU Makefile的基本概念。雖是基礎,個人認爲,也是GNU Makefile的核心內容,理
解掌握這些核心,GNU Makefile也應在指掌之間了。
make是怎樣處理Makefile文件的?
先描述一下下面幾條include指令的處理過程。
include filenames -include filenames sinclude filenames
對於這幾條指令的語法不做詳細描述,只描述一下它們的處理過程以及彼此之間的區別。
當make遇到以上指令時,會暫停對當前makefile的讀取,依次讀取filenames指定的文件列表。如果在依
次讀取filenames文件列表中文件時,某個文件不能找到,make會給出一個警告信息,然後繼續讀取剩下
的文件,讀取完後會回到include指令之後位置,繼續讀取被暫停的makefile。當所有的內容都被讀後,
make會試圖根據所有讀取到make規則來創建在include時缺失的文件,如果不能找到創建規則,make將報
錯。
include和-include的區別在於,在被包含的文件缺失且沒有對應的創建規則時,include會報錯,
而-include不會報錯。sinclude可簡單認爲等同於-include。
接下來,描述make對makefile的讀取過程。
makefile的讀取分爲2個階段。
階段1:
. 讀取所有的makefile,以及包含的makfile;
. 將讀取的所有變量及其值,所有隱式、顯式規則內置;
. 建立所有目標和先決條件的依賴樹。
階段2:
. 決定要建立的目標並執行所需的規則創建目標。
makefile包含變量、規則、註釋等。
理解變量,規則中變量的展開的時機(在階段1,還是階段2展開),對於正確理解makefile,編寫
makefile非常重要。
下面標記爲immediate的爲階段1展開,標記爲deferred的爲第2階段展開。
變量的展開時機:
immediate = deferred immediate ?= deferred immediate := immediate immediate ::= immediate immediate += deferred or immediate immediate != immediate define immediate deferred endef define immediate = deferred endef define immediate ?= deferred endef define immediate := immediate endef define immediate ::= immediate endef define immediate += deferred or immediate endef define immediate != immediate endef
規則各部分展開時機
immediate : immediate ; deferred deferred