如何确定本次编译的deconfig文件

Posted

tags:

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

参考技术A 之前我们知道deconfig里会定义某个config变量是y还是n,但是kernel里有很多deconfig文件,系统编译的时候到底用的是哪个呢,我们来看一下:

编译的命令如下:

. build/envsetup.sh

lunch

8. msm8937_evb-userdebug

./mkimage msm8937_evb boot_image

首先在envsetup.sh

command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1) //这里也是线索

function gettop

local TOPFILE=build/core/envsetup.mk //这里就是线索
......


然后看config.mk

include $(BUILD_SYSTEM)/envsetup.mk //这里是确定引用的

所以看envsetup.mk

board_config_mk := \
$(strip $(wildcard \
$(SRC_TARGET_DI www.hbbz08.com R)/board/$(TARGET_DEVICE)/BoardConfig.mk \
$(shell test -d device && find device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
$(shell test -d vendor && find vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
)) //获取到对应的BoardConfig.mk文件

TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) //获取对应的路径

matthew@matthew:/media/matt2/8937-evb-1/build/target/board$ grep -r "TARGET_DEVICE_DIR" ./
./android.mk:-include $(TARGET_DEVICE_DIR)/AndroidBoard.mk //加载对应的AndroidBoard.mk

然后到对应的/device/asus/msm8937_evb/里的AndroidBoard.mk

如下:

-include device/qcom/msm8937_64/AndroidBoard.mk
LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_BUILD_VARIANT),user)
KERNEL_DEFCONFIG := msm8937-perf_defconfig
else
KERNEL_DEFCONFIG := msm8937_defconfig //最后用的是这个deconfig文件
endif

defconfig .config kconfig 与makefile和make menuconfig流程

1.deconfig 文件:

一般由平台厂商提供,内核编译用做.config的参考,注意:如果,缺少该文件,无法进行编译。

文件位于:/kernel/../arch/arm/configs/xxx_defconfig

2.kconfig 

分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。

3.makefile

布在各个目录下,用于集成编译。

4.config 文件

在内核编译时,主Makefile调用这个.config,用于或者用于的内核编译配置。当我们在内核源码目录下输入make menuconfig时,在出现的菜单界面中选择一项时,它会自动更新.config相应项的值。如果我们没有选择,则会在.config问下插入一行注释(# CONFIG_TOUCHSCREEN_GT9xx is not set)

文件位于 :kernel/.../out/xxx_defconfig/.config

defconfig----->.config  (第二步)

kconfig------->.config---------->makefile(第三步

make menuconfig流程

当我们在执行make menuconfig这个命令时,系统到底帮我们做了哪些工作呢?

这里面一共涉及到了一下几个文件我们来一一讲解

Linux内核根目录下的scripts文件夹

arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件

Linux内核根目录下的makefile文件、各层目录下的makefile文件

Linux内核根目录下的的.config文件、arm/$ARCH/下的config文件

Linux内核根目录下的 include/generated/autoconf.h文件

1)scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容

2)当我们执行make menuconfig命令出现上述蓝色配置界面以前,系统帮我们做了以下工作:

    首先系统会读取arch/$ARCH/目录下的Kconfig文件生成整个配置界面选项(Kconfig是整个linux配置机制的核心),那么ARCH环境变量的值等于多少呢?

它是由linux内核根目录下的makefile文件决定的,在makefile下有此环境变量的定义:

或者通过 make ARCH=arm menuconfig命令来生成配置界面,默认生成的界面是所有参数都是没有值的

    比如教务处进行考试,考试科数可能有外语、语文、数学等科,这里相当于我们选择了arm科可进行考试,系统就会读取arm/arm/kconfig文件生成配置选项(选择了arm科的卷子),系统还提供了x86科、milps科等10几门功课的考试题

3)假设教务处比较“仁慈”,为了怕某些同学做不错试题,还给我们准备了一份参考答案(默认配置选项),存放在arch/$ARCH/configs下,对于arm科来说就是arch/arm/configs文件夹:

    此文件夹中有许多选项,系统会读取哪个呢?内核默认会读取linux内核根目录下.config文件作为内核的默认选项(试题的参考答案),我们一般会根据开发板的类型从中选取一个与我们开发板最接近的系列到Linux内核根目录下(选择一个最接近的参考答案)

#cp arch/arm/configs/s3c2410_defconfig .config

4).config

    假设教务处留了一个心眼,他提供的参考答案并不完全正确(.config文件与我们的板子并不是完全匹配),这时我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项

    但是一般我们不采取这个方案,我们选择在配置界面中通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可.
 

以上是关于如何确定本次编译的deconfig文件的主要内容,如果未能解决你的问题,请参考以下文章

defconfig .config kconfig 与makefile和make menuconfig流程

第3阶段——内核启动分析之make menuconfig内核配置

如何确定可执行文件是为哪个平台编译的?

如何确定我的 lambda 函数在编译过程中是不是已“预置”?

如何开发编译部署调用智能合约

-llibrary 如何确定和定位对象文件名