因为makefile是用来指导编译uboot的,从这里开始分析,更改,移植。
第一步:看makefile
(1)首先选择自己开发板的配置文件,在samsung厂商发布的uboot(uboot\include\configs)目录下,有很多类似x210_sd_config.h的配置文件,一个就是一个开发板,Samsung一共移植了455块不同开发板,九鼎正对s5pv210留下了2个,在他的基础上修改,所有我们需要在虚拟机下执行make x210_sd_config.h,这时主makefile的2589行就会调用mkconfig脚本规则,将ARCH = arm、CPU = s5pc11xBOARD = x210、VENDOR = samsung、SOC = s5pc110,如果是别的开发板和别的架构,就在makefile里面改。
举例ARCH的值的意义。
在makefile中有下面代码,不同架构cpu上的交叉编译工具链不同,一般都是前缀不同,后缀一样,最后能达到相同效果,比如我们S5PV210使用的arm-2009q3工具链里面的-gcc编译代码用的一个应用程序,首先我们要知道这个工具链里面前缀,让后在makefile里面赋给COMPILE 这个环境变量,然后导出(在下面config.mk),最后我们才能在任意位置使用arm-none-linux-gnueabi-gcc。否则找不到这个小应用程序去编译我们的.C文件,其他架构则也要知道这个交叉编译工具链的前缀,同上,正对自己的板子写makefile。这里ARCH就很重要。其他4个值都很重要。
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
(2)makefile中引出的$(TOPDIR)/config.mk(主Makefile的185行)
这里面很多都是定义与交叉编译和链接属性有关,我们不是搞这块的,不做研究,但是有要自己加的。我们自己做裸机的时候在makefile里都是自己定义CC = arm-linux-gcc等,这里分两步 CC = $(CROSS_COMPILE)-gcc,因为要适应所有的架构。与ARCH有关。
(3)config.mk会去生成了一个autoconfig.mk。
这个文件的作用就是用来指导整个uboot的编译过程。这个文件的内容其实就是很多CONFIG_开头的宏(可以理解为变量),这些宏/变量会影响我们uboot编译过程的走向(原理就是条件编译)。在uboot代码中有很多地方使用条件编译进行编写,这个条件编译是用来实现可移植性的。(可以说uboot的源代码在很大程度来说是拼凑起来的,同一个代码包含了各种不同开发板的适用代码,用条件编译进行区别。)
这个文件不是凭空产生的,配置过程也是需要原材料来产生这个文件的。原材料在源码目录的inlcude/configs/xxx.h头文件。(X210开发板中为include/configs/x210_sd.h)。这个h头文件里面全都是宏定义,这些宏定义就是我们对当前开发板的移植。每一个开发板的移植都对应这个目录下的一个头文件,这个头文件里每一个宏定义都很重要,这些配置的宏定义就是我们移植uboot的关键所在。
(4)config.mk里面把(1)中5个参数设置好后的值用去包含各个下面的config.mk,还有我们之前x210_sd_config.h配置的选项,会在这里指导生成u-boot的中间文件如u-boot.lds、u-boot.debug等,里面还包括自动推到规则、链接时指定链接地址等。
具体细节分析在2.4课件部分