linux開發工具之Makefile(下)
阿新 • • 發佈:2019-05-07
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(下)