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完成
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檔案,各個子目錄負責相應的編譯工作
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
#每個子目錄都需要生成一個可執行檔案,目前目錄的結構如下圖
#各個檔案的内容如下
#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之後的結果
#執行後的目錄結構圖
增添了好多檔案[.o 和 可執行檔案]
#執行make clean的結果
#執行之後的結構圖
恢複原樣O(∩_∩)O~