3.1 mkconfig 脚本
1 100ask24x0_config : unconfig 2 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
3.1.1 mkconfig脚本的6个参数
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
这个意思就是 执行 mkconfig 脚本,将 100ask24x0_config 中的 _config 用空格代替,然后,将后面的6个参数传入进脚本中执行
$@ 为自动变量
代码 14 到 21 行:
1 while [ $# -gt 0 ] ; do 2 case "$1" in 3 --) shift ; break ;; 4 -a) shift ; APPEND=yes ;; 5 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; 6 *) break ;; 7 esac 8 done
一开始就进入 while 循环中执行,判断条件是 $# > 0,则执行循环,$# 为6,然后根据 $1 的参数进行执行,$1=100ask24x0,只匹配到 * ,则执行 break 语句,跳出 while 循环
代码 23 行
1 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
如果 BOARD_NAME 为真,则后面的不执行,为假,则执行 BOARD_NAME="$1",即此时 BOARD_NAME= 100ask24x0
代码 25 26 行
1 [ $# -lt 4 ] && exit 1 2 [ $# -gt 6 ] && exit 1
如果$#小于4,则exit 1(mkconfig脚本返回1),即退出
如果$#大于6,则也返回1.
所以:mkconfig脚本传参只能是4、5、6,如果大于6或者小于4都不行。
3.1.2 创建符号链接
代码30 到 62 行都在创建符号链接
1 # 2 # Create link to architecture specific headers 3 # 4 if [ "$SRCTREE" != "$OBJTREE" ] ; then 5 mkdir -p ${OBJTREE}/include 6 mkdir -p ${OBJTREE}/include2 7 cd ${OBJTREE}/include2 8 rm -f asm 9 ln -s ${SRCTREE}/include/asm-$2 asm 10 LNPREFIX="../../include2/asm/" 11 cd ../include 12 rm -rf asm-$2 13 rm -f asm 14 mkdir asm-$2 15 ln -s asm-$2 asm 16 else 17 cd ./include 18 rm -f asm 19 ln -s asm-$2 asm 20 fi 21 22 rm -f asm-$2/arch 23 24 if [ -z "$6" -o "$6" = "NULL" ] ; then 25 ln -s ${LNPREFIX}arch-$3 asm-$2/arch 26 else 27 ln -s ${LNPREFIX}arch-$6 asm-$2/arch 28 fi 29 30 if [ "$2" = "arm" ] ; then 31 rm -f asm-$2/proc 32 ln -s ${LNPREFIX}proc-armv asm-$2/proc 33 fi
为什么要创建符号链接?这些符号链接文件的存在就是整个配置过程的核心,这些符号链接文件(文件夹)的主要作用是给头文件包含等过程提供指向性连接。根本目的是让uboot具有可移植性。
uboot可移植性的实现原理:在uboot中有很多彼此平行的代码,各自属于各自不同的架构/CPU/开发板,我们在具体到一个开发板的编译时用符号连接的方式提供一个具体的名字的文件夹供编译时使用。这样就可以在配置的过程中通过不同的配置使用不同的文件,就可以正确的包含正确的文件。
- 代码过程
- 首先判断根目录和输出目录是否是一致的,是则执行 then 中的语句,不是则执行else 中的语句。不分析 then 后的语句,分析else 后的语句,在include目录下创建asm文件,指向asm-arm
- 删除 asm-arm/arch 文件
- 执行第二各 if 语句,判断条件是如果$6字符串为0 或者 $6 为 NULL,则执行then后语句,将 ./include/asm-arm/arch 文件链接到在include/asm-arm/arm920t。;否则,执行else语句,将./include/asm-arm/arch 文件链接到./include/asm-arm/arch-s3c24x0
- 执行第三个 if 语句,判断条件是 $2 为 arm 执行语句,删除 ./include/asm-arm/proc 文件, ./include/asm-arm/proc 文件链接到 ./include/asm-arm/proc-armv 文件
总结:一共创建了4个符号链接。这4个符号链接将来在写代码过程中,头文件包含时非常有用。譬如一个头文件包含可能是:#include <asm/xx.h>
3.1.3 ./include/config.mk文件创建
代码 64 到 73 行
1 # 2 # Create include file for Make 3 # 4 echo "ARCH = $2" > config.mk 5 echo "CPU = $3" >> config.mk 6 echo "BOARD = $4" >> config.mk 7 8 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk 9 10 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
将 ARCH = arm CPU = arm920t BOARD = 100ask24x0 SOC = s3c24x0 写入 ./include/config.mk 中
这里就是 创建了 include/config.mk 了文件,创建include/config.mk文件是为了让主Makefile在第117 行去包含的。
代码 75 到 最后一行
1 # 2 # Create board specific header file 3 # 4 if [ "$APPEND" = "yes" ] # Append to existing config file 5 then 6 echo >> config.h 7 else 8 > config.h # Create new config file 9 fi 10 echo "/* Automatically generated - do not edit */" >>config.h 11 echo "#include <configs/$1.h>" >>config.h 12 13 exit 0
如果 APPEND 为 yes,则将新内容追加到 config.h 中,否则 创建一个 config.h 文件
最后是 打印两行内容,追加到 config.h 中,执行成功后退出。
include/config.h文件里面的内容就一行#include <configs/100ask_24x0.h>,这个头文件是我们移植100ask_24x0(JZ2440)开发板时,对开发板的宏定义配置文件。这个文件是我们移植JZ2440时最主要的文件。
100ask_24x0.h 文件会被用来生成一个autoconfig.mk文件,这个文件会被主Makefile引入,指导整个编译过程。这里面的这些宏定义会影响我们对uboot中大部分.c文件中一些条件编译的选择。从而实现最终的可移植性。
理解这些脚本时,时刻要注意自己当前所处的路径。
3.2 注意
注意:uboot的整个配置过程,很多文件之间是有关联的(有时候这个文件是在那个文件中创建出来的;有时候这个文件被那个文件包含进去;有时候这个文件是由那个文件的内容生成的决定的)
注意:uboot中配置和编译过程,所有的文件或者全局变量都是字符串形式的(不是指的C语言字符串的概念,指的是都是字符组成的序列)。这意味着我们整个uboot的配置过程都是字符串匹配的,所以一定要细节,注意大小写,要注意不要输错字符,因为一旦错一个最后会出现一些莫名其妙的错误,很难排查,这个是uboot移植过程中新手来说最难的地方。