Makefile depend规则

Posted 17岁boy想当攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile depend规则相关的知识,希望对你有一定的参考价值。

depend简称dep规则,是开发者们常用的一种规则方式,它不是Makefile标准,是由开发者们自己指定的,例如:clean。

dep规则是利用了Make文件比较功能,Make在编译时会检查规则依赖文件,如果依赖文件发生改动则编译依赖文件,例如:

dep: main.c main.h algo.h

main.c依赖于main.h和algo.h,在执行dep规则时make会去检查这三个文件中其中任意一个文件是否被修改,它们的修改日期是否发生了变动,例如main.h发生了修改,那么与main.h有依赖的文件都会被重新REBUILD一次。

但是如果文件过大的情况下,依赖文件过多的情况下会导致Makefile变得难以管理,这也是为什么会出现Cmake的原因,依赖文件过多会导致Makefile难以编写,所以我们可以动态生成,gnu的编译为我们提供了一个便利的选项,-M和-MM,例如在linux内核里你可以看到这样的写法:

ifeq (.depend,$(wildcard .depend))
include .depend
endif

depend dep:
        for i in init/*.c;do echo -n "init/";$(CPP) $(INCLUDE) -M $$i;done > .tmpdepend
        mv .tmpdepand .depend

gcc -M会将.c文件依赖的.h文件以Makefile的规则方式打印出来,例如:

gcc -M test.c

输出结果如下:

test.o: test.c /usr/include/stdc-predef.h /usr/include/stdio.h \\
 /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \\
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \\
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \\
 /usr/include/x86_64-linux-gnu/bits/long-double.h \\
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \\
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \\
 /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \\
 /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \\
 /usr/include/x86_64-linux-gnu/bits/types.h \\
 /usr/include/x86_64-linux-gnu/bits/timesize.h \\
 /usr/include/x86_64-linux-gnu/bits/typesizes.h \\
 /usr/include/x86_64-linux-gnu/bits/time64.h \\
 /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \\
 /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \\
 /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \\
 /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \\
 /usr/include/x86_64-linux-gnu/bits/types/FILE.h \\
 /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \\
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \\
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h

而linux内核里将-M的输出到.depend文件里去了,然后在利用Make的include命令包含进来,这样就实现了dep的功能,可以理解为增量编译功能

-M和-MM的区别是-MM不会将系统依赖文件包含进来

同时可以看到Makefile还有这样一段代码:

ifdef CONFIGURATION
..$(CONFIGURATION):
        @echo
        @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
        @echo
        $(MAKE) $(CONFIGURATION)
        @echo
        @echo "Successful. Try re-making (ignore the error that follows)"
        @echo
        exit 1

dummy: ..$(CONFIGURATION)

else

dummy:

endif

dummy规则是首要规则,即执行make不加任何目标的情况下默认执行的规则,它会去检查.depend文件是否存在,也就是你是否执行过dep去生成依赖文件,如果没有则执行dep规则,如果存在那么dummy规则什么都不会去做,因为在开头的include里已经包含了要编译的依赖文件选项

以上是关于Makefile depend规则的主要内容,如果未能解决你的问题,请参考以下文章

Makefile depend规则

makefile编写

Linux Makefile使用方法

Makefile总结

makefile学习之路——makefile简介

学习Makefile