一 配置
1.1 make 100ask24x0_config
u-boot-1.1.6目录下makefile中有个目标 100ask24x0_config
100ask24x0_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
命令分析:
unconfig:
# @rm -f $(obj)include/config.h$(obj)include/config.mk \
# $(obj)board/*/config.tmp$(obj)board/*/*/config.tmp
# 删除之前配置好的
#
@$(MKCONFIG)
# MKCONFIG=$(SRCTREE)/mkconfig
# SRCTREE := $(CURDIR)
# CURDIR 是Makefile中的一个特殊参数,表示当前目录
#
# OBJTREE := $(if$(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
# $(if <condition>,<then-part>, <else-part>).
# 相当于C语言中的if-then-else-part
# 如果 BUILD_DIR 为非空,则为 BUILD_DIR,为空则为 CURDIR,
#
# @作用:make会把其要执行的命令行在命令执行前输出到屏幕上。当用“@”字符在命
# 令行前时,这个命令将不被make显示出来
#
$(@:_config=)
# $(var:=)是$(patsubst ,,)的简化形式,
# 例 $(patsubst %.c,%.o,x.c.c bar.c)
# 把字串“x.c.c bar.c”中以.c结尾的单词替换成以.o结尾的字符。函数的返回# 结果是“x.c.o bar.o”
#
# @在$()中与$@一样,表示规则中的目标文件
# $(@:_config=)中就是$(100ask24x0_config:_config=)
# 100ask24x0_config中的_config替换为空
命令效果:
./mkconfig 100ask24x0 arm arm920t 100ask24x0NULL s3c24x0
1.2 接着1.1执行mkconfig
./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
参数解析
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
# Target: 宿主机平台
# Architecture: 定义芯片架构(如MIPS、POWERPC、ARM等)
# CPU: 定义芯片指令集版本(如ARM7、ARM9、ARM11等)
# Board: 芯片厂商,它细分为两类
# [VENDOR]: 按厂商划分(如AT9200、S3C44B0等)
# [SOC]: 按SOC类型(如S3C2440、S3C2410等)
分析参数有没有-- -a -n *
while [ $# -gt 0 ] ;
do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
while [ $# -gt 0 ] ;
# 脚本名称叫test.sh 入参三个: 12 3
# 运行test.sh 1 2 3后
# $*为"1 2 3"(一起被引号包住)
# $@为"1" "2" "3"(分别被包住)
# $#为参数数量
#
# -eq //等于
# -ne //不等于
# -gt //大于
# -lt //小于
# ge //大于等于
# le //小于等于
case "$1" in
# --) shift ; break ;;
# -a) shift ; APPEND=yes ;;
# -n) shift ;BOARD_NAME="${1%%_config}" ; shift ;;
# *) break ;;
#
# 如果$1第一个参数是 -- 则所有参数左移 把原$1丢弃,
# 原$2补上$1<-$2<-$3<-$4<-$5<-$6 $0是脚本名
# 如果$1第一个参数是 -a 则所有参数左移 APPEND = yes
# 如果$1第一个参数是 -n 则所有参数左移 BOARD_NAME=”内容”
${1%%_config}
# 可以用${}分别替换得到不同的值:
# ${file%%.*}:删掉第一个 . 及其右边的字符串
# ${file%%/*}:删掉第一个 / 及其右边的字符串
# ${file#*/}:删掉第一个 / 及其左边的字符串:
# ${file##*/}:删掉最后一个 / 及其左边的字符串:
# ${file#*.}:删掉第一个 . 及其左边的字符串:
# ${file##*.}:删掉最后一个 . 及其左边的字符串
# ${file%/*}:删掉最后一个 / 及其右边的字符串
# ${file%.*}:删掉最后一个 . 及其右边的字符串
#
# ${1 等效于 $1
结果
NULL
给BOARD_NAME赋值
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
# [ "${BOARD_NAME}" ] 如果BOARD_NAME定义了||后的内容就不会执行,否则执行
# BOARD_NAME="$1",和c语言的||相似
# BOARD_NAME=""没有定义。 执行BOARD_NAME="$1"
结果
BOARD_NAME=100ask24x0
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
echo "Configuringfor ${BOARD_NAME} board..."
${BOARD_NAME}
# 当要显示变量值加随意的字符(我这里用AA)时,就会出错,如下:
# $ echo $varAA
# 这时应该用变量的原形:${var},即是加一个大括号来限定变量名称的范围,
[ $# -lt 4 ]&& exit 1
# [] 实际上是bash 中 test 命令的简写
# []就是 test,[]和[[]]都是条件表达式,不过[[]]有比[]高的容错性
# test 整数1 –eq 整数2 整数相等
# test File1 –nt File2 文件1比文件2 新
# test –e File 文件存在
# test –x File 文件存在并且可执行
exit 1
# exit0 执行正确
# exit1 一般是出错定义这个1,也可以是其他数字
./include下,建立asm-arm文件的符号链接,并命名为asm
if [ "$SRCTREE" != "$OBJTREE" ] ;
then
mkdir -p ${OBJTREE}/include
mkdir -p ${OBJTREE}/include2
cd ${OBJTREE}/include2
rm -f asm
ln -s ${SRCTREE}/include/asm-$2 asm
LNPREFIX="../../include2/asm/"
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
fi
ln -s asm-$2 asm
# 建立asm-$2文件的符号链接,并命名为asm
结果
if不成立,执行else,
进入./include
建立asm-arm文件的符号链接,并命名为asm
Makefile刚开始有对是加 –o选项进行判断,以此来对SRCTREE的值进行设置,
./include下,建立arch-s3c24x0文件的符号链接,并命名为asm-arm/arch
rm -f asm-$2/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
if [ -z "$6" -o "$6" = "NULL" ]
# -z 判断是否为空
# if [ -z $string ] 如果string 为空
# if [ $sting ] 如果string 非空,返回0
# -o 逻辑或
# if [ 表达式1 –o 表达式2 ]
else
# if不成立,执行else
# ln -s ${LNPREFIX}arch-$6 asm-$2/arch
# LNPREFIX没有定义
#
结果
# ln -s arch-s3c24x0 asm-arm/arch
./include下,建立proc-armv文件的符号链接,并命名为asm-arm/proc
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
# 执行
# ln -s proc-armv asm-arm/proc
已知:include下没有源文件proc-armv,源文件proc-armv在asm-arm/下。
需要的源文件主要看生成目标链接文件的目录,经过试验,即使当前include目录下有源文件proc-armv,生成链接文件时源文件也要在asm-arm/目录下找,生成的链接文件proc也会在asm-arm/下
生成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
# >表示新建文件并输入内容
# >>表示将内容追加到文件
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
# 参数6存在并且参数6不是null,把内容追加到文件
结果:config.mk内容
# ARCH =arm
# CPU =arm920t
# BOARD =100ask24x0
# ARCHSOC =s3c24x0
生成文件config.h
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h #Create new config file
fi
echo "/*Automatically generated - do not edit */" >>config.h
echo "#include<configs/$1.h>" >>config.h
# if不成立,执行else
# 创建 config.h
# 并追加两行内容
#
结果:config.h内容
# /* Automatically generated - do notedit */
# #include <configs/100ask24x0.h>