GNU Makefile学习专题(三) | 第三个实例

  • 想实现效果:
    • 在专题(二)的基础上实现:创建每个源文件的依赖关系文件 ,即:.d 文件,从而让 Makefile 聪明地自动发觉什么时候该编译那些文件,而不是每次都编译所有
    • 专题(二)都实现了那些效果,见这儿:点击这儿
  • 简单的源码结构还是和专题(一)中相同,见这儿:点击这儿
  • 直接贴 Makefile 的源码,比专题(二)增加的不多,更新依赖文件那4行代码直接源自于 GNU Make 官方文档(稍加修改),常用函数以及一些知识点的总结见下一篇专题:
    • CC              = gcc
      CFLAGS          = -Wall
      LDFLAGS         = -lm
      INCLUDES        = -I src/include
      
      SRC_DIR         = src/main src/tools
      
      OBJ_DIR         = obj
      OBJ_PATH        = $(addprefix $(OBJ_DIR)/, $(subst src/,, $(SRC_DIR)))
      
      SRC_FILES       = $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c))
      
      OBJS            = $(subst src,obj, $(SRC_FILES:%.c=%.o))
      
      DEPS            = $(OBJS:%.o=%.d)
      
      MAKE_OBJ_DIR    := $(shell mkdir -p $(OBJ_PATH))
      
      EXECUTABLE      = test_makefile
      
      all             : $(EXECUTABLE)
      
      $(EXECUTABLE)   : $(OBJS)
              $(CC) $(LDFLAGS) $(INCLUDES) $(OBJS) -o $(EXECUTABLE)
      
      $(OBJS)         : $(SRC_FILES)
              $(CC) $(CFLAGS) $(INCLUDES) -c $(subst obj,src, $(patsubst %.o,%.c, $@)) -o $@
      
      $(DEPS)         : $(SRC_FILES)
              set -e; rm -f $@; \
              $(CC) -M $(CFLAGS) $(INCLUDES) $(subst obj,src, $(patsubst %.d,%.c,$@)) > $@.$$$$; \
              sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
              rm -f $@.$$$$
      
      -include $(DEPS)
      
      clean           :
              -rm -rf ./obj
              -rm -rf $(EXECUTABLE)
  • 生成的几个 .d 文件如下所示:
    • obj/main/main.d

    • obj/tools/test_tool_1.d
      • GNU Makefile学习专题(三) | 第三个实例_第1张图片
    • obj/tools/test_tool_2.d
      • GNU Makefile学习专题(三) | 第三个实例_第2张图片
    • 这儿的 .d 文件中的 .o 都是没有添加路径的,在触发 .c 文件的重编译后 make 怎么去发现这个 .o 文件在哪个路径下呢,不解,求高手。。。。
  • 当 make 完毕后,项目及其依赖没有任何变动,run make 命令效果如下所示:

  • vim src/include/test_tool_2.h, 添加注释,然后 make,效果如下:


  • vim src/include/test_tool_2.h, 修改源代码,然后 make,效果如下:
    • GNU Makefile学习专题(三) | 第三个实例_第3张图片

  • vim src/main/main.c,修改源代码,然后 make,效果如下:


  • 惊讶惊讶惊讶惊讶惊讶惊讶
  • 这个着实令我吃惊了,上面向源文件 src/include/test_tool_2.h 添加了无关、无用的代码 make 并没有触发任何 .c 文件的重编译, 这个也可以辨识出来。。。。。。

你可能感兴趣的:(makefile,自动触发选择编译)