参考:http://blog.csdn.net/zsy2020314/article/details/9312147(写得很详细)
本人还在初学阶段,有些地方理解可能有误,如读者发现在有错误之处,望明确指出来,好让我纠正错误。
#!/bin/sh -e #指定执行该脚本的编译器,-e相当于/bin/sh
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#
##################################################################################
# 脚本功能:根据脚本开头注释可知,该脚本针对指定单板,创建一些头文件和相关链接用于配置u-boot,
# 是编译u-boot的第一个步骤,make 100ask24x0_config就执行该脚本
# 为何要编制该脚本:因为u-boot是一个多CPU多架构的统一bootloader,为了完成针对特定目标单板,
# 目标架构的编译,需要给Makefile指明,哪些文件需要编译,相当于从整体上控制需要编译的CPU,单板等
# 这就是脚本文件存在有理由
# 当执行 make 100ask24x0_config 时,就会调用这个文件(mkconfig),mkconfig会处理单板信息
# (在boards.cfg文件中定义有各种单板信息,100ask24x0_config只是其中一个),并生成单板信息到
# u-boot源码顶层目录/include/config.mk 这个文件中(会自动创建)
# 比如:执行 make 100ask24x0_config ,mkconfig就会生成5个变量(最后那5个):
# ARCH CPU BOARD VENDOR SOC
# mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
# $0 $1 $2 $3 $4 $5 $6
# ARCH : 目标板的CPU架构
# CPU : 具体使用的CPU型号
# BOARD: 目标板的名称
# VENDOR: 按厂商划分(如AT9200、S3C44B0等)
# SOC : 芯片名称
##################################################################################
#####################################################################
# SHELL常用内部参数:
# $# ----传递给程序的总的参数数目
# $? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。
# $* ----传递给程序的所有参数组成的字符串。
# $n ----表示第几个参数,$1 表示第一个参数,$2 表示第二个参数 ...
# $0 ----当前程序的名称
# $@ ----以"参数1" "参数2" ... 形式保存所有参数
# $$ ----本程序的(进程ID号)PID
# $! ----上一个命令的PID
# 下面对$?多做些说明,当补充shell知识吧
# 切记:$?永远表示shell命令最后一次执行后的退出状态,当函数执行完毕后,如果又执行了其它命
# 令,则$?不再表示函数执行后的状态,而表示其它命令的退出状态.
#-a 表示(and)两个条件同时成立
# -eq 表示两数值相等
# -gt 表示n1大于n2,即前面大于后面
# -lt 表示n1小于n2,即前面小于后面
# "\(" "\)"是对圆括号的转义,转成普通圆括号"()"来包裹条件表达式
######################################################################
APPEND=no # Default: Create new config file(默认创建一个新的配置文件)
BOARD_NAME="" # Name to print in make output (make 执行xxx_config的时候打印输出单板名)
while [ $# -gt 0 ] ; do # 如果前面大于后面,则执行循环体
case "$1" in# 对$1进行判断,有没有"--","-a","-n",因为$1都没有这些,所以不会执行
--) shift ; break ;;
-a) shift ; APPEND=yes ;; #-a, APPEND变量赋值yes,不生成新的config.h
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
# “shift”的作用是使用$1=$2,$2=$3,...,而原来的$1将丢失。
# 依次执行(--,-a,-n,*),这些选项
# 由于并没有传递给mkconfig以上任何选项,因此不会执行while
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
# 如果BOARD_NAME定义了,就不会执行BOARD_NAME="$1",反之,则执行
# 所以BOARD_NAME = 100ask24x0
[ $# -lt 4 ] && exit 1 # 小于:less than
[ $# -gt 6 ] && exit 1 # 大于:greater
# $#:表示参数的个数,现在有6个参数
# 如果小于4或者大于6,就退出
echo "Configuring for ${BOARD_NAME} board..."
# 不退出就会打印这句话Configuring for 100ask24x0 board...
# book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ make 100ask24x0_config
# Configuring for 100ask24x0 board...
#
# Create link to architecture specific headers
#
####################################################################
# SRCTREE与OBJTREE是相等的,看Makefile就知道了
# 这两个变量都在Makefile中定义了
# 在Makefile中
# BUILD_DIR := $(O)
# OBJTREE:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) # 就是说如果定义了BUILD_DIR,OBJTREE就等于BUILD_DIR,
# # 没定义就等于CURDIR,由上条指令知,BUILD_DIR没有定义
# SRCTREE:= $(CURDIR) # 这句话的意思是SRCTREE等于当前目录
####################################################################
if [ "$SRCTREE" != "$OBJTREE" ] ; then
mkdir -p ${OBJTREE}/include # 在目标目录创建include文件夹
mkdir -p ${OBJTREE}/include2 # 在目标目录创建include2文件夹
cd ${OBJTREE}/include2 # 打开include2
rm -f asm # 删除asm这个文件
ln -s ${SRCTREE}/include/asm-$2 asm # 在.../include目录下建立一个链接文件asm,asm指向asm-arm
LNPREFIX="../../include2/asm/" # 赋值,用LNPREFIX保存这个目录地址
cd ../include
rm -rf asm-$2
rm -f asm
mkdir asm-$2
ln -s asm-$2 asm
else # 跳到这里执行
cd ./include
rm -f asm # 这是上一次配置时建立的链接文件
ln -s asm-$2 asm # $2 = arm 相当于建立一个链接文件asm,这个链接文件指向asm-arm
# book@book-desktop:/work/mini2440_system/u-boot-1.1.6/include$ ls -l asm // ls -l :显示文件和目录列表
# lrwxrwxrwx 1 book book 7 2014-07-23 21:52 asm -> asm-arm
# 为什么要这样做呢?
# 这样做是让它指向arm构造,因为还在在include里面还有其他构造的CPU
# 我们在代码里面加上 # include <asm/type> 那么这个asm就是指asm -> asm-arm了
fi
rm -f asm-$2/arch
# 删除asm-arm/arch这个文件,其实可以写成 "rm -f asm/arch",因为asm是个软链接,对链接操作实际上就是对asm-arm操作
# 建立软链接的目的就是方便程序的编写和编译,提高效率,你写程序的时候总不想常常打一长串路径吧
# 软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,
# 文件实际上是一个文本文件,其中包含的有另一文件的位置信息
if [ -z "$6" -o "$6" = "NULL" ] ; then # 如果$6(s3c24x0)为空 或者 $6的值不为NULL
# “-o”表示或
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch # 在Makefile没有查找到LNPREFIX,那么就为空
fi
# ln -s arch-s3c24x0 asm-arm/arch,意思就是在asm-arm目录下建立一个链接文件arch,指向arch-s3c24x0目录
# book@book-desktop:/work/mini2440_system/u-boot-1.1.6/include$ ls -l asm-arm/arch
# lrwxrwxrwx 1 book book 12 2014-07-23 21:52 asm-arm/arch -> arch-s3c24x0
if [ "$2" = "arm" ] ; then # arm = arm 条件成立
rm -f asm-$2/proc # 删除asm-arm/proc这个文件
ln -s ${LNPREFIX}proc-armv asm-$2/proc # 在 “asm-arm/” 目录下,建立软链接文件proc,指向proc-armv目录
fi
#
# Create include file for Make # 生成一个配置文件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# $5 = NULL,不追加
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk # $6 = s3c24x0,追加
# > : 新建一个新的config.mk文件,
# >> : 追加
# 所以config.mk的内容为:
# ARCH = arm# 第一行
# CPU = arm920t# 第二行
# BOARD = 100ask24x0 # 第三行
# SOC = s3c24x0 # 第四行
# book@book-desktop:/work/mini2440_system/u-boot-1.1.6/include$ ls -l config.mk
# -rw-r--r-- 1 book book 67 2014-07-23 21:52 config.mk
# book@book-desktop:/work/mini2440_system/u-boot-1.1.6/include$ cat config.mk
# ARCH = arm
# CPU = arm920t
# BOARD = 100ask24x0
# SOC = s3c24x0
#
# Create board specific header file
#
# 在Makefile中查找APPEND不存在
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h # 条件不成立,所以不执行
else
> config.h # Create new config file # > :新建一个文件(config.h)
fi
echo "/* Automatically generated - do not edit */" >>config.h # 把这些内容追加到config.h里面
echo "#include <configs/$1.h>" >>config.h
exit 0
# 所以config.h内容如下:
/* Automatically generated - do not edit */
#include <configs/100ask24x0.h> //这就是配置文件
# 查看下
# book@book-desktop:/work/mini2440_system/u-boot-1.1.6/include$ cat config.h
# /* Automatically generated - do not edit */
# #include <configs/100ask24x0.h>
# 总结: $1 $2 $3 $4 $5 $6
# 配置命令 “make 100ask24x0_config” ,实际的作用就是执行 “./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 ”命令
# 产生的结果:
# (1)开发板名称BOARD_NAME等于100ask24x0($1)
# (2)创建到平台/开发板相关的头文件的链接,如下所示:
ln -s asm-$2 asm
ln -s arch-$6 asm-$2/arch
lx -s prov-armv asm-$2/prov # 如果$2不是arm,此行没有(往上看程序可就知道了)
# (3)创建顶层Makefile包含的文件include/config.mk,如下所示:
# ARCH = $1
# CPU = $2
# BOARD = $3
# SOC = $4
# VENDOR = $5 # $5为空,或者NULL,此行没有
# SOC = $6 # $6为空,或者NULL,此行没有
# (4)创建开发板相关的头文件include/config.h,所示如下:
# /* Automatically generated - do not edit */
# #include <configs/$1.h>