您的位置:首页 > 其它

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

2013-07-18 09:09 218 查看
想实现效果:

在专题(二)的基础上实现:创建每个源文件的依赖关系文件 ,即:.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



obj/tools/test_tool_2.d



这儿的 .d 文件中的 .o 都是没有添加路径的,在触发 .c 文件的重编译后 make 怎么去发现这个 .o 文件在哪个路径下呢,不解,求高手。。。。

当 make 完毕后,项目及其依赖没有任何变动,run make 命令效果如下所示:



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





vim src/include/test_tool_2.h, 修改源代码,然后 make,效果如下:





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

















这个着实令我吃惊了,上面向源文件 src/include/test_tool_2.h 添加了无关、无用的代码 make 并没有触发任何 .c 文件的重编译, 这个也可以辨识出来。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: