make xxx_deconfig过程详解
- 1. 前言
- 2. 概述
- 3. build变量的定义
- 4. 目标%config的定义
- 4.1 依赖 scripts_basic
- 4.1.1 语句$(if $ (KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))
- 4.1.2 语句 $(if $ (KBUILD_MODULES),$(obj-m) $(modorder-target))*
- 4.1.3 $(subdir-ym)
- 4.1.4 $(always) 重点关注
- 4.1.4.1 src的定义
- 4.1.4.2 kbuild-dir的定义
- 4.1.4.3 kbuild-file的定义
- 4.1.4.4 又在Makefile.build中包含include scripts/Makefile.lib
- 4.2 依赖 outputmakefile
- 4.3 依赖 FORCE
- 4.4 规则 $ (Q)$(MAKE) $(build)=scripts/kconfig $@
- 5 总结
UBOOT版本:uboot2018.03,开发板myimx8mmek240 。2. 概述Ubootb编译第一步通常是执行make xxx_config,在编译指定顶层目录生成.config文件,这种方式要求厂商提供一个基础的xxx_config文件(通常来说开发者不会通过执行make menuconfig从零开始配置,这个工作过量太大了) 。本文接下来的章节主要解析这条指令背后主要做了什么 。我是用的开发板执行命令为:make myimx8mmek240-8mm-2g_defconfig
3. build变量的定义在scripts/Kbuild.include 中定义:
#### Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=# Usage:# $(Q)$(MAKE) $(build)=dirbuild := -f $(srctree)/scripts/Makefile.build obj
4. 目标%config的定义在顶层Makefile中定义:# We need some generic definitions (do not try to remake the file).scripts/Kbuild.include: ;include scripts/Kbuild.include//注意这个引用......config: scripts_basic outputmakefile FORCE $(Q)$(MAKE) $(build)=scripts/kconfig $@%config: scripts_basic outputmakefile FORCE $(Q)$(MAKE) $(build)=scripts/kconfig $@
4.1 依赖 scripts_basic(参考:linux内核Makefile中的变量build— 过渡篇(五))# 顶层Makefile# Basic helpers built in scripts/PHONY += scripts_basicscripts_basic: $(Q)$(MAKE) $(build)=scripts/basic $(Q)rm -f .tmp_quiet_recordmcount
展开变量build# 顶层Makefile# Basic helpers built in scripts/PHONY += scripts_basicscripts_basic: $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/basic $(Q)rm -f .tmp_quiet_recordmcount
make -f $(srctree)/scripts/Makefile.build obj=scripts/basic的解析如下:这是一种不指定目标的情况,由于未指定目标,这时会使用Makefile.build中的默认目标__build 。然后更进一步 , 会使用$(obj)/Makefile(scripts/basic/Makefile)中定义的变量来进行目标匹配 。
__build在Makefile.build中的构建规则为:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \$(subdir-ym) $(always) @:
4.1.1 语句$(if $ (KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))在顶层Makefile中,KBUILD_BUILTIN的定义如下:# note:顶层MakefileKBUILD_BUILTIN := 1export KBUILD_MODULES KBUILD_BUILTIN
该语句展开为:$(builtin-target) $(lib-target) $(extra-y)
(1)lib-target# note:顶层Makefileifneq ($(strip $(lib-y) $(lib-m) $(lib-)),) lib-target := $(obj)/lib.aendif
在此语句之前obj-y := ;obj-m := ;obj-未定义 。因此lib-target为空 。(2)builtin-target ???????
# note:顶层Makefileifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),) builtin-target := $(obj)/built-in.oendif
在此语句之前obj-y := ; obj-m := ;obj-未定义 ; subdir-m := ;并且在所包含的文件中也没有给这些变量增加值 。lib-target 为空 。因此builtin-target为空 。(3)extra-y未定义 综上:语句$(if $ (KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))为空 。
4.1.2 语句 $(if $ (KBUILD_MODULES),$(obj-m) $(modorder-target))*在顶层Makefile中,KBUILD_BUILTIN的定义如下:
# note:顶层MakefileKBUILD_MODULES :=
综上:语句$(if $ (KBUILD_MODULES),$(obj-m) $(modorder-target))为空 。4.1.3 $(subdir-ym)在scripts/Makefile.lib中,subdir-ym的定义如下:
# note:scripts/Makefile.lib# Subdirectories we need to descend intosubdir-ym := $(sort $(subdir-y) $(subdir-m))......subdir-ym := $(addprefix $(obj)/,$(subdir-ym))
subdir-y与subdir-m都为空 。综上:语句$(subdir-ym)为空 。4.1.4 $(always) 重点关注在scripts/Makefile.build有如下定义
# note:scripts/Makefile.build# The filename Kbuild has precedence over Makefilekbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)include $(kbuild-file)
4.1.4.1 src的定义【一 UBOOT编译--- make xxx_deconfig过程详解】
推荐阅读
- Ubuntu安装Docker及镜像加速器
- HYTHIOL-C PLUS白兔牌美白丸 吃了一个月后的反馈
- 十一 前后端分离项目:实现"删"功能(前后端)
- 七 pod:静态pod
- 夯实Java基础,一篇文章全解析线程问题
- 天猫童装店铺销量排行榜前十,巴拉巴拉童装销量第一
- 红魔6SPro参数配置_参数详情
- 电脑玩游戏很卡,根本带不动怎么办(电脑玩游戏玩一会就卡怎么办)
- 玩游戏卡怎么办(一招恢复手机卡顿)
- 怎么画羊简笔画四年级(画一个最简单的羊)