多目录makefile,支持自动生成依赖关系,支持C和C++混合编译

在之前的博客里,给出了一份makefile,但是在使用过程中发现一些问题,因此对其进行了更新,之前的文章地址如下,感兴趣的可以看看:

https://blog.csdn.net/zhangyanzlk/article/details/79123562

 

更新的makefile,增加了一份忽略列表,可以将不想编译的文件加到里面,另外就是支持C和C++的混合编译。

更新:

2019.03.24 之前的版本自动依赖是有问题的,主要是由于如果依赖包含了路径,则对应的模式规则也需要包含路径,否则根据模式规则生成文件时,没有参考依赖信息。更新对该问题进行了修复,另外将部分变量名改为与make内建变量名一致。

DIR_SRC = ./src/
DIR_LIB = ./lib/
IGNORE_LIST = ./src/test.c
DIR_OBJ = ./debug/obj/
DIR_BIN = ./debug/bin/
TARGET = main.exe
# CROSS = arm-linux-
CROSS = 
CC = ${CROSS}gcc
CXX = ${CROSS}g++

LDLIBS :=
DIR_INC := ${DIR_LIB} ${DIR_SRC}
CFLAGS := -g -std=c99 -Wall ${foreach n,${DIR_INC},-I${n}}
CXXFLAGS := -g -Wall ${foreach n,${DIR_INC},-I${n}}
CPPFLAGS :=
LDFLAGS := ${foreach n,${DIR_LIB},-L${n}} ${LDLIBS}

empty =
space =${empty} ${empty}
VPATH := ${subst ${space},:,${DIR_SRC}}:${DIR_OBJ}:${DIR_BIN}
vpath %.c ${subst ${space},:,${DIR_SRC}}
vpath %.cpp ${subst ${space},:,${DIR_SRC}}
vpath %.o ${DIR_OBJ}
vpath %.d ${DIR_OBJ}

CSRC_WITH_PATH := ${foreach n,${DIR_SRC},${wildcard ${n}*.c}}
CSRC_WITH_PATH := ${filter-out ${IGNORE_LIST},${CSRC_WITH_PATH}}
CSRC := ${notdir ${CSRC_WITH_PATH}}
COBJ_WITH_PATH := ${patsubst %.c,${DIR_OBJ}%.o,${CSRC}}
COBJ := ${notdir ${COBJ_WITH_PATH}}
CDEF_WITH_PATH = ${COBJ_WITH_PATH:.o=.d}
CDEF = ${COBJ:.o=.d}

CXXSRC_WITH_PATH := ${foreach n,${DIR_SRC},${wildcard ${n}*.cpp}}
CXXSRC_WITH_PATH := ${filter-out ${IGNORE_LIST},${CXXSRC_WITH_PATH}}
CXXSRC := ${notdir ${CXXSRC_WITH_PATH}}
CXXOBJ_WITH_PATH := ${patsubst %.cpp,${DIR_OBJ}%.o,${CXXSRC}}
CXXOBJ := ${notdir ${CXXOBJ_WITH_PATH}}
CXXDEF_WITH_PATH = ${CXXOBJ_WITH_PATH:.o=.d}
CXXDEF = ${CXXOBJ:.o=.d}

TARGET_WITH_PATH := ${DIR_BIN}${TARGET}

DIR_OBJ ?= ./debug/
TARGET_WITH_PATH ?= ./debug/bin/main.exe

.PHONY:all
all:${TARGET}

${TARGET}:${COBJ_WITH_PATH} ${CXXOBJ_WITH_PATH}
ifneq (${empty},${findstring .cpp,${CXXSRC}})
	${CXX} $^ -o ${DIR_BIN}$@ ${LDFLAGS}
else
	${CC} $^ -o ${DIR_BIN}$@ ${LDFLAGS}
endif

${COBJ_WITH_PATH}:${DIR_OBJ}%.o:%.c
	${CC} ${CFLAGS} -c -o $@ $<
${CXXOBJ_WITH_PATH}:${DIR_OBJ}%.o:%.cpp
	${CXX} ${CXXFLAGS} -c -o $@ $<
${CDEF_WITH_PATH}:${DIR_OBJ}%.d:%.c
	${CC} ${CFLAGS} -MM -MT "${subst .d,.o,$@} $@" -MF "$@" $<
${CXXDEF_WITH_PATH}:${DIR_OBJ}%.d:%.cpp
	${CXX} ${CXXFLAGS} -MM -MT "${subst .d,.o,$@} $@" -MF "$@" $<

ifneq (${MAKECMDGOALS},clean)
-include ${CDEF_WITH_PATH} ${CXXDEF_WITH_PATH}
endif

run:${TARGET}
	${TARGET_WITH_PATH}

debug:${TARGET}
	gdb ${TARGET_WITH_PATH}

.PHONY:check
check:
	@echo VPATH : ${VPATH}
	@echo CSRC_WITH_PATH : ${CSRC_WITH_PATH}
	@echo CSRC : ${CSRC}
	@echo COBJ_WITH_PATH : ${COBJ_WITH_PATH}
	@echo COBJ : ${COBJ}
	@echo CDEF : ${CDEF}
	@echo CXXSRC_WITH_PATH : ${CXXSRC_WITH_PATH}
	@echo CXXSRC : ${CXXSRC}
	@echo CXXOBJ_WITH_PATH : ${CXXOBJ_WITH_PATH}
	@echo CXXOBJ : ${CXXOBJ}
	@echo CXXDEF : ${CXXDEF}

.PHONY:clean
clean:
#	-rm -f ${DIR_OBJ}*.o
#	-rm -f ${DIR_OBJ}*.d
#	-rm -f ${TARGET_WITH_PATH}
	-cd ${DIR_OBJ} && del *.o *.d
	-cd ${DIR_BIN} && del ${TARGET}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值