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依赖于bareboxFORCE

 

# 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下增加相应的语句。

    上面是对MakefileKconfig的简要分析。

posted @ 2012-11-18 16:44  莫回头  阅读(871)  评论(0编辑  收藏  举报