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

2012年(15)

2011年(2)

我的朋友

分类: 嵌入式

2012-01-15 19:06:38

Makefile4处理了include文件包含时出现的两个问题:
1)依赖关系生成的正确性:
   主要考虑两点:A>依赖关系是一对一还是一对多?
                 B>使用gcc自动生成的结果是包含的路径不是自己想要的,如何修改?
#dep2)如下方案可以得到一对一关系的目标集合与依赖关系,但是写入$(DIR_DEPS)/%.dep文件的内容中的.o文件是不包含路径objs/的
#      因为gcc -E -MM Hello.c 就得不到关于objs/Hello.o的合理依赖只能是Hello.o的
#$(DIR_DEPS)/%.dep:$(DEP_DIR_DEPS) %.c
#    $(CC) -E -MM $^ > $@

2)目录出现在规则的先决条件中,当加入文件到该目录,该目录的时间戳被修改,这也就意味着依赖关系文 件发生了更新,出现死循环:
   方法是使用条件,决定目标是否需要生成

  1. .PHONY:all clean

  2. CC            =        gcc
  3. RM            =        rm
  4. RMCMD        =        -rf
  5. MKDIR        =        mkdir

  6. DIR_OBJS    =        objs
  7. DIR_EXES    =        exes
  8. DIR_DEPS    =        deps
  9. DIR            =        $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS)
  10. SRCS        =        $(wildcard *.c)
  11. OBJS        =        $(SRCS:.c=.o)
  12. OBJS        :=        $(addprefix $(DIR_OBJS)/,$(OBJS))
  13. EXE            =        complicated
  14. EXE            :=        $(addprefix $(DIR_EXES)/,$(EXE))
  15. DEPS        =        $(SRCS:.c=.dep)
  16. DEPS        :=        $(addprefix $(DIR_DEPS)/,$(DEPS))

  17. ifeq ("$(wildcard $(DIR_OBJS))", "")
  18. DEP_DIR_OBJS := $(DIR_OBJS)
  19. endif

  20. ifeq ("$(wildcard $(DIR_EXES))", "")
  21. DEP_DIR_EXES := $(DIR_EXES)
  22. endif

  23. ifeq ("$(wildcard $(DIR_DEPS))", "")
  24. DEP_DIR_DEPS := $(DIR_DEPS)
  25. endif

  26. all:$(EXE)

  27. $(DIR):
  28.     $(MKDIR) $@

  29. #dep2)如下方案可以得到一对一关系的目标集合与依赖关系,但是写入$(DIR_DEPS)/%.dep文件的内容中的.o文件是不包含路径objs/
  30. #     因为gcc -E -MM Hello.c 就得不到关于objs/Hello.o的合理依赖只能是Hello.o的
  31. #$(DIR_DEPS)/%.dep:$(DEP_DIR_DEPS) %.c
  32. #    $(CC) -E -MM $^ > $@

  33. #目录出现在规则的先决条件中,这给死循环埋下了伏笔:若DIR_DEPS目录时间戳被修改则规则会被再次使用:故要创建依赖则要看条件if
  34. #先生成依赖关系再修改依赖关系,加上objs/
  35. $(DIR_DEPS)/%.dep:$(DEP_DIR_DEPS) %.c
  36.     @echo "Creating $@ ..."        
  37.     @set -e; \
  38.     $(RM) $(RMCMD) $@.tmp; \
  39.     $(CC) -E -MM $^ > $@.tmp; \
  40.     sed 's,\(.*\)\.o[ :]*,objs/\1.o: ,g' < $@.tmp > $@ ; \
  41.     $(RM) $(RMCMD) $@.tmp

  42. #执行make的时候include会首先被执行,include能够创建所需包含进来的依赖文件,故目标甚至可以不被包含在all之后
  43. include $(DEPS)

  44. $(EXE):$(DEP_DIR_EXES) $(OBJS)
  45.     $(CC) -o $@ $(filter %.o,$^)
  46. $(DIR_OBJS)/%.o:$(DEP_DIR_OBJS) %.c
  47.     $(CC) -o $@ -c $(filter %.c,$^)

  48. clean:$(DIR)
  49.     $(RM) $(RMCMD) $^
Makefile4


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