###########以下变量也可以设置在shell的环境变量中,如果无需指定,请将其注释或删除,以免空值覆盖默认值###########
#Make的输出目录
OUTDIR=Mydebug
#最终生成的可执行文件
PROGRAM=$(OUTDIR)/run
#源代码根目录
SRCDIR=src
#包含源代码的所有目录($需要用$转义)
SRCDIRS=$(foreach subdir,$(shell ls -R $(SRCDIR) | grep '.*[:]$$' | sed 's/\(.*\)[:]/\1/g'),$(subdir))
#文件搜索路径
VPATH=
#编译器
CC=gcc
#编译器参数
CFLAGS=-g
#指明包含外部头文件的目录,多个目录以空格分隔,每个目录前面添加-I
INCLUDES=
#连接器
LD=$(CC)
#指明引用外部的库文件
LIBS=
#连接器参数
LDFLAGS=
#生成依赖关系文件的参数
DEPENDFLAG=-MM
CFLAGS:=$(CFLAGS) $(INCLUDES)
LDFLAGS:=$(LDFLAGS) $(LIBS)
###############下面为通用部分,一般无需改动###############
#从所有子目录中得到源代码的列表
SRCS=$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
#得到源代码对应的目标文件的列表
OBJS=$(patsubst %.c,$(OUTDIR)/%.o,$(SRCS))
#得到源代码对应的依赖关系文件的列表
#依赖关系文件就是一个目标文件依赖于哪些头文件和源程序,依赖关系式自动生成的,并且用include语句包含在makefile中
DEPENDS=$(patsubst %.c,$(OUTDIR)/%.d,$(SRCS))
#指明默认目标式生成最终可执行文件
#all:$(PROGRAM)
$(PROGRAM):$(OBJS)
$(CC) $(CFLAGS) -o $@ $(filter %.o , $^) $(LDFLAGS); \
@echo 'Succeed to generate $(PROGRAM)' ;
#包含依赖关系文件(如果.d文件不存在则会根据包含文件名去找依赖关系生成.d文件)
include $(DEPENDS)
$(OUTDIR)/%.o: %.c
-mkdir -p $(dir $@); \
$(CC) -c $< -o $@
#生成依赖关系文件(形如xxx.d xxx.o = abc.h abc.c xy.c xy.h,目的是当有头文件或源文件被更新时,能够更新相关的.o和.d文件,而不是每次make都从头到尾编译一遍)
$(OUTDIR)/%.d:%.c
-mkdir -p $(dir $@); \
set -e; rm -f $@; \
$(CC) $(DEPENDFLAG) $(CFLAGS) $< > $@.$$$$; \
sed 's,\(.*\)\.o[ :]*,$*.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
#################自定义Make命令####################
#删除生成的中间文件
.PHONY:clean
clean:
# -rm $(OBJS) $(DEPENDS) $(PROGRAM); \
-rm -R $(OUTDIR);
#安装文件
.PHONY:install
install:
cp -f $(PRORAM) ~/bin
#拷贝文件
.PHONY:cp
cp:
cp $(PROGRAM) ~/bin
阅读(349) | 评论(0) | 转发(0) |