好几年前写的一个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 -Werror
-
CFLAGS=-g -Wall
-
CC=gcc
-
AR=ar -rc
-
LINK=gcc
-
LIBFLAGS=-fPIC
-
-
# autoconfig
-
CUR_DIR=$(shell pwd)
-
ROOT_DIR=$(CUR_DIR)
-
-
ifeq (${DIR_LIST},)
-
DIR_LIST=$(shell find . -type d | grep -v .git)
-
endif
-
-
INC_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 objects
-
ifeq ($(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+=-lpthread
-
else
-
# 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.a
-
endif
-
-
$(BIN_NAME): ${OBJ_LIST}
-
${LINK} $^ ${ADD_LIB} -o $@
-
-
%.o: %.c
-
${CC} ${CFLAGS} -c $< -o $@
-
-
%.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: clean
-
clean:
-
-rm -f *.so *.a ${BIN_NAME} $(shell find . -type f -name "*.o") $(shell find . -type f -name "*.d")
当然,如果你想把部分代码编译成动态库,方便灵活配置和发布,那么也有一个ebf框架可用。详见 ,可到此处下载。
阅读(3675) | 评论(0) | 转发(1) |