Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67028
  • 博文数量: 17
  • 博客积分: 263
  • 博客等级: 二等列兵
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-17 08:54
文章分类
文章存档

2012年(15)

2011年(2)

我的朋友

分类: 嵌入式

2012-01-09 22:50:09

这是第一个亲手写出的Makefile,能够自动实现工程目录的创建和相应文件的生成与清除。
该工程的目录摘自小结一中的书籍。
源码中的注释解释的是一种从单个目录到工程环境的创建过程中的改动之处。
工程中仅有一个源文件Hello.c
大体的makefile如下:
1)公有Makefile改名叫make.rule
2)模块独立的Makefile编译生成每个模块的相应依赖和目标
  1. .PHONY:all clean

  2. CC             =        gcc
  3. RM            =        rm
  4. RMFLAGS        =        -rf
  5. MKDIR        =        mkdir
  6. AR            =        ar
  7. ARFLAGS        =        crs

  8. #此代码为各个Makefile的公有部分
  9. #仅仅修改了DIR_LIBS DIR_EXES路径值,删除了EXE LIB赋值操作,因为他们在子模块中各有不同

  10. DIR_OBJS    =        objs
  11. DIR_DEPS    =        deps
  12. DIR_LIBS    =        $(ROOT)/build/libs
  13. DIR_EXES    =        $(ROOT)/build/exes
  14. DIRS        =        $(DIR_OBJS) $(DIR_DEPS) $(DIR_LIBS) $(DIR_EXES)
  15. RMS            =        $(DIR_DEPS)    $(DIR_OBJS)

  16. #LIB            =        libfoo.a
  17. ifneq ("$(LIB)","")
  18. LIB            :=        $(addprefix $(DIR_LIBS)/,$(LIB))
  19. RMS            +=        $(LIB)
  20. endif

  21. #EXE            =        complicated
  22. ifneq ("$(EXE)","")
  23. EXE         :=        $(addprefix $(DIR_EXES)/,$(EXE))
  24. RMS            +=        $(EXE)
  25. endif

  26. SRCS        =        $(wildcard *.c)
  27. OBJS        =        $(SRCS:.c=.o)
  28. OBJS        :=        $(addprefix $(DIR_OBJS)/,$(OBJS))
  29. DEPS        =        $(SRCS:.c=.dep)
  30. DEPS        :=        $(addprefix $(DIR_DEPS)/,$(DEPS))

  31. ifeq ("$(wildcard $(DIR_EXES))","")
  32. DEP_DIR_EXES :=    $(DIR_EXES)
  33. endif
  34. ifeq ("$(wildcard $(DIR_OBJS))","")
  35. DEP_DIR_OBJS :=    $(DIR_OBJS)
  36. endif
  37. ifeq ("$(wildcard $(DIR_DEPS))","")
  38. DEP_DIR_DEPS :=    $(DIR_DEPS)
  39. endif
  40. ifeq ("$(wildcard $(DIR_LIBS))","")
  41. DEP_DIR_LIBS :=    $(DIR_LIBS)
  42. endif

  43. all:$(EXE) $(LIB)

  44. ifneq ($(MAKECMDGOALS),clean)
  45. include $(DEPS)
  46. endif

  47. $(DIRS):
  48.     $(MKDIR) $@

  49. $(EXE): $(DEP_DIR_EXES) $(OBJS)
  50.     $(CC) -o $@ $(filter %.o,$^)
  51. $(LIB): $(DEP_DIR_LIBS) $(OBJS)
  52.     $(AR) $(ARFLAGS) $@ $(filter %.o,$^)
  53. $(DIR_OBJS)/%.o: $(DEP_DIR_OBJS) %.c
  54.     $(CC) -o $@ -c $(filter %.c,$^)
  55. $(DIR_DEPS)/%.dep: $(DEP_DIR_DEPS) %.c
  56.     @echo "Creating $@ ..."
  57.     @set -e ; \
  58.     $(RM) $(RMFLAGS) $@.tmp ; \
  59.     $(CC) -E -MM $(filter %.c,$^) > $@.tmp ; \
  60.     sed 's,\(.*\)\.o[ :]*,objs/\1.o $@: ,g' < $@.tmp > $@ ; \
  61.     $(RM) $(RMFLAGS) $@.tmp

  62. clean:
  63.     $(RM)    $(RMFLAGS) $(RMS)
make.rule

  1. LIB    = libfoo.a
  2. EXE    =
  3. include $(ROOT)/build/make.rule
子目录foo模块Makefile

  1. #此处生成可执行文件,路径需要用export制定,以便后续所有shell都能用到
  2. LIB =
  3. EXE = complicated
  4. include $(ROOT)/build/make.rule
阅读(1502) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~