二、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 */)
#ls
Makefile
02.多级目录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
#ls
bll dll Makefile ui
#vi Makefile (有二级目录)
CC
= gcc
CFLAGS
=-Wall -g
BIN
= main
SUBDIR
= $(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.c
dll/dll.c
ui/ui.c
#make
#makeclean
#ls
03.Makefile可能生成多个可执行文件,如何只生成一个可执行文件
#vi Makefile
SUBDIRS = test1 test2
.PHONYL:default all clean $(SUBDIRS)
default:all
all clean:
$(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
$(MAKE) -C $@ $(TARGET)
#cd . ./test1
#vi Makefile
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 $@
%.o:%.c
$(CC) $(OBJS) -o $@
%.o:%.c
$(CC) -c $<
clean:
@echo "---- make clean in $(PWD) ----"
rm -f $(BIN) $(OBJS)
#cd ../test2
#ls
#vi Makefile
CXX
= g++(实现C++的编译)
BIN
= test2
OBJS
= test2.o
CPPFLAGS=-Wall -g
.PHONY: all clean print
all:print $(BIN)
@echo "---- make all in $(PWD) ----"
$(BIN):$(OBJS)
$(CXX) $(OBJS) -o $@
.o:%.cpp
$(CXX) -c $<
clean:
@echo "---- make clean in $(PWD) ----"
rm -f $(BIN) $(OBJS)
如果子目录下存在文件夹,也可以采用与顶层目录的Makefile类似的写法
,实现多级目录,可扩展的方法。