u-boot 编译改动了那些文件(1)make xxx_config

来源:互联网 发布:华大基因数据库 编辑:程序博客网 时间:2024/06/05 19:45

下载u-boot-1.1.6 http://sourceforge.net/projects/U-Boot获得U-Boot最新版本。
以开发板smdk2410+SOC芯片S3C2410 + arm920tCPU核为例

编译过程:两条命令就够

方法1.不指定生成的文件存放的目标目录,那么编译生成的所有文件都保存在源代码目录中。# make smdk2410_config(建立目录、文件联系)# make  (或make all 不指定默认执行第一个)开始编译方法2、为了保持源代码目录的干净,可以使用如下命令将编译生成的文件输出到一个外部目录,而不是在源代码目录中,下面的2种方法都将编译生成的文件输出到 /tmp/build目录。//注意:这里必须是绝对路径tmp/build 或./tmp/build 都不行。但可以是/home/xiaoming/temp$ make O=/tmp/build smdk2410_config (注意是字母O,而不是数字0$ make all 或者$ export BUILD_DIR=/tmp/build $ make smdk2410_config $ make all 

1、顶层Makefile

smdk2410_config : unconfig     @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0unconfig:     @rm -f $(obj)include/config.h $(obj)include/config.mk /      $(obj)board/*/config.tmp $(obj)board/*/*/config

执行# make smdk2410_config时,先执行unconfig目标,不指定输出目标时,obj,src变量均为空,unconfig下面的命令清理上一次执行make *_config时生成的头文件和makefile的包含文件。主要是include/config.h 和include/config.mk文件。然后才执行命令。

变量MKCONFIG:这个变量指向一个脚本,即顶层目录的mkconfig。执行# make smdk2410_config时会执行这个脚本文件,后面几个为它需要调用的参数,分别对应Target Architecture CPU Board [VENDOR] [SOC] 。其中$(@:_config=)为smdk2410 即smdk2410_config去掉_config。

2、/mkconfig做了什么
(1)确定开发板名称BOARD_NAME,等于第一个参数即smdk2410

BOARD_NAME="" [ "${BOARD_NAME}" ] || BOARD_NAME="$1"

(2)创建到目标板相关的目录的链接,都在include/asm-arm/下

//arm架构目录cd ./include rm -f asm ln -s asm-$2 asm   include目录下建立了到asm-arm目录的符号链接asm。其中的ln -s asm-$2 asm即ln -s asm-arm asm 。这里asm-arm 是一个目录//arm架构目录下的SOC目录rm -f asm-$2/arch ln -s ${LNPREFIX}arch-$6 asm-$2/arch 建立符号链接include/asm-arm/arch指向 include/asm-arm/arch-s3c24x0目录。//arm架构下的处理器目录if [ "$2" = "arm" ] ; then rm -f asm-$2/proc ln -s ${LNPREFIX}proc-armv asm-$2/proc fi 若目标板是arm架构,则上面的代码将建立符号连接include/asm-arm/proc指向目录include/asm-arm/proc-armv。 

建立以上的链接的好处:编译U-Boot时直接进入链接文件指向的目录进行编译,而不必根据不同开发板来选择不同目录。

(3)构建include/config.mk文件

echo "ARCH = $2" > config.mk echo "CPU = $3" >> config.mk echo "BOARD = $4" >> config.mk [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk 上面代码将会把如下内容写入文件inlcude/config.mk文件: ARCH = arm CPU = arm920t BOARD = smdk2410 SOC = s3c24x0 

4)指定开发板源代码所在目录 BOARDDIR= smdk2410

if [ -z "$5" -o "$5" = "NULL" ] ; then BOARDDIR=$4 else BOARDDIR=$5/$4 fi 以上代码指定board目录下的一个目录为当前开发板专有代码的目录。$5(VENDOR)为空则BOARDDIR设置为$4(BOARD)即smdk2410

(5)构建include/config.h文件,往里面追加内容

> config.h # Create new config file echo "/* Automatically generated - do not edit */" >>config.h for i in ${TARGETS} ; do echo "#define CONFIG_MK_${i} 1" >>config.h ; done cat << EOF >> config.h #define CONFIG_BOARDDIR board/$BOARDDIR #include <config_defaults.h> #include <configs/$1.h> #include <asm/config.h> EOF exit 0 

这里的“cat << EOF >> config.h”表示将输入的内容追加到config.h中,直到出现“EOF”这样的标识为止。
若APPEND为no,则创建新的include/config.h文件。若APPEND为yes,则将新的配置内容追加到include/config.h文件后面。由于APPEND的值保持“no”,因此config.h被创建了,并添加了如下的内容:

/* Automatically generated - do not edit */ #define CONFIG_BOARDDIR board/smdk2410#include <config_defaults.h> #include <configs/smdk2410.h> #include <asm/config.h> 

下面总结命令make smdk2410_config执行的结果(仅针对编译目标输出到源代码目录的情况):

1) 创建到目标板相关的文件的链接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-armv asm-arm/proc (2) 创建include/config.mk文件,内容如下所示: ARCH = arm CPU = arm920t BOARD = smdk2410VENDOR = samsung SOC = s3c24x0 (3) 创建与目标板相关的文件include/config.h,如下所示: /* Automatically generated - do not edit */ #define CONFIG_BOARDDIR board/smdk2410#include <config_defaults.h> #include <configs/smdk2410.h> #include <asm/config.h>