第10課 - 變量與函數的綜合示例
阿新 • • 發佈:2017-05-21
文件夾 mes fix mage 自動 wid bsp == list )
第10課 - 變量與函數的綜合示例
1. 實戰需求
(1)自動生成 target 文件夾存放可執行文件
(2)自動生成 objs 文件夾存放編譯生成的目標文件(*.o)
(3)支持調試版本的編譯選項
(4)考慮代碼的擴展性 ——> 使用變量
2. 工具原料
— $(wildcard _pattern)
-
- 獲取當前工作目錄中滿足_pattern的文件或目錄列表
— $(addprefix _prefix, _names)
-
- 給名字列表_names中的每一個名字增加前綴_prefix
3. 關鍵技巧
— 自動獲取當前目錄下的源文件列表(函數調用
-
- SRCS := $(wildcard *.c)
— 根據源文件列表生成目標文件列表(變量的值替換)
-
- OBJS := $(SRCS:.c=.o)
— 對每一個目標文件列表加上路徑前綴(函數調用)
-
- OBJS := $(addprefix path/, $(OBJS))
4. 規則中的模式替換(目錄結構)
— $(OBJS) : %.o : %.c 形式的模式替換對象是$(OBJS)對應的目標列表
— %.o : %.c 形式的模式替換對象是當前工作目錄
5. 編譯規則的依賴
首先創建 objs 和 target 文件夾分別用來存放 .o 中間文件和可執行程序,然後創建 .o 中間文件和可執行程序,需要在前面添加前綴(放入前面創建的目錄中)。
根據$(DIRS) 、 $(OBJS)兩個依賴創建文件夾和相應的 .o 文件。後面再由模式匹配生成 .o 文件。
(自上而下的一種委派)
1 # 考慮代碼的擴展性 2 CC := gcc 3 MKDIR := mkdir 4 RM := rm -rf 5 6 # 存放可執行程序和中間文件的文件夾 7 DIR_OBJS := objs 8 DIR_TARGET := target 9 10 DIRS := $(DIR_OBJS) $(DIR_TARGET) 11 12 # 可執行程序 13 TARGET := $(DIR_TARGET)/hello-makefile14 15 # .o中間文件 16 SRCS := $(wildcard *.c) 17 OBJS := $(SRCS:.c=.o) 18 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)) 19 20 .PHONY : rebuild clean all 21 22 $(TARGET) : $(DIRS) $(OBJS) 23 $(CC) -o $@ $(OBJS) 24 @echo "Target File ==> $@" 25 26 $(DIRS) : 27 $(MKDIR) $@ 28 29 # 增加debug選項-g 30 $(DIR_OBJS)/%.o : %.c 31 ifeq ($(DEBUG),true) 32 $(CC) -o $@ -c -g $^ 33 else 34 $(CC) -c -o $@ $^ 35 endif 36 37 rebuild : clean all 38 39 all : $(TARGET) 40 41 clean : 42 $(RM) $(DIRS) 43
6. 小結
— 目錄可以成為目標的依賴,在規則中創建目錄
— 預定義函數是makefile實戰時不可或缺的部分
— 規則中的模式匹配可以直接針對目錄中的文件
— 可以使用命令行變量編譯特殊的目標版本
註:本文整理於《狄泰12月提升計劃》課程內容
第10課 - 變量與函數的綜合示例