u-boot源码结构

Makefile:主目录中的Makefile是对整个工程的编译链接规则进行了描述,子目录中的Makefile主要是编译一些源文件并进行归档,生成一些静态库。

Mkconfig:Mkconfig是个脚本文件,负责对主目录中的Makefile进行配置的文件。创建一些符号链接,并在include目录下创建了两个文件:config.mk和config.h。

config.mk:包含了uboot运行的环境,定义了主目录和子目录Makefile通用的变量,包括体系结构、处理器和板子。

config.h:其中指明了板子相关的配置文件。

所有这些目录的编译链接都是由顶层目录的Makefile来确定的。

1、Makefile中定义了源码及生成的目标文件存放的目录,目标文件存放目录BUILD_DIR可以通过make O=dir 指定。如果没有指定,则设定为源码顶层目录。一般编译的时候不指定输出目录,则BUILD_DIR为 空。其它目录变量定义如下:

#OBJTREE和LNDIR为存放生成文件的目录,TOPDIR与SRCTREE为源码所在目录

OBJTREE := $(if $(BUILD_DIR), $(BUILD_DIR), $(CURDIR))

SRCTREE := $(CURDIR)

TOPDIR := $(SRCTREE)

LNDIR := $(OBJTREE)

export TOPDIR SRCTREE OBJTREE

2、定义变量MKCONFIG:这个变量指向一个脚本,即顶层目录的mkconfig。

MKCONFIG := $(SRCTREE)/mkconfig

export  MKCONFIG

3、包含include/config.mk,其实也就相当于在Makefile里定义了上面四个变量而已。

4、指定交叉编译器前缀

#set default to nothing for native builds

ifeq ($(HOSTARCH),$(ARCH))

CROSS_COMPILE ?=

endif


ifeq (arm,$(ARCH))        #这里根据ARCH变量,指定编译器前缀

CROSS_COMPILE ?=arm-cortex_a8-linux-guneabi-

endif

5、包含config.mk

#包含顶层目录下的config.mk,这个文件里面主要定义了交叉编译器及选项和编译规则

# load other configuration

include $(TOPDIR)/config.mk

下面分析config.mk的内容:

a、包含体系架构,开发板,CPU特定的规则文件:

ifdef ARCH            #指定预编译体系结构选项

sinclude $(TOPDIR)/$(ARCH)_config.mk           #include architecture dependend rules

endif

ifdef CPU              #定义编译时对齐,浮点等选项

sinclude $(TOPDIR)/cpu/$(CPU)/config.mk         #include CPU specific rules

endif

ifdef SOC            #没有这个文件

sinclude $(TOPDIR)/cpu/$(CPU)/config.mk         #include SoC specific rules

endif

ifdef BOARD      #指定特定板子的镜像连接时的内存基地址

sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk          #include board specific rules

endif


b、定义交叉编译链工具

#include the make variable (CC,etc....)

#

AS = $(CROSS_COMPILE)as

LD = $(CROSS_COMPILE)ld

CC = $(CROSS_COMPILE)gcc

cpp = $(CC) -E

AR = $(CROSS_COMPILE)ar

NM = $(CROSS_COMPILE)nm

STRIP = $(CROSS_COMPILE)strip

OBJCOPY = $(CROSS_COMPILE)objcopy

OBJDUMP = $(CROSS_COMPILE)objdump

RANLIB = $(CROSS_COMPILE)RANLIB


c、定义AR选项ARFLAGS,调试选项DBGFLAGS,优化选项OPTFLAGS,预处理选项CPPFLAGS,C编译选项CFLAGS,链接选项LDFLAGS

LDFLAGS += -Bstatic -T $(obj)u-boot.lds $(PLATFORM_LDFLAGS)

ifneq ($(TEXT_BASE),)

LDFLAGS += -Ttext $(TEXT_BASE)

endif                            #指定了起始地址TEXT_BASE


d、指定编译规则:

  $(obj)%.s: %.S
      $(CPP) $(AFLAGS) $(AFLAGS_$(@F)) $(AFLAGS_$(BCURDIR)) -o $@ $<
      $(obj)%.o: %.S
      $(CC)  $(AFLAGS) $(AFLAGS_$(@F)) $(AFLAGS_$(BCURDIR)) -o $@ $< -cldf
      $(obj)%.o: %.c
      $(CC)  $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c
      $(obj)%.i: %.c
      $(CPP) $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c
      $(obj)%.s: %.c
      $(CC)  $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c -S

回到顶层Makefile文件;


6、u-boot需要的目标文件

7、u-boot需要的库文件

8、最终生成的各种镜像文件

9、对于各子目录的Makefile文件,主要是生成*.o文件然后执行AR生成对应的库文件。如lib_generic文件夹下的Makefile:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值