天天看點

Makefile學習(三)[第二版]

1、函數調用

   $(function arguments) #$引用的結果就是函數生成的結果

2、Makefile下常用的函數

1)$(wildcard PATTERN) #比對目前目錄下的檔案

例如:src=$(wildcard *.c) #比對目前目錄下所有的.c檔案

2)$(patsubst PATTERN,REPLACEMENT,TEXT) #模式替換函數

例如:$(patsubst %.c,%.o,$src) #等價于$(src:%.c=%.o)[常用]

3)shell函數,執行shell指令

例如:$(shell ls –d */)

#示例1-所有的編譯均由主目錄下的Makefile完成

Makefile學習(三)[第二版]

CC = gcc   

CFLAGS   = -Wall -g

BIN      = main  

SUBDIR   = $(shell ls -d */) #SUBDIR儲存了目前目錄下的子目錄

ROOTSRC  = $(wildcard *.c) #ROOTSRC儲存了目前目錄下的.c檔案

ROOTOBJ  = $(ROOTSRC:%.c=%.o) #ROOTOBJ儲存了将ROOTSRC中.c替換為.o檔案之後的結果

SUBSRC   = $(shell find $(SUBDIR) -name '*.c') #SUBSRC儲存了所有子目錄下的所有.c檔案

SUBOBJ   = $(SUBSRC:%.c=%.o) #SUBOBJ儲存了将SUBSRC中.c替換為.o檔案之後的結果

$(BIN):$(ROOTOBJ) $(SUBOBJ)

        $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)

%.o:%.c

        $(CC) $(CFLAGS) -c $< -o $@ #将所有的.c生成.o檔案

clean:

        rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

#示例2-各個子目錄下都有想對應的Makefile檔案,各個子目錄負責相應的編譯工作

Makefile學習(三)[第二版]

DIRS = lib intro sockets advio daemons datafiles db environ \

    fileio filedir ipc1 ipc2 proc pty relation signals standards \

    stdio termios threadctl threads printer exercises

all:

    for i in $(DIRS); do \

        (cd $$i && echo "making $$i" && $(MAKE) ) || exit 1; \

    done

        (cd $$i && echo "cleaning $$i" && $(MAKE) clean) || exit 1; \

done

#每個子目錄都需要生成一個可執行檔案,目前目錄的結構如下圖

Makefile學習(三)[第二版]

#各個檔案的内容如下

#test1/Makefile 

.PHONY: all clean print

CC = gcc 

CFLAGS = -Wall -g

BIN = test1

SOURCES = $(wildcard *.c)

OBJECTS = $(SOURCES:%.c=%.o)

all: print $(BIN)

print:

    @echo "----- make all in $(PWD) -----"

$(BIN): $(OBJECTS)

    $(CC) $(CFLAGS) -o $@ $^

#$(OBJECTS): $(SOURCES)

%.o: %.c 

    $(CC) $(CFLAGS) -o $@ -c $<

    @echo "---- make clean in $(PWD) -----"

    -rm -rf $(BIN) $(OBJECTS)

#test2/Makefile

.PHONY: clean all print

CXX = g++ 

CPPFLAGS = -Wall -g

BIN = test2

SOURCES = $(wildcard *.cpp)

OBJECTS = $(SOURCES:.cpp=.o)

    $(CXX) $(CPPFLAGS) -o $@ $<

%.o: %.cpp  #可以省略該行以及下面一行

    $(CXX) $(CPPFLAGS) -o $@ -c $<

    @echo "----- make clean in $(PWD) -----"

#Makefile-在主目錄下

SUBDIR = $(shell /bin/ls -d */)

.PHONY: default all clean $(SUBDIR)

default: all 

all clean:

    $(MAKE) $(SUBDIR) TARGET=$@

$(SUBDIR):

    $(MAKE) -C $@ $(TARGET)

#執行make之後的結果

Makefile學習(三)[第二版]

#執行後的目錄結構圖

Makefile學習(三)[第二版]

增添了好多檔案[.o 和 可執行檔案]

#執行make clean的結果

Makefile學習(三)[第二版]

#執行之後的結構圖

Makefile學習(三)[第二版]

恢複原樣O(∩_∩)O~