參考了網上的博客,自己整理了一份並且可以編譯通過,也能夠正常執行,所以就做了記錄。
防止過段時間就又忘記了。
首先先上個還沒執行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,看執行後的源碼樹: