主要用于Linux下十来个源文件的小型程序,无论修改源文件还是头文件,每一次都会重新编译所有文件
默认以项目文件夹名称作为输出程序名称
新建bin文件夹存放输出文件,obj文件夹存放中间文件
编译2层子目录下的所有c与cpp文件

PNAME = $(shell pwd |sed 's/^\(.*\)[/]//')

CC = gcc
AR = ar
LD = g++
WINDRES = windres

INC = -I.
CFLAGS = -Wall -fexceptions -O2
RESINC =
LIBDIR =
LIB =
LDFLAGS = -s

OUTDIR = bin
OBJDIR = obj
OUT = $(OUTDIR)/$(PNAME)

exclude_dirs = $(OUTDIR) $(OBJDIR) $(OUTDIR)/% $(OBJDIR)/%
SUBDIR = $(shell find . -maxdepth 2 -type d)
SUBDIR := $(basename $(patsubst ./%,%,$(SUBDIR)))
SUBDIR := $(filter-out $(exclude_dirs),$(SUBDIR))

SRCS = $(wildcard *.cpp) $(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.cpp)) $(wildcard *.c) $(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.c))
INCS = $(wildcard *.hpp) $(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.hpp)) $(wildcard *.h) $(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.h))
OBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(SRCS)))

all: before out

before:
	@test -d $(OBJDIR) || mkdir -p $(OBJDIR)
	@test -d $(OUTDIR) || mkdir -p $(OUTDIR)
	@for dir in $(addprefix $(OBJDIR)/,$(SUBDIR));do test -d $$dir || mkdir -p $$dir;done

out: $(OBJS)
	$(LD) $(LIBDIR) -o $(OUT) $(OBJS) $(LDFLAGS) $(LIB)

$(OBJS): $(SRCS) $(INCS)
	$(CC) $(CFLAGS) $(INC) -c $(filter $(patsubst $(OBJDIR)/%.o,%,$@).%,$(SRCS)) -o $@

clean:
	rm -f $(OUT)
	test ! -d $(OUTDIR) || rmdir --ignore-fail-on-non-empty $(OUTDIR)
	rm -rf $(OBJDIR)

.PHONY: all clean