一、make常用内嵌函数
函数调用个是
$(function arguments)
1、
$(wildcardPATTERN)
(1)当前目录下匹配模式的文件
(2)例如:src=$(wildcard *.c),
匹配的src就是所有的.c文件列表
2、
$(
patsubst
PATTERN,REPLACEMENT,TEXT)
(1)
模式替换函数
(2)例如:$(patsubst %.c,%.o,$src),
将
src
所有的.c文件都替换成.o文件
(3)
等价于$(src:.c=.o),采用这种方式,更直观
3、
shell
函数
(1)
执行
shell
命令
(2)例如:$(shell ls –d */)
,“/”代表将所有子文件夹都列出来
二、多级目录Makefile
CC = gcc
CFLAGS =-Wall -g
BIN = main
SUBDIR = $(shell ls -d */) #将所有子文件夹都列出来保存到SUBDIR中
ROOTSRC= $(wildcard *.c) #当前路径下所有的.c文件
ROOTOBJ= $(ROOTSRC:%.c=%.o) #将ROOTSRC所有的.c文件都替换成.o文件
SUBSRC = $(shell find $(SUBDIR) -name '*.c') #将子文件夹底下所有的.c文件
SUBOBJ = $(SUBSRC:%.c=%.o) #将子文件夹底下所有的.c文件都替换成.o文件
$(BIN):$(ROOTOBJ)$(SUBOBJ) #将所有的.o文件生成可执行文件
$(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ)$(SUBOBJ)
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
SUBDIRS = test1 test2
.PHONY:default all clean $(SUBDIRS)
default:all
all clean:
$(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
$(MAKE) -C $@ $(TARGET)
(2)文件2:test1/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) -c $<
clean:
@echo "----- make clean in $(PWD) -----"
rm -f $(BIN) $(OBJS)
(3)文件3:test2/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 $@
.o:%.cpp
$(CXX) -c $<
clean:
@echo "----- make clean in $(PWD) -----"
rm -f $(BIN) $(OBJS)
(4)解释:
$(MAKE)=make
make all test1/Makefile
make all test2/Makefile