comma:= ,dot-target = $(dir $@).$(notdir $@)//scripts/basic/.fixdepdepfile = $(subst $(comma),_,$(dot-target).d)//scripts/basic/.fixdep.dhostc_flags=-Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
综上cmd_host-csingle = cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/fixdep scripts/basic/fixdep.c所以echo-cmd 的作用是打印quiet_cmd_host-csingle(HOSTCC $ @ )或者cmd_host-csingle(根据顶层MakefileV值决定),$ (cmd_$(1))即为执行cmd_host-csingle生成fixdep同时生成fixdep的依赖文件.fixdep.d
(2.3) scripts/basic/fixdep $(depfile) $@ ’ $(make-cmd)’ > $(dot-target).tmp 等价于:scripts/basic/fixdep scripts/basic/.fixdep.d scripts/basic/fixdep ‘cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/fixdep scripts/basic/fixdep.c’ > scripts/basic/.fixdep.tmp
(2.4) rm -f $(depfile) 删除scripts/basic/.fixdep.d
(2.5) mv -f $(dot-target).tmp $(dot-target).cmd) 将scripts/basic/.fixdep.tmp重命名为scripts/basic/.fixdep.cmd
总结:生成scripts/basic/fixdep的过程中会先打印cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/fixdep scripts/basic/fixdep.c同时执行该语句生成fixdep,再用fixdep生成.fixdep.cmd
4.2 依赖 outputmakefile
# 顶层Makefile# outputmakefile generates a Makefile in the output directory, if using a# separate output directory. This allows convenient use of make in the# output directory.outputmakefile:ifneq ($(KBUILD_SRC),) $(Q)ln -fsn $(srctree) source $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)endif
上面批注已经说的很清楚了,outputmakefile 在输出目录中生成一个 Makefile,如果使用单独的输出目录 。这允许在输出目录中方便地使用 make 。当KBUILD_SRC不为空时,才会编译到这里 。4.3 依赖 FORCE
# 顶层MakefilePHONY += FORCEFORCE:
实际上它是一个伪目标,从上面看到,FORCE 既没有依赖的规则,其底下也没有可执行的命令 。如果一个规则没有命令或者依赖,而且它的目标不是一个存在的文件名,在执行此规则时,目标总会被认为是最新的 。也就是说,这个规则一旦被执行,make 就认为它所表示的目标已经被更新过 。当将这样的目标(FORCE)作为一个规则的依赖时(如上),由于依赖总被认为是被更新过的,所以作为依赖所在的规则定义的命令总会被执行 。4.4 规则 $ (Q)$(MAKE) $(build)=scripts/kconfig $@等价于:make -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig myimx8mmek240-8mm-2g_defconfig
在scripts/kconfig/Makefile中(至于为什么会引用scripts/kconfig/Makefile,参见4.1小节)
# note:scripts/kconfig/Makefileifdef KBUILD_KCONFIGKconfig := $(KBUILD_KCONFIG)elseKconfig := Kconfigendif%_defconfig: $(obj)/conf $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) //$< = $(obj)/conf# Added for U-Boot (backward compatibility)%_config: %_defconfig @:
编译的流程为: (1)先编译scripts/kconfig/conf可执行文件; (2)再执行scripts/kconfig/conf --defconfig=arch/…/configs/myimx8mmek240-8mm-2g_defconfig Kconfig语句编译打印如下
make -f ./scripts/Makefile.build obj=scripts/kconfig myimx8mmek240-8mm-2g_defconfigcc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer-I/usr/include/ncursesw -DCURSES_LOC="<curses.h>"-DNCURSES_WIDECHAR=1 -DLOCALE-c -o scripts/kconfig/conf.o scripts/kconfig/conf.ccat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.ccat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.ccat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.ccc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer-I/usr/include/ncursesw -DCURSES_LOC="<curses.h>"-DNCURSES_WIDECHAR=1 -DLOCALE-Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.ccc-o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.oscripts/kconfig/conf--defconfig=arch/../configs/myimx8mmek240-8mm-2g_defconfig Kconfig## configuration written to .config#
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Ubuntu安装Docker及镜像加速器
- 2023年1月29日拆房好不好 2023年1月29日拆房吉日一览表
- 2023年1月29日搬新家吉日一览表 2023年1月29日是搬新家吉日吗
- 2023年1月29日拆迁吉日一览表 2023年农历正月初八宜拆迁吗
- 2023年农历正月初八宜乔迁吗 2023年1月29日乔迁吉日一览表
- 精选600个 唐姓女孩名字2023年属兔
- 取一个寓意好的名字 2023年女宝宝名字库300个
- 水果店名字独一无二 大气的水果店名字
- 丁火男喜欢一个人的表现 疼爱有加情投意合
- 适合文科内向男孩的专业有什么 学什么专业有前途