在之前的博客里,给出了一份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}