#Author:zeno.chen
#Date:2015.03.21
CC=arm-linux-gcc #使用的编译器定义
CXX=arm-linux-g++
AR=arm-linux-ar
APPNAME=name#这里填写编译的可执行程序的名称
ROOTDIR=$(shell pwd)#获取当前路径
OBJDIR=${ROOTDIR}/build#填写生成目标文件的目录
DIRS=$(shell find . -type d)#获取所有子目录
C_SRCS=$(foreach file,$(DIRS),$(wildcard $(file)/*.c)) #需要编译的c文件
CPP_SRCS=$(foreach file,$(DIRS),$(wildcard $(file)/*.cpp)) #需要编译的cpp文件
#目标文件定义,包括c文件和cpp文件相应的目标文件
OBJS:=$(patsubst %.cpp,%.o,$(CPP_SRCS))
OBJS+=$(patsubst %.c,%.o,$(C_SRCS))
#依赖文件定义,对每一个c文件和cpp文件都生成对应的依赖文件
DEPS:=$(patsubst %.c,%.d,${C_SRCS})
DEPS+=$(patsubst %.cpp,%.d,${CPP_SRCS})
#目标文件和依赖文件都放到OBJDIR目录下,保留源代码的目录结构
OBJFILES=$(addprefix ${OBJDIR}/,${OBJS})
DEPFILES=$(addprefix ${OBJDIR}/,${DEPS})
INC_DIRS=${DIRS}#填写头文件的路径
DEFINES=DEBUG#填写需要定义的宏名称
CXXFLAGS = $(addprefix -I,$(INC_DIRS)) $(addprefix -D,$(DEFINES))
EXTRA_CXXFLAGS= #其他编译选项
LIB_DIRS=libs#填写链接库所在目录
LIBS=m rt#填写需要链接的库名称,比如libm.so就填m
LDFLAGS=$(addprefix -L,$(LIB_DIRS)) $(addprefix -l,$(LIBS))
EXTRA_LDFLAGS=#其他链接选项
.PHONE: all clean dir
.SUFFIXES: .d
all: dir $(APPNAME)
$(APPNAME): ${OBJFILES}
${CXX} -o $@ $^ ${LDFLAGS} $(EXTRA_LDFLAGS)
#按照源代码结构创建目标目录,为了防止重复创建目录使用以下方法
dir:
ifeq ($(wildcard ${OBJDIR}/exist),${OBJDIR}/exist)
@echo "--------directorys have created----------"
else
mkdir -p $(addprefix ${OBJDIR}/,${DIRS});touch ${OBJDIR}/exist
endif
#目标文件生成规则定义
${OBJDIR}/%.o:%.c ${OBJDIR}/%.d
${CC} -o $@ -c $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}
${OBJDIR}/%.o:%.cpp ${OBJDIR}/%.d
${CXX} -o $@ -c $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}
#依赖文件生成规则定义
${OBJDIR}/%.d:%.c
${CXX} -MM -MT $(patsubst %.d,%.o,$@) $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}> $@
${OBJDIR}/%.d:%.cpp
${CXX} -MM -MT $(patsubst %.d,%.o,$@) $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}> $@
-include ${DEPSFILES}#依赖文件规则包含,修改文件后只对有依赖的文件进行编译
clean:
find ${OBJDIR} -name "*.o" -o -name "*.d" -o -name "${APPNAME}" |xargs rm ; rm -rf ${OBJDIR}; rm ${APPNAME}
关于Zeno Chen
本人涉及的领域较多,杂而不精
程序设计语言: Perl, Java, PHP, Python;
数据库系统: MySQL,Oracle;
偶尔做做电路板的开发,主攻STM32单片机