文章目录
- make V=1
- 1. 加载 -include 声明的文件
make V=1
1. 加载 -include 声明的文件
# 顶层 Makefile 270 KCONFIG_CONFIG ?= .config ...... 580 -include include/config/auto.conf 584 -include include/config/auto.conf.cmd ...... 587 $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; ...... 593 include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd 594 $(Q)$(MAKE) -f $(srctree)/Makefile syncconfig 595 @# If the following part fails, include/config/auto.conf should be 596 @# deleted so "make silentoldconfig" will be re-run on the next build. 597 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.autoconf || \ 598 { rm -f include/config/auto.conf; false; } 599 @# include/config.h has been updated after "make silentoldconfig". 600 @# We need to touch include/config/auto.conf so it gets newer 601 @# than include/config.h. 602 @# Otherwise, 'make silentoldconfig' would be invoked twice. 603 $(Q)touch include/config/auto.conf ...... 608 -include include/autoconf.mk 609 -include include/autoconf.mk.dep
-include:表示在加载的时候会先去查找文件是否存在,
如果存在
,则读入且查看是否有规则对文件中的内容进行更新,如果有,那么等更新完再加载。如果没有相应的更新规则,那么直接加载进来;如果不存在
,会出现一个警告,但并不会直接退出,而是等完成makefile所有文件的读取之后,再试图用规则进行新建文件,如果没有规则新建这个文件,则直接报错,退出程序。
580-584行:尝试包含 auto.conf 和 auto.conf.cmd 这两个文件。
608-609行:尝试包含 autoconf.mk 和 autoconf.mk.dep 这两个文件。
由于使用 -include 进行声明,所以即使这四个文件不存在也不会报错退出。此时这四个文件都不存在,会出现警告但是不会直接退出,等完成 Makefile 读取所有文件后再试图用规则去新建这四个文件。完成 Makefile 读取所有文件,此时试图用规则去新建这四个文件。
593行:有第一个文件auto.conf
的新建规则,优先执行。593行:目标
include/config/%.conf
依赖$(KCONFIG_CONFIG)
和include/config/auto.conf.cmd
这两个依赖在587行中有新建规则:这两个目标没有依赖,也没有生成它的规则命令,所以可想 GNU Make 本身无法生成 auto.conf.cmd 的。 然后该条语句后面的一个分号表明,这两个目标被强制是最新的。由步骤3可知,目标
include/config/%.conf
的两个依赖强制最新,接下来执行目标的生成语句即可。