U-boot移植之编译控制
简述:在u-boot的readme文档中提到,u-boot的编译分为两步,即编译前的配置makeconfig和编译过程make。那么在这两步中都进行了怎样的一些操作呢!
一、公共代码
打开(u-boot)根目录下的Makefile,在第一个目标all之前的都是公共代码。这些代码都是设置变量、导出变量及包含文件的语句,只要在根目录执行make命令,不管有没有参数它们都会被执行。
-
变量BUILD_DIR
这个变量决定了编译过程产生的中间文件及输出文件存放的位置。如果不设置这个变量,那么这些中间文件及最终的生成文件将被放到源代码目录下的各目录中。
-
变量MKCONFIG
这个变量的值为根目录下的mkconfig,这是一个shell脚本文件。它通常在编译配置阶段被调用,其功能是根据输入变量或根目录下的board.cfg文件来产生板配置文件/include/config.h。这个config.h中包含着开发板的平台、芯片、开发板名、提供商等一些宏定义,它还包含了一些头文件。它对编译过程有着重要的影响,因为很多代码并不是为某单一平台写的。另外,这个config.h文件包含有smdk6400.h文件,这个文件是开发板的配置文件,里面放着几乎所有对于该开发板的u-boot的控制宏及一些重要板相关的变量的值。比如,内存起始地址,内存大小等。
-
包含文件include/config.mk
这个config.mk是在编译配置过程产生的,所以在编译配置阶段是没有这个文件的。这里面存放的是开发板相关Makefile变量,它将决定哪些板相关的文件会被编译。
二、编译配置
以官方源码自带的smdk6400为例(makesmdk6400_config)。执行完上面的公共代码,直接跳到目标smdk6400_config目标处并执行其也的命令。
-
@echo"#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
很多代码中都有用到这个宏,有没有定义这个宏会直接影响一部分代码是否需要被编译。由此也可知这个配置产生的u-boot是用于nandflash起动的。
-
@echo"CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
这个是Makefile的变量,和前面的宏定义不同,这个变量是作用于Makefile中,利用它可以控制一部分库或源代码是否需要被编译。
-
echo"RAM_TEXT = 0x57e00000" >>$(obj)board/samsung/smdk6400/config.tmp;
这里也是一个Makefile变量,这个变量的值在后面将会变成一个宏和另一个Makefile变量的值,这个值并非随意取的,它和u-boot在DRAM中的布局有关。具体如何关联,后面再说。
-
@$(MKCONFIG)smdk6400 arm arm1176 smdk6400 samsung s3c64xx
调用前面提到的mkconfigshell脚本处理开发板的信息,写入/include/config.h及/include/config.mk这两个文件。另外,它还会做一些工作,建议设置变量