关于uboot Makefile的总体理解(x210开发板Makefile为例)

原创作品,如需转载请联系作者

一、关于uboot Makefile总体结构

首先主Makefile主要做了哪些事情(除去包含的其它Makefile)?

①根据是否进行单独文件输出,来定义目录结构;

②定义了交叉编译工具链的头(移植的时候要注意修改)

③定义了伪目标 x210_sd_config 这个伪目标是配置时使用的(移植的时候要注意修改),代码如下:

#x210_sd_config : unconfig
#@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
#@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

④ 定义了清除编译的伪目标 distclean ,如果我们要清除编译产生的文件的时候可以通过使用make distclean 来清除。

⑤定义了 主make ,也就是u-boot.bin ,有一系列规则,最终生成uboot.bin 

还有一些其它的...

另外一共还引入了2个Makefile,分别为 include $(obj)include/config.mk   和  include $(TOPDIR)/config.mk 下面分别解释下这两个Makefile

1、include $(obj)include/config.mk  

这个Makefile  这个文件位于 /include/config.mk ; 这个文件是在执行 make x210_sd_config配置的过程中调用/mkconfig shell脚本实现的,实现过程是通过向shell脚本传参

来确定下面几个参数  ARCH(硬件的架构,例如arm),CPU(CPU的系列型号,例如s5pc11x),BOARD(开发板的型号,例如x210),VENDOR(SOC的厂商,例如samsung),SOC(具体SOC的型号,例如s5pc110)。 在x210开发板中,这个文件经过配置以后得到的内容如下:

#ARCH   = arm
#CPU    = s5pc11x
#BOARD  = x210
#VENDOR = samsung
#SOC    = s5pc110

这些变量会影响到Makefile在执行的时候目录的寻找和编译导向,我们在将我们文件放在什么目录下,完全又这个指示。例如我们在/cpu/s5pc11x这个目录下放置了一些文件,这些文件Makefile是怎么找到的呢?就是通过我们这里定义的CPU    = s5pc11x  ,所以在项目移植的时候这里要注意修改;怎么修改呢?在主Makefile中配置的那部分,传参中修改。


2、include $(TOPDIR)/config.mk 

这个Makefile是根目录下的主配置Makefile,这个Makefile是uboot与生俱来的。这里面主要做了重新定义一系列变量来重新命名交叉编译工具链,指定了链接脚本,定义了一些编译连接的一些参数,定义了编译规则等等;这个Makefile中还引入了5个Makefile,下面分别介绍这5个Makefile


(1)$(OBJTREE)/include/autoconf.mk  

这个Makefile,是经过配置后才生成的,生成过程是在配置过程的时候执行 make x210_sd_config ,在执行这个的时候会通过一些操作来读取 uboot\include\configs \x210_sd.h中的宏定义,然后经过抽取,生成了autoconf.mk  ,其实抽取的时候并不知道这个头文件的位置和名字,而是知道 $(obj)include/config.h  ,但是在这个config.h中里面包含了这个uboot\include\configs \x210_sd.h 头文件,那进一步来讲,这个头文件x210_sd.h是怎么写入到

$(obj)include/config.h 当中去的呢,是用mkconfig链接脚本,链接脚本把$1这个名字加上.h就确定了这个头文件,代码如下:

#echo "#include <configs/$1.h>" >>config.h  

那再进一步讲呢,$1是什么鸟呢?

根据分析配置的这段代码:

#x210_sd_config : unconfig
#@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110 ①
#@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk②

可以从①中看出$1这个参数实际上就是我们定义的这个配置的伪目标x210_sd_config 截取掉 _config 剩余的部分x210_sd,至此我们就知道

$(OBJTREE)/includ e/autoconf.mk  这个Makefile的来龙去脉了!!

所以说这个Makefile完全取决于我们的配置头文件 x210_sd.h的配置,所以说这个头文件我们在移植的时候是关键。在x210开发板中这个 autoconf.mk的部 分内容如下:


#CONFIG_CMD_FAT=y
#CONFIG_USB_OHCI=y
#CONFIG_SYS_CLK_FREQ=24000000
#CONFIG_CMD_ITEST=y
#CONFIG_S3C_HSMMC=y
#CONFIG_DISPLAY_BOARDINFO=y

..............

这些内容主要是指导Makefile在编译链接的时候的一些处理,其实这些内容只是用了很小的一部分,例如在include $(TOPDIR)/config.mk 这个Makefile中确定的 链接脚本的时候就这么使用了:

ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds #不执行这个
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds #链接脚本确定了!!!!非常重要,最终连接的时候就用这个脚本
endif

