嵌套執行make
在一些大的工程中,我們會把我們不同模組或是不同功能的源檔案放在不同的目錄中,我們可以在每個目錄中都書寫一個該目錄的Makefile,這有利於讓我們的Makefile變得更加地簡潔,而不至於把所有的東西全部寫在一個Makefile中,這樣會很難維護我們的Makefile,這個技術對於我們模組編譯和分段編譯有著非常大的好處。
例如,我們有一個子目錄叫subdir,這個目錄下有個Makefile檔案,來指明了這個目錄下檔案的編譯規則。那麼我們總控的Makefile可以這樣書寫:
subsystem:
cd subdir && $(MAKE)
其等價於:
subsystem:
$(MAKE) -C subdir
定義$(MAKE)宏變數的意思是,也許我們的make需要一些參數,所以定義成一個變數比較利於維護。這兩個例子的意思都是先進入“subdir”目錄,然後執行make命令。
我們把這個Makefile叫做“總控Makefile”,總控Makefile的變數可以傳遞到下級的Makefile中(如果你顯示的聲明),但是不會覆蓋下層的Makefile中所定義的變數,除非指定了“-e”參數。
如果你要傳遞變數到下級Makefile中,那麼你可以使用這樣的聲明:
export <variable ...>;
如果你不想讓某些變數傳遞到下級Makefile中,那麼你可以這樣聲明:
unexport <variable ...>;
如:
樣本一:
export variable = value
其等價於:
variable = value
export variable
其等價於:
export variable := value
其等價於:
variable := value
export variable
樣本二:
export variable += value
其等價於:
variable += value
export variable
如果你要傳遞所有的變數,那麼,只要一個export就行了。後面什麼也不用跟,表示傳遞所有的變數。
需要注意的是,有兩個變數,一個是SHELL,一個是MAKEFLAGS,這兩個變數不管你是否export,其總是要傳遞到下層 Makefile中,特別是MAKEFILES變數,其中包含了make的參數資訊,如果我們執行“總控Makefile”時有make參數或是在上層 Makefile中定義了這個變數,那麼MAKEFILES變數將會是這些參數,並會傳遞到下層Makefile中,這是一個系統級的環境變數。
但是make命令中的有幾個參數並不往下傳遞,它們是“-C”,“-f”,“-h”“-o”和“-W”(有關Makefile參數的細節將在後面說明),如果你不想往下層傳遞參數,那麼,你可以這樣來:
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
如果你定義了環境變數MAKEFLAGS,那麼你得確信其中的選項是大家都會用到的,如果其中有“-t”,“-n”,和“-q”參數,那麼將會有讓你意想不到的結果,或許會讓你異常地恐慌。
還有一個在“嵌套執行”中比較有用的參數,“-w”或是“--print-directory”會在make的過程中輸出一些資訊,讓你看到目前的工作目錄。比如,如果我們的下級make目錄是“/home/hchen/gnu/make”,如果我們使用“make -w”來執行,那麼當進入該目錄時,我們會看到:
make: Entering directory `/home/hchen/gnu/make'.
而在完成下層make後離開目錄時,我們會看到:
make: Leaving directory `/home/hchen/gnu/make'
當你使用“-C”參數來指定make下層Makefile時,“-w”會被自動開啟的。如果參數中有“-s”(“--slient”)或是“--no-print-directory”,那麼,“-w”總是失效的。
原文
http://wiki.ubuntu.org.cn/index.php?title=%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:%E4%B9%A6%E5%86%99%E5%91%BD%E4%BB%A4&variant=zh-hant