[Makefile]多目錄Makefile寫法

最近須要寫一個測試程序,這個測試程序須要集成一些功能,寫在同一個文件看上去很很差,多個文件的Makefile又不是很熟,因而分享下面這篇文章shell

先介紹下,調試Makefile時,想知道某個變量的值,怎麼辦,在該變量下方加入:ide

$(shell echo $(VAR) > a.txt)

轉自:http://blog.csdn.net/yuzhihui_no1/article/details/44810357函數

  前面已經分享了單目錄項下多文件的makefile的編寫,如今來看看多目錄下多文件makefile的編寫;工具

        在作項目時,通常文件都會分幾個目錄來存放;基本的是  include/  bin/ src/ obj/ lib/ tools/,這幾個文件;我先說下個人文件存放目錄,用ls -R能夠查看到全部文件:./include/common.h    ./src/main.c    ./src/printStatus.c  就三個文件,其中*.c 文件都依賴於 *.h文件;測試

        一樣的先上初版makefile:ui

[cpp]  view plain  copy
 
  1. CC=gcc  
  2. objects=obj/main.o obj/printStatus.o  
  3.   
  4. bin/main:$(objects)  
  5.    $(CC) -o bin/main $(objects)  
  6.   
  7. obj/main.o:src/main.c include/common.h  
  8.    $(CC) -o obj/main.o -c src/main.c -Iinclude  
  9.   
  10. obj/printStatus.o:src/printStatus.c include/common.h  
  11.    $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude  
  12.   
  13. clean:  
  14.    rm -rf $(objects) bin/main  

        上面的makefile就是gcc命令的拼湊起來的,下面來分享下比較通用的多目錄下的makefile;url

 

        在看多目錄的makefile時,先來理解下幾個函數和變量;spa

函數:.net

        wildcard 這是擴展通配符函數,功能是展開成一列全部符合由其參數描述的文 件名,文件間以空格間隔;好比:羅列出src下的全部.c文件:$(wildcard ${SRC}/*.c)調試

        patsubst 這是匹配替換函數, patsubst ( 須要匹配的文件樣式,匹配替換成什麼文件,須要匹配的源文件)函數。好比:用src下的*.c替換成對應的 *.o文件存放到obj中:$(patsubst  %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))

        notdir 這是去除路徑函數,在上面patsubst函數中已經使用過,去除SOURCE中文件的全部目錄,只留下文件名;

 

變量:

        $@:表示目標文件;通常是在規則中這麼用:gcc  -o $@  $(object);

        $^:表示全部依賴文件;通常是在規則中這麼用:gcc -o $@  $^  ;用全部依賴文件連接成目的文件;

        $<:表示第一個依賴文件;在規則中使用:gcc -o $@ -c $< ;其實這個時候就是每一個依賴文件生成一個目的文件;

 

第二版makefile

 

[cpp]  view plain  copy
 
  1. #把全部的目錄作成變量,方便修改和移植   
  2. BIN = ./bin  
  3.  SRC = ./src  
  4.  INC = ./include  
  5.  OBJ = ./obj  
  6.    
  7. #提早全部源文件(即:*.c文件)和全部中間文件(即:*.o)  
  8.  SOURCE = $(wildcard ${SRC}/*.c)  
  9.  OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))  
  10.    
  11. #設置最後目標文件  
  12.  TARGET = main  
  13.  BIN_TARGET = ${BIN}/${TARGET}  
  14.    
  15.  CC = gcc   
  16.  CFLAGS = -g -Wall -I${INC}   
  17.    
  18. #用全部中間文件生成目的文件,規則中能夠用 $^替換掉 ${OBJECT}  
  19.  ${BIN_TARGET}:${OBJECT}  
  20.      $(CC) -o $@ ${OBJECT}  
  21.    
  22. #生成各個中間文件  
  23.  ${OBJ}/%.o:${SRC}/%.c   
  24.      $(CC) $(CFLAGS) -o $@ -c $<  
  25.    
  26.  .PHONY:clean  
  27.  clean:  
  28.      find $(OBJ) -name *.o -exec rm -rf {} \; #這個是find命令,不懂的能夠查下資料  
  29.      rm -rf $(BIN_TARGET)  

        這個makefile的好處就是通用性,裏面不涉及到具體的文件名,當你往src目錄中添加新文件時,能夠不須要修改makefile,因此這是個很是好的工具;

相關文章
相關標籤/搜索