通用Makefile

主要用于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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值