1.分析配置过程
我们把补丁文件打到uboot源码中,(补丁文件时根据自己的板子所修改的代码),然后看一下Makefile。
make 100ask24x0_config #这个指令用来配置uboot
打入补丁文件后 Makefile中会自动的生成这样的代码,我们对这个代码进行一下解析
MKCONFIG :表示mkconfig指令
@:_config=
@:表示目标也就是100ask24x0_config
_config=:表示把_config替换成空格
所以make 100ask24x0_config这个指令表达的就是
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
我们一下这个替换出来的代码,看看会产生什么效果,他会打印这么一句话
我们打开mkconfig这个脚本文件看一下里面的shell脚本
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
echo "Configuring for ${BOARD_NAME} board..."
#
# 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}/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
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 [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
#
# Create include file for Make
#
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
#
# Create board specific header file
#
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
exit 0
因为我们运行的指令是./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0,这里面并没有 “-”表示的参数,所以这几句就可以删掉了,
在继续分析
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
因为BOARD_NAME为空,条件不成立,或操作只要前面的条件不成立才会进行判断第二个条件是否成立,所以
这个代码可以替换成BOARD_NAME=100ask24x0
echo "Configuring for ${BOARD_NAME} board..."
就会输出Configuring for 100ask24x0 board...
我们查看Makefile,很显然这两个变量的值不相等
所以这个条件不成立,我们把这个代码也可以删除了
上面这个脚本用于判断第六个参数是否为空,很显然我们执行的那个代码的第六个指令是存在的所以直接执行else分支,所以直接执行
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
因为LNPREFIX在uboot目录中的所有文件中都没有找到该定义,所以为空
最终替换为
ln -s arch-s3c24x0 asm-arm/arch
这个条件成立
所以替换成
rm -f asm-arm/proc
ln -s proc-armv asm-arm/proc
剩下的就很简单了,我们就不在这里介绍了。,其实编译过程的Makefile分析起来同样简单,无非就是,定义交叉工具,引入头文件、各种库文件、链接编译好的.o文件最终形成一个可执行的程序