由于这个文件是由uboot\include\configs \x210_sd.h 这个配置头文件决定的,所以在移植的时候只需要修改这个头文件就可以。


(2)$(TOPDIR)/$(ARCH)_config.mk

这个Makefile主要定义了和硬件架构相关的编译规则,也就是编译器的参数,不是我们研究重点。


(3)$(TOPDIR)/cpu/$(CPU)/config.mk

这个Makefile主要定义了和CPU相关的编译规则,也就是编译器的参数,不是我们研究重点。


(4)sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk

这个Makefile没有找到,因为使用的是sinclude ,即使没有找到,只要是不影响整个编译过程的话,就不会有错误或者警告提示;如果这个Makefile存在的

话,应该是和SOC相关的一些编译规则,也就是编译器的参数,也不是我们研究的重点。


(5)$(TOPDIR)/board/$(BOARDDIR)/config.mk

这个Makefile主要是确定了链接时的链接地址,也就是整个uboot的链接地址,这个Makefile在 make x210_sd_config 配置的过程中,通过这么一句话:

#@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk ,将它写入到了这个Makefile中。这个Makefile内容如下:

# TEXT_BASE = 0xc3e00000

                这个Makefile中就这个一句话,只是定义了一个变量TEXT_BASE,并将连接地址赋值给它。因为这个Makefile中的内容来自于在 make x210_sd_config 配置过 过程,所以移植的时候只需要,在配置的部分修改#@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk这个代码即可。

总结一下include $(TOPDIR)/config.mk  下面包含的一些Makefile,一共有5个,有3个是和编译相关的一些参数,我们不做 研究。另外两个分别是

(1)$(OBJTREE)/include/autoconf.mk   和(5)$(TOPDIR)/board/$(BOARDDIR)/config.mk





二、移植时需要注意的一些地方

(1)交叉编译工具链的位置及名称,这段代码在主Makefile中 ,x210中uboot的主Makefile柱部分如下:

CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-  

我们要确保我们的交叉编译工具链也在这个位置,而且使用的也是这个交叉编译工具链,如果不是请做修改。


(2) 配置伪目标的生成部分代码:

#x210_sd_config : unconfig
#@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110 ①
#@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk②

①首先这里的MKCONFIG这个变量的内容其实就是uboot/mkconfig 的这个链接脚本,后面跟的5个参数分别确定了 ARCH(硬件的架构,例如arm),CPU(CPU的系列型号,例如s5pc11x),BOARD(开发板的型号,例如x210),VENDOR(SOC的厂商,例如samsung),SOC(具体SOC的型号,例如s5pc110),这些变量会影响到Makefile在执行的时候目录的寻找和编译导向,我们在将我们文件放在什么目录下,完全由这个指示。例如我们在/cpu/s5pc11x这个目录下放置了一些文件,这些文件Makefile是怎么找到的呢?就是通过我们这里定义的CPU    = s5pc11x  ,所以在项目移植的时候这里要注意修改;怎么修改呢?在主Makefile中配置的那部分,传参中修改。所以在移植自己的开发板的时候要记得修改这里,并把对应的源文件和头文件等,都放在这里,其实这些内容最终被写入到include $(obj)include/config.mk  这个Makefile,然后最后又主Makefile调用,来确定目录的依赖关系等,上面分析的时候有详细解释。

②这里的TEXT_BASE 决定了我们链接的时候的地址,也就是uboot在重定位之后在DDR中运行的位置。这个数值要根据uboot的实际运行位置决定,移植的时候要注意修改,其实这句代码被写入到了 $(obj)board/samsung/x210/config.mk这个目录下,主Makefile通过包含这个Makefile最终引入了这个变量,然后在链接的时候调用链接脚本,并给链接脚本传递TEXT_BASE 这个参数作为实际的起始链接地址。


(3)uboot\include\configs \x210_sd.h 头文件

这个头文件非常重要,它在uboot的Makefile 和 源代码处都起到了作用。

就Makefile而言,Makefile从中抽取了信息成为$(OBJTREE)/include/autoconf.mk ,这个子Makefile决定了Makefile的一些总体流向,详见上面的一、2、(1)的介绍;

就uboot源码来讲就更重要了,uboot 源码中的很多代码走向及编译范围都和这个头文件有关,具体实现的方法是通过条件编译,详见uboot源码。

这个文件在移植的时候主要的是考虑源码级别的,其实Makefile级别的用的很少。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值