Makefile写作过程小结

时间:2020-12-03 06:48:51

转载地址:http://blog.chinaunix.net/uid-25835268-id-3055356.html

Makefile 的写作思路小结:

1)伪目标
2)命令(CC MKDIR...)
3)目录(绝对路径、相对路径、临时目录、条件加入的目录...)
4)实际目标(对空目标分开处理)
5)include(写在all之下)
6)创建目录(对写好的目录加上条件并创建、同时可选择加入依赖中)
7)实际目标的生成方法
8)完善依赖关系
9)头文件的查找与链接
10)库文件依赖关系的裁剪与添加
11)自动生成依赖关系并修改加入前缀(经典六句话)
12)提取公共部分至make.rule文件中并修改模块生成文件的路径
13)各个子模块的目标库文件的写入与删除
14)编写总体Makefile放在指定的build目录中

注:一下程序都来源于《专业嵌入式软件开发》一书,李云著
  1. .PHONY:all clean

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

  8. DIR_OBJS    =        objs
  9. DIR_DEPS    =        deps
  10. DIR_LIBS    =        ../../../libs
  11. DIR_EXES    =        ../../../exes
  12. DIRS        =        $(DIR_OBJS) $(DIR_DEPS) $(DIR_LIBS) $(DIR_EXES)
  13. RMS            =        $(DIR_DEPS)    $(DIR_OBJS)

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

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

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

  29. #如下写法只是在判断DIR_EXES这个变量是不是空,而不是../../../
  30. #ifeq("$(DIR_EXES)","")

  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 -; \
  58.     $(RM) $(RMFLAGS) $@.tmp ; \
  59.     $(CC) --MM $(filter %.c,$^) > $@.tmp ; \
  60.     sed 's,\(.*\)\.o[ :]*,objs/\1.o $@: ,g' < $@.tmp > $@ ; \
  61.     $(RM) $(RMFLAGS) $@.tmp

  62. clean:
  63.     $(RM)    $(RMFLAGS) $(RMS)
另外还有一篇很好的文章:自己调试通过的一个通用makefile模板
http://blog.csdn.net/longyue0917/article/details/17548779