1. 程式人生 > >linux開發工具之Makefile(下)

linux開發工具之Makefile(下)

int src pattern 可執行 nts spa roots 可執行文件 ats

make 常用內嵌函數以及多級目錄Makefile

一、函數調用 $(function arguments),利用$號引用函數,下面是Makefile中常用三個函數:

1、$(wildcard PATTERN):wildcard函數

當前目錄下匹配模式的文件,例如 src=$(wildcard *.c),匹配所有的.c文件,生成的src就是所有的.c文件。

3、$(patsubst PATTERN , REPLACEMENT , TEXT) : patsubst是一個模式替換函數

例如$(patsubst %.c ,%.o,$src) 等價於 $(src:.c=.o) ,將src中所有.c文件替換為.o文件

4、shell函數

執行shell命令,例如$(shell ls -d */) :將當前文件夾下面的所有文件夾列出來。

二、二級目錄Makefile

CC        =gcc
CFLAGS    =-Wall -g
BIN       =main
SUBDIR    =$(shell ls -d */)               #當前目錄下的所有文件夾
ROOTSRC   =$(wildcard *.c)          #查找當前目錄下所有.c文件
ROOTOBJ   =$(ROOTSRC:%.c=%.o)        #將.c文件名替換成.o文件名
SUBSRC    
=$(shell find $(SUBDIR) -name *.c) SUBOBJ =$(SUBSRC:%.c=%.o) $(BIN):$(ROOTOBJ) $(SUBOBJ)                  #第一個目標是總的目標 $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ) .c.o: $(CC) $(CFLAGS) -c $< -o [email protected] clean: rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

三、將每個目錄下的文件都生成一個可執行文件(多級目錄Makefile):

這個Makefile是遞歸執行,假設有一個目錄,包含一個Makefile文件和兩個目錄test1 test2。其中test1目錄下包含:test1.c 、Makefile 。test2目錄下包含test2.cpp、Makefile。

首先看一下主目錄下的Makefile:

SUBDIRS    =test1  test2
.PHONY:default  all  clean  $(SUBDIRS)     #一共5個偽目標
default :all
    
all  clean:
       $(MAKE)  $(SUBDIRS)  TARGET=[email protected]           #  $(MAKE)相當於make,這句相當於 make  test1  test2  TARGET=all,並進入當前目錄。同理執行make clean也是給子目錄傳遞clean
$(SUBDIRS):
        $(MAKE)  -C  [email protected]  $(TARGET)        #將TARGET(all)傳遞到下一層目錄,make -C進入子目錄,再執行make命令。這一行生成test1 test2. (make -C test1 all)等價於make all test1/Makefile
make的遞歸執行,make的“-C”選項,是首先進入子目錄而後再執行make。進入test1中的Makefile後,查看一下test1中Makefile內容:進入子目錄之後,執行make all,要生成all,先 生成print與$(BIN)
CC    =gcc
BIN   =test1
OBJS  =test1.o
.PHONY:    all     clean    print
all:print  $(BIN)
print:
        @echo    "----  make all  in  $(PWD)  ----"
$(BIN):$(OBJS)
        $(CC)    $(OBJS)    -o   [email protected]
%.o:%.c
        $(CC)    -c    $<
clean:
        @echo    "----  make clean  in  $(PWD)  -----"
        rm  -f  $(BIN)    $(OBJS)

同理進入test2目錄下,對於test2.cpp,該目錄下的Makefile文件如下:

CXX         =g++
BIN         =test2
OBJS        =test2.o
CPPFLAGS    =-Wall -g
.PHONY:    all clean print
all:print  $(BIN)
print:
        @echo    "---- make all  in $(PWD) ----"
$(BIN):$(OBJS)
        $(CXX)    $(OBJS)    -o    [email protected]
%.o:%.cpp
        $(CXX)    -c       $<
clean:
        @echo    "---- make clean in $(PWD) ----"
        rm -f $(BIN)    $(OBJS)

linux開發工具之Makefile(下)