mkconfig解析(基于uboot.2012.10版本)

#!/bin/sh -e
## 上面这句指定执行该脚本所使用的解释器, -e相当于使用/bin/bash  
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]
#这个地方指出了脚本的参数,本次的参数依次为:x210v3 arm armv7 x210v3 samsung s5pc1xx
#
# (C) 2002-2010 DENX Software Engineering, Wolfgang Denk 
   
   
    
    
#
#*******************************注释分界线-S******************************************
# mkconfig脚本文件存在的理由:因为uboot是一个多CPU多架构的统一bootloader,为了完成针  
# 对特定目标单板,目标架构的编译,需要给Makefile指明,哪些文件需要编译,相当与从整体上控制  
# 需要编译的cpu,单板等。  
# 当执行make xxx_config U-boot时就会调用这个mkconfig文件。mkconfig会处理单板信息  
# (在boards.cfg文件中定义有各种单板信息,x210_config只是其中一个)并生成单板信息到  
# U-boot源码顶层目录/include/config.mk这个文件中(会自动创建-下面有分析)。  
# 以make x210_config为例,执行成功后,mkconfig会产生5个变量分别为:  
#   ARCH   CPU    BOARD    VENDOR   SOC  
#   arm   armv7   x210v3   samsung s5pc1xx  
# (ARCH=目标板的CPU架构   CPU=具体使用的CPU型号   BOARD = 目标板名称  SOC = 芯片名称)  
#*******************************注释分界线-E******************************************

APPEND=no	# 默认创建一个新的配置文件
BOARD_NAME=""	# make 执行xxx_config的时候打印输出单板名
TARGETS=""

arch=""
cpu=""
board=""
vendor=""
soc=""
options=""

#*******************************注释分界线-S******************************************
#$#表示参数个数 
#-a表示(and)两个条件同时成立 
#make s5p_goni_config = ./mkconfig -A s5p_goni 
#包含 2 个参数, $1 表示第一个参数 -A, $2 表示第二个参数s5p_goni
#如果参数个数等于 2 并且第一个参数为-A 运行 then 后面的命令,这里完全满足;\是转义字符先不管
#egrep 命令检索扩展的正则表达式(包括表达式组和可选项), -i 不区分大小写,'^'表示反向选择, [:space:] 匹配空白字符(空格,tab)
# * 匹配 0 个或多个字符
#egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg 也就是从boards.cfg文  
# 件中搜索非空格开头但以空格结尾的包含至少1个"s5p_goni"字符串的行
#所以要建立自己的配置文件,必须在这里建立自己的配置项,在 boards.cfg 文件 s5p_goni 后添加一行:
#x210v3 arm armv7 x210v3 samsung s5pc1xx
#*******************************注释分界线-E******************************************
if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then
	# Automatic mode
	line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
		echo "make: *** No rule to make target \`$2_config'.  Stop." >&2
		exit 1
	}

	
#*******************************注释分界线-S******************************************
# 扩展阅读:set,env和export这三个命令都可以用来显示shell变量,其区别是什么?  
# set 用来显示本地变量  
# env 用来显示环境变量  
# export 用来显示和设置环境变量  
# set 显示当前shell的变量,包括当前用户的变量  
# env 显示当前用户的变量  
# export 显示当前导出成用户变量的shell变量  
# 每个shell有自己特有的变量(set)显示的变量,这个和用户变量是不同的,当前用户变量和你  
# 用什么shell无关,不管你用什么shell都在,比如HOME,SHELL等这些变量,但shell自己的   
# 变量不同,shell是不同的,比如BASH_ARGC, BASH等,这些变量只有set才会显示,是bash  
# 特有的,export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变  
# 量可以通export “导出”变成一个用户变量。set ${line}意思是设置line中的变量为本地  
# 变量,变量的集合为line,你可以在这句的下面加上显示本地环境变量的语句echo `set`,  
# 终端会打印出所有本地变量,找一下就可以发现其中有一句内容是:line = 'x210v3 arm   
# armv7 x210v3 sansung s5pc1xx'。要是缺少了set ${line}就等着出错吧!
#这个时候参数个数就变成6个了 ($1 $2 $3 $4 $5 $6)
	set ${line}
