Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180570
  • 博文数量: 37
  • 博客积分: 1110
  • 博客等级: 少尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-29 22:01
文章分类

全部博文(37)

文章存档

2013年(10)

2011年(2)

2010年(25)

我的朋友

分类: 嵌入式

2013-03-26 21:19:56

一、makefile的分析
在uboot的顶层 Makefile 中可以看到如下代码: 
 
SRCTREE  := $(CURDIR) 
…… 
MKCONFIG := $(SRCTREE)/mkconfig 
…… 
#下面这段代码是原来uboot中针对2410支持的代码,可以跟踪一下这个的执行流程
smdk2410_config : unconfig  
          @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 
 
在 U-Boot-1.1.6 的根目录下编译,则其中的 MKCONFIG 就是根目录下的 mkconfig
文件。 $(@:_config=)的结果就是将 “smdk2410_config” 中的 “_config” 去掉, 结果为 “smdk2410” 。(@代表目标  “@:_config=” 就是把目标中的“_config”用空字符串代替 )
所以“make smdk2410_config”实际上就是执行如下命令: 
 ./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0

二、mkconfig的分析
mkconfig 的作用,在 mkconfig 文件开头第 6 行给出了它的用法: 
 
# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

下面解释一下uboot下mkconfig脚本的具体含义


#!/bin/sh -e   #这段是说明是一个shell脚本,后面这个-e选项可以网上搜搜,没特大的意义

# 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
#

APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output

while [ $# -gt 0 ] ; do       #-gt符号意思是大于. $#:意思是终端中命令的后几个参数的总个数。,明显的,个数共和是6,当然大于0了,所以,进入执行
case "$1" in       # $1第一个参数,即smdk2410  $1的值依次为其6个参数并进行循环判断
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*)  break ;;
esac
done

#由 ./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0 可以看出,参数中没有上面任意一个,所以直接跳出。

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
#或运算符,此时BOARD_NAME="$1" =smdk2410 

[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1  #这两句不会执行,因为个数为6,

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 #然后删除asm文件,首次编译的时候,你回发现是没有这个asm的。
ln -s asm-$2 asm  #创建软连接文件,在这里,应该是:ln -s asm-arm  asm,因此,在这里也就创建了对应的arm的汇编文件源码了。是一个符号链接asm,指向asm-arm源码文件。
fi

rm -f asm-$2/arch   #删除asm-arm/arch下面的所有东西

if [ -z "$6" -o "$6" = "NULL" ] ; then #-z意思是空串,这个-o我也没查到,估计应该是&&的意思,此时$6=s3c24x0 ,当然不为NULL,并且存在了,所以不执行这句
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch #这个${LNPREFIX}为空,所以这句话为:ln -s arch-s3c24x0 asm-arm/arch。
fi

if [ "$2" = "arm" ] ; then #$2,当然就是第二个参数arm了,所以进入其中
rm -f asm-$2/proc #先删除原来的asm-arm/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc  #意思是ln -s proc-armv asm-arm/proc,再次创建一个软连接
fi

#
# Create include file for Make
#
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk

#上面三句很明显是,(当前在include目录下),想config.mk中写入ARCH =arm,CPU =arm920t BOARD =smdk2410 (当然第一次执行的时候这个config.mk是没有的,就创建,以后在编译的时候就有了,那就直接覆盖)

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
#这句是&&运算符,因为$5=NULL,所以后面的就不用执行,直接退出,所以这条语句不会写进去。

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk
#同理,这句执行了,是输入?SOC = s3c24x0 到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 ,创建config.h文件
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include " >>config.h
echo "#include " >>config.h

#上面这句就简单多了,就是输入入戏几行代码到.config.h中
/* Automatically generated - do not edit */ 
#include  
#include

exit 0



阅读(2124) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~