Barebox分析
以前看程序的时候没有仔细看过Kconfig文件,这次分析barebox的时候仔细看了下,我们首先看根目录下的Kconfig文件:
config SRCARCH
string
option env="SRCARCH"
source "arch/$SRCARCH/Kconfig"
里面配置了构架,然后就调用构架下面的Kconfig文件了。
此处变量SRCARCH的值是在根目录下的Makefile中定义的,里面有一句话
SRCARCH := $(ARCH)
所以当我们在对barebox进行具体配置前,先设置两个变量。
1. export ARCH=arm
2. export CROSS_COMPILE=arm-linux-
这两个变量可以这么配置,也可以在Makefile中修改,在166行有
ARCH ?= sandbox
CROSS_COMPILE ?=
修改成
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
修改完后就可以进行make menuconfig了,当然为了配置方便,我们一般都是使用一些提供的默认配置,在此基础上进行修改,配置文件是在/arch/$(ARCH)/configs/下面
我们使用make XXX_defconfig命令,在此基础上进行再次配置。
我们接着去看source "arch/$SRCARCH/Kconfig"下面的Kconfig文件,此处SRCARCH=arm,所以去看arch/ arm /Kconfig下的文件
config BOARD_LINKER_SCRIPT
bool
default n
config GENERIC_LINKER_SCRIPT
bool
default y
depends on !BOARD_LINKER_SCRIPT
以上是刚开始的两个选项,从中我们可以看到有两个配置选项,
BOARD_LINKER_SCRIPT 是否有板子的链接脚本,默认是no
GENERIC_LINKER_SCRIPT默认的链接脚本,依赖于BOARD_LINKER_SCRIPT,当没选时才会有,默认是yes
在下面是
menu "System Type "
config ARCH_S3C24xx
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"
select ARCH_SAMSUNG
select CPU_ARM920T
select GENERIC_GPIO
endchoice
以上只是菜单System Type中关于arm的一部分,接下去
source arch/arm/cpu/Kconfig
source arch/arm/mach-at91/Kconfig
source arch/arm/mach-ep93xx/Kconfig
source arch/arm/mach-imx/Kconfig
source arch/arm/mach-mxs/Kconfig
source arch/arm/mach-netx/Kconfig
source arch/arm/mach-nomadik/Kconfig
source arch/arm/mach-omap/Kconfig
source arch/arm/mach-pxa/Kconfig
source arch/arm/mach-samsung/Kconfig
source arch/arm/mach-versatile/Kconfig
是一些列的Kconfig文件,分别arm构架下不同分支的Kconfig文件
menu "Arm specific settings
。。。。
end menu
source common/Kconfig
source commands/Kconfig
source net/Kconfig
source drivers/Kconfig
source fs/Kconfig
source lib/Kconfig
source crypto/Kconfig
从这个文件中我们基本上可以明白整个barebox的代码分布了。Kconfig文件中的选项在配置后会被以CONFIG_XXXX的形式写到根目录下的.config文件中。
分析完Kconfig文件后,我们查看Makefile文件,首先看根目录下的Makefile文件
文件中包含了对应ARCH下的Makefile文件
include $(srctree)/arch/$(ARCH)/Makefile
搜索根目录下的Makefile文件中的all,
all: barebox.bin
include $(srctree)/arch/$(ARCH)/Makefile
barebox.bin: barebox FORCE
$(call if_changed,objcopy)
$(call cmd,check_file_size,$(CONFIG_BAREBOX_MAX_IMAGE_SIZE))
上面意思是barebox.bin依赖于barebox和FORCE
# barebox image
barebox:$(barebox-lds)$(barebox-head)$(barebox-common)$(kallsyms.o) FORCE
$(call barebox-modpost)
$(call if_changed_rule,barebox__)
$(Q)rm -f .old_version
common-y := common/ drivers/ commands/ lib/ crypto/ net/ fs/
common-y := $(patsubst %/, %/built-in.o, $(common-y))
上面的语句意思是将common-y替换成
common-y := common/ built-in.o %/built-in.o
# barebox is built from the objects selected by $(barebox-init) and
# $(barebox-main). Most are built-in.o files from top-level directories
# in the kernel tree, others are specified in arch/$(ARCH)Makefile.
# Ordering when linking is important, and $(barebox-init) must be first.
Barebox从$(barebox-init) 和 $(barebox-main)两部分编译成,其中built-in.o从顶层目录下的文件下的built-in.o构成,另外的则由arch/$(ARCH)Makefile指明。
barebox.bin à barebox
à$(barebox-lds)à$(lds-y)
à$(barebox-head)
à$(barebox-common)
à$(kallsyms.o)
在arch/arm目录下的Makefile文件中,有两句话
lds-$(CONFIG_GENERIC_LINKER_SCRIPT):= arch/arm/lib/barebox.lds
lds-$(CONFIG_BOARD_LINKER_SCRIPT) := $(BOARD)/barebox.lds
配置完后,在根目录下的.config文件中
# CONFIG_BOARD_LINKER_SCRIPT is not set
CONFIG_GENERIC_LINKER_SCRIPT=y
所以脚本文件是依赖于arch/arm/lib/barebox.lds文件
Makefile中会创建几个文件,为编译准备
define create-symlink
if [ ! -L include/asm ]; then \
echo ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \
if [ ! -d include/asm-$(SRCARCH) ]; then \
mkdir -p include/asm-$(SRCARCH); \
fi; \
ln -fsn asm-$(SRCARCH) $@; \
fi
endef
以下两个都是创建的文件
include/asm:
$(Q)$(check-symlink)
$(Q)$(create-symlink)
include/config.h: include/config/auto.conf
@echo ' SYMLINK $@ -> $(BOARD)/config.h'
ifneq ($(KBUILD_SRC),)
$(Q)ln -fsn $(srctree)/$(BOARD)/config.h $@
else
@ln -fsn ../$(BOARD)/config.h $@
Endif
创建include/asm软连接到include/asm-arm
创建include/config.h软链接到$(BOARD)/config.h下
BOARD := arch/arm/boards/$(board-y)/
由上面这句话可知当我们需要增加自己板子的时候,需要在对应构架的Makefile下增加相应的语句。
上面是对Makefile和Kconfig的简要分析。