#*******************************注释分界线-E******************************************
	
#如果boards.cfg搜索到的单板信息行的变量只有3个,如果有需要的话则把变量${1}作为默认  单板名称  	
	# add default board name if needed
	[ $# = 3 ] && set ${line} ${1}


elif [ "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset" ] ; then
	# only warn when using a config target in the Makefile
	cat <<-EOF

	warning: Please migrate to boards.cfg.  Failure to do so will
	         mean removal of your board in the next release.

	EOF
	sleep 5
fi

#这里判断参数个数是否( gt 是大于的意思)大于零,我们这里参数明显多于零,所以继续执行。由于我
#们的$1 是"x210v3",所以直接退出,继续下面执行。
while [ $# -gt 0 ] ; do
	case "$1" in
	--) shift ; break ;;
	-a) shift ; APPEND=yes ;;
	-n) shift ; BOARD_NAME="${1%_config}" ; shift ;;
	-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
	*)  break ;;
	esac
done

#$#表示参数个数,如果参数个数小于 4 个大于 7 个就退出,我们得到六个参数: "x210v3 arm armv7
#x210v3 samsung s5pc1xx",所以不会退出
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1

# Strip all options and/or _config suffixes
# CONFIG_NAME = x210v3
# 如果$1变量结尾是_config,就去掉_config
CONFIG_NAME="${1%_config}"

