1.make常用內嵌函數
- 函數調用
$(function arguments)
(1)$(wildcard PATTERN)
當前目錄下匹配模式的文件
eg:
src=$(wildcard *.c) 匹配所有的.c文件,所有.c文件列表保存到src變量中
(2)$(patsubst PATTERN, REPLACEMENT, TEXT)
模式替換函數
eg:
$(patsubst %.c,%.o,$src) .c的後綴名都替換成.o
等價於
$(src:.c=.o) 用的多
(3)shell函數
執行shell命令
eg:
$(shell ls -d */)
2.多級目錄Makefile
- eg1:
(1)多級目錄如下:04make\01
(2)多級目錄的含義如下:
bll:業務邏輯層
dal:數據層
ui:界面層
main.c中有代碼,代碼如下:
int main(void)
{
return 0;
}
================Makefile中的代碼如下============
CC= gcc
CFLAGS=-Wall -g
BIN=main
SUBDIR=$(shell ls -d */) ##SUBDIR保存子文件夾列表
ROOTSRC=$(whildcard *.c) ##當前文件夾下的.c,當前是main.c
ROOTOBJ=$(ROOTSRC:%.c=%.o)
SUBSRC=$(shell find $(SUBDIR) -name '*.c') ##實際上是:find bll dal ui -name '*.c'
SUBOBJ=$(SUBSRC:%.c=%.o) ##子文件下所有的.c文件保存在SUBSRC
$(BIN):$(ROOTOBJ) $(SUBOBJ)
$(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
.c.o: ##所有的.c生成,或者%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
-
eg1的測試結果如下:
-
eg2:
(1)多級目錄如下:04make\02
=================最外層Makefile內容如下:==========================
SUBDIRS=teset1 teset2
.PHONY:default all clean $(SUBDIRS) ##定義了5個僞目標
default:all ##終極目標,default沒有命令,會去生成all
all clean:
$(MAKE) $(SUBDIRS) TARGET=$@ ## $(MAKE)就是make,TARGET就是all(執行make all),執行
##make clean,此時TARGET就是clean。所以clean也會傳遞到子目錄的目標中
$(SUBDIRS): ##SUBDIRS就是test1,test2,會進入這倆子目錄去調用子目錄的makefile,並將all傳遞進去
$(MAKE) -C $@ $(TARGET)
##make -C test1 all,等價於make all test1/makefile,-C表示進入到test1目錄
================04make\02\test1\Makefile======================
CC=gcc
BIN=test1
OBJS=test1.o
.PHONY:all clean print
all:print $(BIN) ##進入該目錄執行的是make all,print是僞目標,只會執行動作,不會生成print文件
print:
@echo "----make all in $(PWD) ----"
$(BIN):$(OBJS)
$(CC) $(OBJS) -o $@
%.o:%.c
$(CC) -c $<
clean:
@echo "---- make clean in $(PWD) ----"
rm -f $(BIN) $(OBJS)
=================04make\02\test2\Makefile=====================
CXX=gcc
BIN=test2
OBJS=test2.o
CFLAGS=-Wall -g
.PHONY:all clean print
all:print $(BIN) ##進入該目錄執行的是make all,print是僞目標,只會執行動作,不會生成print文件
print:
@echo "----make all in $(PWD) ----"
$(BIN):$(OBJS)
$(CXX) $(OBJS) -o $@
%.o:%.cpp
$(CXX) -c $<
clean:
@echo "---- make clean in $(PWD) ----"
rm -f $(BIN) $(OBJS)
- 如果04make\02\test1下還有子文件夾,寫法就是將04make\02\test1下的Makefile仿照最外層的Makeflie去寫即可
- eg2測試結果如下