1. 程式人生 > 實用技巧 >Makefile巢狀執行make

Makefile巢狀執行make

Makefile巢狀執行make

一個大的工程檔案中,不同的檔案按照功能被劃分到不同的模組中,也就說很多的原始檔被放置在了不同的目錄下。每個模組可能都會有自己的編譯順序和規則,如果在一個 Makefile 檔案中描述所有模組的編譯規則,就會很亂,執行時也會不方便,所以就需要在不同的模組中分別對它們的規則進行描述,也就是每一個模組都編寫一個 Makefile 檔案,這樣不僅方便管理,而且可以迅速發現模組中的問題。這樣我們只需要控制其他模組中的 Makefile 就可以實現總體的控制,這就是 make 的巢狀執行。

例項:

subsystem:
    cd subdir && $(MAKE)

這個例子可以這樣來理解,在當前目錄下有一個目錄檔案 subdir 和一個 Makefile 檔案,子目錄 subdir 檔案下還有一個 Makefile 檔案,這個檔案是用來描述這個子目錄檔案的編譯規則。使用時只需要在最外層的目錄中執行 make 命令,當命令執行到上述的規則時,程式會進入到子目錄中執行 make。這就是巢狀執行 make,我們把最外層的 Makefile 稱為是總控 Makefile。

上述的規則也可以換成另外一種寫法:

subsystem
    $(MAKE) -C subdir

在 make 的巢狀執行中,我們需要了解一個變數 "CURDIR",此變數代表 make 的工作目錄。當使用 make 的選項 "-C" 的時候,命令就會進入指定的目錄中,然後此變數就會被重新賦值。總之,如果在 Makefile 中沒有對此變數進行顯式的賦值操作,那麼它就表示 make 的工作目錄。我們也可以在 Makefile 中為這個變數賦一個新的值,當然重新賦值後這個變數將不再代表 make 的工作目錄.

export的使用

使用 make 巢狀執行的時候,變數是否傳遞也是我們需要注意的。如果需要變數的傳遞,那麼可以這樣來使用:

export <variable>

如果不需要那麼可以這樣來寫:

unexport <variable>

<variable>是變數的名字,不需要使用 "$" 這個字元。如果所有的變數都需要傳遞,那麼只需要使用 "export" 就可以,不需要新增變數的名字。

Makefile 中還有兩個變數不管是不是使用關鍵字 "export" 宣告,它們總會傳遞到下層的 Makefile 中。這兩個變數分別是 SHELL 和 MAKEFLAGS,特別是 MAKEFLAGS 變數,包含了 make 的引數資訊。如果執行總控 Makefile 時,make 命令帶有引數或者在上層的 Makefile 中定義了這個變數,那麼 MAKEFLAGS 變數的值將會是 make 命令傳遞的引數,並且會傳遞到下層的 Makefile 中,這是一個系統級別的環境變數。

make 命令中有幾個引數選項並不傳遞,它們是:"-C"、"-f"、"-o"、"-h" 和 "-W"。如果我們不想傳遞 MAKEFLAGS 變數的值,在 Makefile 中可以這樣來寫:

subsystem:
    cd subdir && $(MAKE) MAKEFLAGS=