一个很好的Makefile,顶层Makefile递归编译更目录及其子目录源文件
1 多个目标
TARGET = target01 target02
CC = gcc
CFLAGS = -Wall -g
LOCAL_PATH=$(shell pwd)
all:$(TARGET)
#%.o:%.c
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
test01:test01.o sub.o
$(CC) $(CFLAGS) -o $@ $^
test02:test02.o add.o
$(CC) $(CFLAGS) -o $@ $^
.PHONY:clean all
clean:
echo "$(LOCAL_PATH)"
rm -f $(BIN) *.o
2 多级目录单目标(强烈推荐)
CC := gcc
CFLAGS := -Wall -g
TARGET := drvier_app
LDFLAGS := -lpthread
ROOTSRC = $(wildcard *.c)
ROOTOBJ = $(patsubst %.c, %.o, $(ROOTSRC))
SUBDIR = $(shell ls -d */)
SUBSRC = $(shell find $(SUBDIR) -name '*.c')
SUBOBJ = $(SUBSRC:%.c=%.o) #no sapce key behind the "="
#SUBOBJ = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o,$(SUBSRC)))
$(TARGET):$(ROOTOBJ) $(SUBOBJ)
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY : clean
clean:
#rm -rf $(TARGET)
rm -rf $(TARGET) $(ROOTOBJ) $(SUBOBJ)
主要是三个函数 $(wildcard pattern) $(patsubst pattern, replacement, text) $(shell cmd)的灵活运用
3 多级目录,多个目标
SUBDIRS = 01test 02test
.PHONY:all clean $(SUBDIRS)
all clean:
$(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
$(MAKE) -C $@ $(TARGET)
$(MAKE)即是make命令,TARGET被赋值成目标然后传递到子目录下的Makefile,子目录下的Makefile参考上述方法即可。