簡單的實例,多層嵌套Makefile(一)

參考了網上的博客,自己整理了一份並且可以編譯通過,也能夠正常執行,所以就做了記錄。


防止過段時間就又忘記了。


首先先上個還沒執行make前的源碼樹:



源文件都是一個printf 沒什麼好講的,主要是makefile。


首先是頂層Makefile的內容;


第1行:設置編譯器

第2行:設置所有會生成的目標文件,爲了最後一步連接成可執行文件。
第3行:設置頂層Makefile坐在的目錄

第4行:設置目標文件存放的目錄,待會第二行的那些目標文件,都會保存在這個目錄下面

第5行:設置可執行文件存放的目錄

第6行:設置可執行文件的名字

第7行:保存所有子目錄下的Makefile的路徑。只要子目錄有makefile存在就在這個地方添加上這個makefile相對頂層Makefile的路徑。

第11行:講1~6行的變量設置成全局變量,在子目錄的makefile裏面可以直接使用這些變量。

第13行:神奇的all標號。

有網友比較官方的解釋:一種簡寫,可以讓多個目標操作順次執行

有網友比較接地氣的解釋(根據本篇makefile做了修改):

直接 make 或 make all 的話會執行CHECKDIR 和 $(SUB_DIR) 的編譯命令
後面不加參數的話,會把第一個目標作爲默認的
make CHECKDIR 的話只執行第16行內容
make $(SUB_DIR)的話只編譯17~21行內容

 現在我們只是直接make,所以會先執行CHECKDIR然後再執行$(SUB_DIR)部分:


CHECKDIR:創建一大堆目錄,目錄存在就不創建了。


關鍵點在$(SUB_DIR):遍歷make所有目錄下面的makefile。

首先查找依賴部分“ECHO”,就是一些打印信息,echo前面的‘@’符號不加也是可以的。

接着就是執行:make -C  $(SUB_DIR) (-C是大寫的C,小寫的c編譯出目標文件

-C 參數的含義: -C DIRECTORY, --directory=DIRECTORY  Change to DIRECTORY before doing anything.

翻譯過來就是:在離開這個目錄前做點什麼。

真特麼的奇葩。 直接講執行該目錄下的makefile不就好了。

所以加上-C 選項意思就是:在$(SUB_DIR) 目錄下面執行make

make -C  $(SUB_DIR) 展開就是:make -C main/  src/ src/eat/ obj/ :按順序對各個目錄下面的makefile,make一下。


第23行:執行make clean 就會執行clean部分。


src目錄下面的makefile:


稍微解釋下:

OBJ_DIR : 在頂層makefile中定義了,變量值爲保存目標文件的目錄。

     CC       :編譯器,在頂層makefile中定義。

生成的目標文件的路徑/目標文件xxx.o:生成目標文件的依賴文件(xxx.c)

(編譯器) -c (依賴文件xxx.c) -o (生成的目標文件路徑/目標文件xxx.o)


src/eat/目錄下面的makefile:

不解釋了。


obj目錄下面的makefile:

鏈接成可執行文件文件名爲$(BIN),最終可執行文件保存在$(BIN_DIR)目錄下.


在頂層makefile那裏執行make,看執行後的源碼樹:


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