二、Makefile(下)01.make常用內嵌函數函數調用 $(function arguments)$(wildcard PATTERN) 當前目錄下匹配模式的文件 例如:src=$(wildcard *.c)$(patsubst PATTERN,REPLACEMENT,TEXT) 模式
二、Makefile(下)01.make常用內嵌函數函數調用 $(function arguments)$(wildcard PATTERN) 當前目錄下匹配模式的文件 例如:src=$(wildcard *.c)$(patsubst PATTERN,REPLACEMENT,TEXT) 模式替換函數 例如:$(patsubst %.c,%.o,$src) 等價於$(src:.c=.o)shell函數 執行色狼來了命令 例如:$(shell ls -d */)#lsMakefile02.多級目錄Makefile#touch main.c#mkdir bll(應用邏輯層)#mkdir ui(界面層)#mkdir dal(數據邏輯層)#cd ui#touch ui.h ui.c#cd ..#cd dll#touch dal.h dal.c#cd ..#cd bll#touch bll.h bll.c#lsbll dll Makefile ui#vi Makefile (有二級目錄)CC = gccCFLAGS =-Wall -gBIN = mainSUBDIR = $(shell ls -d */)(當前目錄下的所有文件夾)ROOTSRC = $(wildcard *.c)(當前目錄下的所有*.c文件)ROOTOBJ = $(ROOTSRC:%.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) -o $< -o $@clean: rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)#ls -d */(列出該目錄下的文件夾都列出來)#find bll dll ui -name '*.c'bll/bll.cdll/dll.cui/ui.c#make#makeclean#ls03.Makefile可能生成多個可執行文件,如何只生成一個可執行文件#vi MakefileSUBDIRS = test1 test2.PHONYL:default all clean $(SUBDIRS)default:allall clean: $(MAKE) $(SUBDIRS) TARGET=$@$(SUBDIRS): $(MAKE) -C $@ $(TARGET)#cd . ./test1#vi MakefileCC = gccBIN = test1OBJS = test1.o.PHONY: all clean printall:print $(BIN)print @echo "----make all in $(PWD)----"$(BIN):$(OBJS) $(CC) $(OBJS) -o $@%.o:%.c $(CC) $(OBJS) -o $@%.o:%.c $(CC) -c $<clean: @echo "---- make clean in $(PWD) ----" rm -f $(BIN) $(OBJS)#cd ../test2#ls#vi MakefileCXX = g++(實現C++的編譯)BIN = test2OBJS = test2.oCPPFLAGS=-Wall -g.PHONY: all clean printall:print $(BIN) @echo "---- make all in $(PWD) ----"$(BIN):$(OBJS) $(CXX) $(OBJS) -o [email protected]:%.cpp $(CXX) -c $<clean: @echo "---- make clean in $(PWD) ----" rm -f $(BIN) $(OBJS)如果子目錄下存在文件夾,也可以採用與頂層目錄的Makefile類似的寫法,實現多級目錄,可擴展的方法。