Android 编译系统 defconfig文件的确定
背景
经常在驱动改动的时候,同时改动2个文件,才知道他们分别对应不同的编译结果。
路径 | 对应版本 |
---|---|
kernel/msm-4.4/arch/arm64/configs/sdm660_defconfig |
debug版本 |
kernel/msm-4.4/arch/arm64/configs/sdm660-perf_defconfig |
user 版本 |
解析
1)命令执行追溯
source build/envsetup.sh
执行envsetup.sh
脚本,把(TARGET_DEVICE)/BoardConfig.mk
包含了进来:
function gettop () {
local TOPFILE=build/core/envsetup.mk
# ...
}
build/core/envsetup.mk:
board_config_mk := \
$(strip $(sort $(wildcard \
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
$(shell test -d device && find -L device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
$(shell test -d vendor && find -L vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
)))
BoardConfig.mk中有如下内容:
ifeq ($(KERNEL_DEFCONFIG),) # 如果make命令中未指定KERNEL_DEFCONFIG的值,则在此处指定它的值
ifeq ($(TARGET_BUILD_VARIANT),user)
KERNEL_DEFCONFIG := msm8909-1gb-perf_defconfig
else
KERNEL_DEFCONFIG := msm8909-1gb_defconfig
endif
endif
include kernel/AndroidKernel.mk
2)查看Kernel/AndroidKernel.mk
KERNEL_HEADER_DEFCONFIG := $(strip$(KERNEL_HEADER_DEFCONFIG))
ifeq ($(KERNEL_HEADER_DEFCONFIG),)
KERNEL_HEADER_DEFCONFIG:= $(KERNEL_DEFCONFIG)
endif
KERNEL_OUT :=$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ
KERNEL_CONFIG :=$(KERNEL_OUT)/.config #----目标文件
$(KERNEL_CONFIG): $(KERNEL_OUT)
$(MAKE) -C kernel O=../$(KERNEL_OUT)ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG)
$(hide) if [ ! -z"$(KERNEL_CONFIG_OVERRIDE)" ]; then /
echo "Overridingkernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; /
echo$(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; /
$(MAKE) -C kernelO=../$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE)oldconfig; fi
3)kernel/scripts/kconfig/Makefile
%_defconfig: $(obj)/conf
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
在编译内核时执行上述命令生成.config文件,该命令展开后如下所示:
scripts/kconfig/conf --defconfig=arch/arm64/configs/.msmxxx_defconfig Kconfig
其中.msmxxx_defconfig
的值就是KERNEL_DEFCONFIG
的值