Makefile文件(二)_總述

Makefile總述spa

1、Makefile裏面有什麼

Makefile主要包含了五個東西:顯示規則、隱晦規則、變量定義、文件指示和註釋。操作系統

顯示規則:明顯指出要生成的文件,文件的依賴文件,生成的命令code

隱晦規則:make具備自動推導功能,隱晦規則能夠比較粗糙地簡略書寫Makefileblog

變量定義:如上一篇中的objects變量編譯

文件指示:一個Makefile中引用另外一個Makefile;根據某些狀況指定Makefile中的有效部分;定義一個多行的命定class

註釋:‘#’,文件中使用該符號能夠利用轉義符號‘/#’變量

注:Makefile中的命令,必須以【Tab】鍵開始。object

2、Makefile的文件名

默認狀況下,make命令會在當前目錄下按順序尋找「GNUmakefile」、「makefile」、「Makefile」文件。推薦使用「Makefile」。file

還可以使用別的文件名來書寫Makefile,好比:「Make.Linux」,「Make.Solaris」,「Make.AIX」等。若是要制定特定的Makefile,可使用make的「-f」和「--file」參數,如:make -f Make.Linux或make --file Make.AIX。語法

3、引用其餘的Makefile

在Makefile中使用include關鍵字能夠把別的Makefile包含進來,被包含的文件會原模原樣的放在當前文件的包含位置。

include語法是:

include <filename>    #filename能夠是當前操做系統的Shell的文件模式,能夠包含路徑和通配符

在include前面能夠有一些空字符,可是毫不能是Tab鍵開始。include和<filename>能夠用一個或多個空格隔開。

例子,現有這樣幾個Makefile:a.mk,b.mk,c.mk,還有一個文件foo.make,變量$(bar)=e.mk f.mk,那麼

include  foo.make  *.mk  $(bar)    ====》》》 等價於:include foo.make a.mk b.mk c.mk e.mk f.mk

make命令開始時,會找尋include所指出的其餘Makefile,並把其內容安置在當前的位置。若是文件沒有指定絕對路徑或是相對路徑的話,make會在當前目錄下首先尋找,若是當前目錄下沒有找到,那麼make還會在如下幾個目錄找:

一、若是make執行時,有「-I」或「--include-dir」參數,那麼make就會在這個參數所指定的目錄下尋找

二、若是目錄<prefix>/include(通常是:/usr/local/bin或/usr/include)存在的話,make也會去找

若是文件沒有找到的話,make會生成一條警告信息,但不會立刻出現致命錯誤,他會繼續載入其餘文件,一旦完成makefile的讀取,make會再重試這些沒有找到或是不能讀取的文件,若是仍是不行,make纔會出現一條致命信息。若想make不理會那些沒法讀取的文件繼續執行,可在include前加‘-’。如:-include<filename>。和其餘版本make兼容的相關命令是sinclude,做用同樣。

4、環境變量MAKEFILES

我也沒看懂究竟是個啥,就記住了最好不要用,若是出錯能夠檢查是否用了

若是當前環境中定義了環境變量MAKEFILES,那麼,make會把這個變量中的值作一個相似include的動做。這個變量中的值是其餘的Makefile,用空格分隔。只是他與include不一樣的是,從這個環境變量中引入的Makefile的目標不會起做用,若是環境變量中定義的文件發現錯誤,make也不理會。

建議不要使用環境變量,由於一旦定義,當使用make時,全部的Makefile都會受到影響。

5、make的工做方式

GUN的make工做執行步驟以下:

一、讀入全部的Makefile

二、讀入被include的其餘Makefile

三、初始化文件中的變量

四、推導隱晦規則,分析全部規則

五、爲全部目標文件建立依賴關係鏈

六、根據依賴關係,決定哪些目標要從新生成。

七、執行生成命令。

567解釋了首先生成全部的依賴關係,再執行命令,很好的解釋了哪些須要從新編譯

1-5:第一個階段,6-7:第二個階段。第一階段中,若是定義的變量被使用了,那麼make會把其展開在使用的位置,但make並不會徹底立刻展開,make使用的是拖延戰術。若是變量出如今依賴關係的規則中,那麼僅當這條依賴被決定要使用了,變量纔會在其內部展開。

相關文章
相關標籤/搜索