Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315217
  • 博文数量: 22
  • 博客积分: 186
  • 博客等级: 入伍新兵
  • 技术积分: 1091
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-12 19:54
文章存档

2022年(1)

2020年(1)

2018年(1)

2013年(10)

2012年(9)

分类: LINUX

2018-02-07 02:09:45

    好几年前写的一个makefile for Linux框架,想不到最近在一个项目中用上了,还挺方便,一键即可编译完成。虽然因为各种原因最后没提交到库里,但支持众多特性还是让这个Makefile颇有用处,所以不如开源出来,让有缘者用上。
    支持的特性。
    1. 无须任何配置,make一键完成编译。
    2. 自动搜索所有的c文件和h文件。生成的可执行程序名字就是所在目录的目录名。
    3. 支持文件更新的自动依赖。任何改动,包括头文件的修改,都会自动重新编译相关文件。
    4. 支持线程库。
    5. 支持clean。
     后期改进:1. 支持c++编译;2. 归集编译产生的文件到指定目录。

点击(此处)折叠或打开

  1. #
  2. # user config
  3. #
  4. #LIB_LIST=
  5. #DIR_LIST=
  6. #CFLAGS=-g -Wall -Werror
  7. CFLAGS=-g -Wall
  8. CC=gcc
  9. AR=ar -rc
  10. LINK=gcc
  11. LIBFLAGS=-fPIC

  12. # autoconfig
  13. CUR_DIR=$(shell pwd)
  14. ROOT_DIR=$(CUR_DIR)

  15. ifeq (${DIR_LIST},)
  16. DIR_LIST=$(shell find . -type d | grep -v .git)
  17. endif

  18. INC_DIR=${DIR_LIST}
  19. INC_LIST=$(INC_DIR:%=-I${ROOT_DIR}/%)

  20. #SRC_LIST=$(foreach dir, ${CUR_DIR}/${DIR_LIST}, $(wildcard ${dir}/*.c))
  21. SRC_LIST=$(shell find . -type f -name '*.c')
  22. OBJ_LIST=$(SRC_LIST:.c=.o)
  23. DEP_LIST=$(SRC_LIST:.c=.d)

  24. MOD_NAME=$(shell basename ${CUR_DIR})
  25. BIN_NAME=$(MOD_NAME)

  26. #TODO: refer to #include "*.h"
  27. CFLAGS+=-I$(ROOT_DIR) -I${CUR_DIR} ${INC_LIST}

  28. # command line argument telling to build shared library objects
  29. ifeq ($(shared), on)
  30. ADD_LIB=$(LIB_LIST:%=-L${ROOT_DIR}/%) $(LIB_LIST:%=-l%)
  31. LIB_NEED=$(foreach i, ${LIB_LIST}, ${ROOT_DIR}/$(i)/lib$(i).so)
  32. ADD_LIB+=-lpthread
  33. else
  34. # sequence is important!
  35. ADD_LIB=$(foreach i, ${LIB_LIST}, ${ROOT_DIR}/$(i)/lib$(i).a)
  36. LIB_NEED=${ADD_LIB}
  37. ADD_LIB+=/usr/lib/libpthread.a /usr/lib/libc.a
  38. endif

  39. $(BIN_NAME): ${OBJ_LIST}
  40.     ${LINK} $^ ${ADD_LIB} -o $@

  41. %.o: %.c
  42.     ${CC} ${CFLAGS} -c $< -o $@

  43. %.d: %.c
  44.     @set -e; rm -f $@; ${CC} ${CFLAGS} -MM $< > $@.$$$$; sed 's,\($(notdir $*)\)\.o[:]*,$*.o $@:,g' $@.$$$$ > $@; rm -f $@.$$$$


  45. -include ${DEP_LIST}
  46. #${BIN_NAME}: ${LIB_NEED}
  47. $(shell echo "${BIN_NAME} ${CUR_DIR}/${BIN_NAME}.d: ${OBJ_LIST} ${LIB_NEED}" > ${BIN_NAME}.d)
  48. -include ${BIN_NAME}.d


  49. .PHONY: clean
  50. clean:
  51.     -rm -f *.so *.a ${BIN_NAME} $(shell find . -type f -name "*.o") $(shell find . -type f -name "*.d")
    当然,如果你想把部分代码编译成动态库,方便灵活配置和发布,那么也有一个ebf框架可用。详见 ,可到此处下载。


阅读(3665) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~