好几年前写的一个makefile for Linux框架,想不到最近在一个项目中用上了,还挺方便,一键即可编译完成。虽然因为各种原因最后没提交到库里,但支持众多特性还是让这个Makefile颇有用处,所以不如开源出来,让有缘者用上。 支持的特性。 1. 无须任何配置,make一键完成编译。 2. 自动搜索所有的c文件和h文件。生成的可执行程序名字就是所在目录的目录名。 3. 支持文件更新的自动依赖。任何改动,包括头文件的修改,都会自动重新编译相关文件。 4. 支持线程库。 5. 支持clean。 后期改进:1. 支持c++编译;2. 归集编译产生的文件到指定目录。点击(此处)折叠或打开## user config##LIB_LIST=#DIR_LIST=#CFLAGS=-g -Wall -WerrorCFLAGS=-g -WallCC=gccAR=ar -rcLINK=gccLIBFLAGS=-fPIC# autoconfigCUR_DIR=$(shell pwd)ROOT_DIR=$(CUR_DIR)ifeq (${DIR_LIST},)DIR_LIST=$(shell find . -type d | grep -v .git)endifINC_DIR=${DIR_LIST}INC_LIST=$(INC_DIR:%=-I${ROOT_DIR}/%)#SRC_LIST=$(foreach dir, ${CUR_DIR}/${DIR_LIST}, $(wildcard ${dir}/*.c))SRC_LIST=$(shell find . -type f -name '*.c')OBJ_LIST=$(SRC_LIST:.c=.o)DEP_LIST=$(SRC_LIST:.c=.d)MOD_NAME=$(shell basename ${CUR_DIR})BIN_NAME=$(MOD_NAME)#TODO: refer to #include "*.h"CFLAGS+=-I$(ROOT_DIR) -I${CUR_DIR} ${INC_LIST}# command line argument telling to build shared library objectsifeq ($(shared), on)ADD_LIB=$(LIB_LIST:%=-L${ROOT_DIR}/%) $(LIB_LIST:%=-l%)LIB_NEED=$(foreach i, ${LIB_LIST}, ${ROOT_DIR}/$(i)/lib$(i).so)ADD_LIB+=-lpthreadelse# sequence is important!ADD_LIB=$(foreach i, ${LIB_LIST}, ${ROOT_DIR}/$(i)/lib$(i).a)LIB_NEED=${ADD_LIB}ADD_LIB+=/usr/lib/libpthread.a /usr/lib/libc.aendif$(BIN_NAME): ${OBJ_LIST} ${LINK} $^ ${ADD_LIB} -o $@%.o: %.c ${CC} ${CFLAGS} -c $%.d: %.c @set -e; rm -f $@; ${CC} ${CFLAGS} -MM $ $@.$$$$; sed 's,\($(notdir $*)\)\.o[:]*,$*.o $@:,g' $@.$$$$ > $@; rm -f $@.$$$$-include ${DEP_LIST}#${BIN_NAME}: ${LIB_NEED}$(shell echo "${BIN_NAME} ${CUR_DIR}/${BIN_NAME}.d: ${OBJ_LIST} ${LIB_NEED}" > ${BIN_NAME}.d)-include ${BIN_NAME}.d.PHONY: cleanclean: -rm -f *.so *.a ${BIN_NAME} $(shell find . -type f -name "*.o") $(shell find . -type f -name "*.d") 当然,如果你想把部分代码编译成动态库,方便灵活配置和发布,那么也有一个ebf框架可用。详见 https://github.com/aboloo/expressBuildFrame ,可到此处下载。 10-10 11:23