-
学习资料
本文主要参考资料:驾驭Makefile(李云).pdf
-
Complicated项目
需求:
(1)object文件放到objs目录下
(2)可执行文件放到exes目录下
(3)增加头文件依赖
-
自动生成依赖关系
(1)先用编译器为每一个源文件的自动生成的依赖关系放到一个文件(***.dep)中
gcc的-M和-MM选项
gcc -M foo.c //-M选项会列出对系统头文件的依赖关系 gcc -MM foo.c //-MM选项不会列出对系统头文件的依赖关系
(2)写出 .c 文件和 .dep 文件的依赖关系,并让make自动更新或生成 .dep 文件
foo.dep: foo.c //foo.d依赖foo.c生成 gcc -MM foo.c
最终生成的依赖关系:foo.o: foo.c foo.h,存放在foo.d文件中
(3)对编译器生成的依赖关系文件,进行加工处理
sed 's,($*).o[ :]*,objs/1.o $@ : ,g' < $@.$$$$ >; $@;
这个语句实现将foo.o: foo.c foo.h,更改为objs/foo.o deps/foo.dep: foo.c foo.h
增加了存放目录,以及把deps/foo.dep加入让依赖关系文件也能动态更新。
(4)实现代码
$(DIR_DEPS)/%.dep: $(DIR_DEPS) %.c @echo "Making $@ ..." @set -e; $(RM) $(RMFLAGS) $@.tmp; $(CC) -E -MM $(filter %.c, $^) > $@.tmp; sed 's,($*).o[ :]*,objs/1.o $@ : ,g' < $@.tmp >; $@; $(RM) $(RMFLAGS) $@.tmp;
(5)include相关依赖关系文件
注:有原文章,这里有死循环问题,具体参考:https://blog.csdn.net/mantis_1984/article/details/72598848。
其余目录依赖也有相关问题,可用同样方法解决。
-
条件语法
ifdef variable-name
ifndef variable-name
有没有定义过某个变量
ifeq (arg1, arg2) ifeq 'arg1' 'arg2' ifeq "arg1" "arg2" ifeq 'arg1' "arg2" ifeq "arg1" 'arg2'
是否相等或不等