#如果没定义 BOARD_NAME,就BOARD_NAME=CONFIG_NAME
# BOARD_NAME被赋值为x210v3
[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"

#*******************************注释分界线-S****************************************** 
# arch = arm    
# `echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'` 打印参数$3(armv7),然后以":"为分隔打印第一列;
#同理{print $2} 打印第二列
#cpu = armv7   sp1_cpu = 空
#*******************************注释分界线-E****************************************** 
arch="$2"
cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`
spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`

#board赋值为 x210v3
if [ "$4" = "-" ] ; then
	board=${BOARD_NAME}
else
	board="$4"
fi

#vendor赋值为samsung 
[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"
#soc赋值为s5pc1xx
[ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6"
#条件不成立,此处代码不执行 
[ $# -gt 6 ] && [ "$7" != "-" ] && {
	# check if we have a board config name in the options field
	# the options field mave have a board config name and a list
	# of options, both separated by a colon (':'); the options are
	# separated by commas (',').
	#
	# Check for board name
	tmp="${7%:*}"
	if [ "$tmp" ] ; then
		CONFIG_NAME="$tmp"
	fi
	# Check if we only have a colon...
	if [ "${tmp}" != "$7" ] ; then
		options=${7#*:}
		TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"
	fi
}
#-a是&&,这里ARCH为空,因为还没有赋值,后面赋值后和arch=ARCH=arm
if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then
	echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" 1>&2
	exit 1
fi
#到目前位置options没有被赋值(为空),所以会打印信息: Configuring for
#x210v3 board ...
if [ "$options" ] ; then
	echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"
else
	echo "Configuring for ${BOARD_NAME} board..."
fi


#*******************************注释分界线-S******************************************
#这里引入一个 Makefile 的知识点, GUN make 的执行过程分为两个阶段:
#第一阶段:读取所有的 makefile 文件(包括“ MAKIFILES”变量指定的、指示符“ include”指定的、
#以及命令行选项“ -f(--file)”指定的 makefile 文件),内建所有的变量、明确规则和隐含规则,并建立所
#有目标和依赖之间的依赖关系结构链表。
#第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则
#来重建这些目标。
#所以,当我们执行 make x210v3_config 或者 make all 时, make 命令首先会将 Makefile 文件从头
#解析一遍,然后才是根据“目标-依赖”关系来建立目标
#查看Makefile(P107)
#OBJTREE		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))	
#SRCTREE		:= $(CURDIR)
#TOPDIR		:= $(SRCTREE)
#LNDIR		:= $(OBJTREE)
#export	TOPDIR SRCTREE OBJTREE SPLTREE	export MKCONFIG
#MKCONFIG	:= $(SRCTREE)/mkconfig
#这里的$(CURDIR)是 Makefile 自己的环境变量,它等于当前目录,展开即为:
#srctree=/home/x/samba-s/uboot/u-boot-2012.10
#objtree=/home/x/samba-s/uboot/u-boot-2012.10
#src=/home/x/samba-s/uboot/u-boot-2012.10
#obj=/home/x/samba-s/uboot/u-boot-2012.10
#VPATH=/home/x/samba-s/uboot/u-boot-2012.10
#MKCONFIG=/home/x/samba-s/uboot/u-boot-2012.10
# 这里SRCTREE和OBJTREE变量相等
#*******************************注释分界线-E******************************************
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; then
	mkdir -p ${OBJTREE}/include
	mkdir -p ${OBJTREE}/include2
	cd ${OBJTREE}/include2
	rm -f asm
	ln -s ${SRCTREE}/arch/${arch}/include/asm asm
	LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/
	cd ../include
	mkdir -p asm
else
	cd ./include
#删除上次配置产生的链接文件
	rm -f asm
#建立链接文件	
	ln -s ../arch/${arch}/include/asm asm	#asm ->/arch/arm/includ/asm/
fi
#删除include/asm/arch文件夹
rm -f asm/arch

#这里判断 soc 是否有值,在 arch/arm/include/asm 建立软链接, arch -> arch-s5pc1xx
#LNPREFIX未被赋值
    
    <为空>
     
     
if [ -z "${soc}" ] ; then
	ln -s ${LNPREFIX}arch-${cpu} asm/arch
else
	ln -s ${LNPREFIX}arch-${soc} asm/arch
fi

##这里判断arm是否等于arm,在 arch/arm/include/asm 建立软链接, asm/proc -> asm/proc-armv
if [ "${arch}" = "arm" ] ; then
	rm -f asm/proc
	ln -s ${LNPREFIX}proc-armv asm/proc
fi

#
# Create include file for Make
#
#! -z "$spl_cpu" 判断是否为空字符串 不是返回真,这里为空
#在 include 目录下生成 config.mk,内容如下:
#ARCH = arm
#CPU = armv7
#BOARD = x210v3
#VENDOR = samsung
#SOC = s5pc1xx
#加一个exit0(返回成功值),然后这些统统写入config.mk文件中, > config.mk是强行覆盖创建# config.mk然后把数据导入config.mk中 
( echo "ARCH   = ${arch}"
    if [ ! -z "$spl_cpu" ] ; then
	echo 'ifeq ($(CONFIG_SPL_BUILD),y)'
	echo "CPU    = ${spl_cpu}"
	echo "else"
	echo "CPU    = ${cpu}"
	echo "endif"
    else
	echo "CPU    = ${cpu}"
    fi
    echo "BOARD  = ${board}"

    [ "${vendor}" ] && echo "VENDOR = ${vendor}"
    [ "${soc}"    ] && echo "SOC    = ${soc}"
    exit 0 ) > config.mk

# Assign board directory to BOARDIR variable
#-z "${vendor}" 为 0 判断 显然不为 0
#BOARDDIR=samsung/x210v3
if [ -z "${vendor}" ] ; then
    BOARDDIR=${board}
else
    BOARDDIR=${vendor}/${board}
fi

#
# Create board specific header file
#
#APPEND 值为 no,所以建空文件 config.h
if [ "$APPEND" = "yes" ]	# Append to existing config file
then
	echo >> config.h
else
	> config.h		# Create new config file
fi

#向 config.h 追加信息,内容如下:
#/* Automatically generated - do not edit */
echo "/* Automatically generated - do not edit */" >>config.h


#define CONFIG_BOARDDIR board/samsung/x210v3
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #TARGETS为空,循环不执行 for i in ${TARGETS} ; do i="`echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`" echo "#define CONFIG_${i}" >>config.h ; done #将下面内容输入到config.h文件中 echo "#define CONFIG_SYS_ARCH \"${arch}\"" >> config.h echo "#define CONFIG_SYS_CPU \"${cpu}\"" >> config.h echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h [ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h [ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h # 将如下内容追加到config.h中,直到出现EOF为止 cat << EOF >> config.h #define CONFIG_BOARDDIR board/$BOARDDIR #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                EOF exit 0 
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种瓜大爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值