u-boot之mkconfig分析
2017-01-08 20:37
411 查看
编译u-boot的过程,就是make xxx_config和make两步执行过程如下:
以make smdk2410_config为例:
(一)
make smdk4412_config指令在Makefile找到
%_config:: unconfig
@$(MKCONFIG) -A $(@:_config=)
但是发现
unconfig:
@rm -f$(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp \
$(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep
清除上次产生的*.Mk,*.h等文件
@$(MKCONFIG) -A $(@:_config=)
$(MKCONFIG)为当前目录
$(@:_config=)表示保留去除_config后的字符串,即是smdk4412,
将两个参数(A smdk4412)传入mkconfig中,并执行该文件。
(二)
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
}
set ${line}
# add default board name ifneeded
[ $# = 3 ] && set${line} ${1}
表示有两个参数,如果第一个参数是-A,就执行then语句,即在boards.cfg寻找第二个参数,如果没找到则打印"make: *** No rule tomake target \`$2_config'. Stop."
smdk4412 arm armv7 smdk4212 samsung exynos
$1 $2 $3 $4 $5 $6
(三)
while [ $# -gt 0 ] ; do //-gt表示“>”
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
表示参数大衣0个(参数从boards.cfg读取),且第一个参数为case in语句列表里的,执行相应的操作。
(四)
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1
如果参数小于4个或大于7个就退出。
(五)
CONFIG_NAME="${1%_config}" //将第一个值传给CONFIG_NAME=smdk4412
[ "${BOARD_NAME}" ] ||BOARD_NAME="${1%_config}"
arch="$2" //第二个参数赋值给arch
cpu=”$3” //第三个参数赋值给cpu
if [ "$4" = "-" ] ; then
board=${BOARD_NAME}
else
board="$4"
fi //如果第四个参数为“-“,即board为第四个参数
(六)
[ $# -gt 4 ] && [ "$5" != "-" ]&& vendor="$5" //如果第五个参数不等于“-“,则赋值$5。
[ $# -gt 5 ] && [ "$6" != "-" ]&& soc="$6" //如果第六个参数不等于“-“,则赋值$6。
[ $# -gt 6 ] && [ "$7" != "-" ]&& { //如果第七个参数不等于“-“,则执行如下。
tmp="${7%:*}"
if ["$tmp" ] ; then
CONFIG_NAME="$tmp"
fi
# Check if we onlyhave a colon...
if ["${tmp}" != "$7" ] ; then
options=${7#*:}
TARGETS="`echo${options} | sed 's:,: :g'` ${TARGETS}"
fi
}
if [ "${ARCH}" -a "${ARCH}" !="${arch}" ]; then//-a表示与逻辑,ARCH存在则检测ARCH、arch是否匹配
echo"Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}"1>&2
exit 1
fi
if [ "$options" ] ; then //我们并没定义options,因此配置成功
echo"Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options:${options}"
else
echo"Configuring for ${BOARD_NAME} board..."
fi
(七)
if [ "$SRCTREE" != "$OBJTREE" ] ; then
// SRCTREE和OBJTREE都是当前目录,则执行else
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
//进入include目录(后面的文件都进入这个文档)
rm -f asm
//删除asm链接
ln -s../arch/${arch}/include/asm asm //建立软链接,指向/arch/arm/inlcue/asm
fi
rm -f asm/arch
//删除include目录下的asm下的arch链接文件
if [ -z "${soc}" ] ; then //此处不为空soc=exynos),并新建asm/arch目录,让他指向arch-exynos目录
ln -s ${LNPREFIX}arch-${cpu}asm/arch
else
ln -s${LNPREFIX}arch-${soc} asm/arch //建立链接
fi
if [ "${arch}" = "arm" ] ; then //删除现有的asm/proc目录,并新建asm/proc目录,指向proc-armv目录
rm -f asm/proc
ln -s${LNPREFIX}proc-armv asm/proc //建立链接
fi
(八)
( echo "ARCH =${arch}"
if [ ! -z"$spl_cpu" ] ; then //如果$spl_cpu"长度不为真,则
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 //
将上述打印写入config.mk
if [ -z "${vendor}" ] ; then //为vendor变量不为空,所以执行else
BOARDDIR=${board}
else
BOARDDIR=${vendor}/${board}
fi
(九)
//在文件的最开头可以看到APPEND为no,所以这里我们在include文件夹下建立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
for i in ${TARGETS} ; do
//我们TARGETS为空,上面不执行了
i="`echo${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`"
echo"#define CONFIG_${i}" >>config.h ;
done
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 "#defineCONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
[ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h
cat << EOF >> config.h // cat << EOF>> config.h 表示将如下内容追加到config.h中,直到出现EOF为止,
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
EOF
exit 0 //退出
######################################################
#生成config.h文件如下:
# /* Automatically generated - do not edit */
# #define CONFIG_SYS_ARCH "arm"
# #define CONFIG_SYS_CPU "arm920t"
# #define CONFIG_SYS_BOARD "smdk2410"
# #define CONFIG_SYS_VENDOR "samsung"
# #define CONFIG_SYS_SOC "s3c24x0"
# #define CONFIG_BOARDDIRboard/samsung/smdk2410
# #include <config_cmd_defaults.h>
# #include <config_defaults.h>
# #include <configs/smdk2410.h>
# #include <asm/config.h>
# #include <config_fallbacks.h>
#####################################################
总结:
make smdk2410_config 的工作如下:
1.include/asm --> arch/arm/include/arm
2.include/asm/arch --> arch-s3c24x0
3.include/asm/proc --> proc-armv
4.在include目录下新建了config.mk文件,文件内容是ARCH CPU BOARD VENDOR SOC的定义
5.在include目录下新建了config.h文件
以make smdk2410_config为例:
(一)
make smdk4412_config指令在Makefile找到
%_config:: unconfig
@$(MKCONFIG) -A $(@:_config=)
但是发现
unconfig:
@rm -f$(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp \
$(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep
清除上次产生的*.Mk,*.h等文件
@$(MKCONFIG) -A $(@:_config=)
$(MKCONFIG)为当前目录
$(@:_config=)表示保留去除_config后的字符串,即是smdk4412,
将两个参数(A smdk4412)传入mkconfig中,并执行该文件。
(二)
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
}
set ${line}
# add default board name ifneeded
[ $# = 3 ] && set${line} ${1}
表示有两个参数,如果第一个参数是-A,就执行then语句,即在boards.cfg寻找第二个参数,如果没找到则打印"make: *** No rule tomake target \`$2_config'. Stop."
smdk4412 arm armv7 smdk4212 samsung exynos
$1 $2 $3 $4 $5 $6
(三)
while [ $# -gt 0 ] ; do //-gt表示“>”
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
表示参数大衣0个(参数从boards.cfg读取),且第一个参数为case in语句列表里的,执行相应的操作。
(四)
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1
如果参数小于4个或大于7个就退出。
(五)
CONFIG_NAME="${1%_config}" //将第一个值传给CONFIG_NAME=smdk4412
[ "${BOARD_NAME}" ] ||BOARD_NAME="${1%_config}"
arch="$2" //第二个参数赋值给arch
cpu=”$3” //第三个参数赋值给cpu
if [ "$4" = "-" ] ; then
board=${BOARD_NAME}
else
board="$4"
fi //如果第四个参数为“-“,即board为第四个参数
(六)
[ $# -gt 4 ] && [ "$5" != "-" ]&& vendor="$5" //如果第五个参数不等于“-“,则赋值$5。
[ $# -gt 5 ] && [ "$6" != "-" ]&& soc="$6" //如果第六个参数不等于“-“,则赋值$6。
[ $# -gt 6 ] && [ "$7" != "-" ]&& { //如果第七个参数不等于“-“,则执行如下。
tmp="${7%:*}"
if ["$tmp" ] ; then
CONFIG_NAME="$tmp"
fi
# Check if we onlyhave a colon...
if ["${tmp}" != "$7" ] ; then
options=${7#*:}
TARGETS="`echo${options} | sed 's:,: :g'` ${TARGETS}"
fi
}
if [ "${ARCH}" -a "${ARCH}" !="${arch}" ]; then//-a表示与逻辑,ARCH存在则检测ARCH、arch是否匹配
echo"Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}"1>&2
exit 1
fi
if [ "$options" ] ; then //我们并没定义options,因此配置成功
echo"Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options:${options}"
else
echo"Configuring for ${BOARD_NAME} board..."
fi
(七)
if [ "$SRCTREE" != "$OBJTREE" ] ; then
// SRCTREE和OBJTREE都是当前目录,则执行else
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
//进入include目录(后面的文件都进入这个文档)
rm -f asm
//删除asm链接
ln -s../arch/${arch}/include/asm asm //建立软链接,指向/arch/arm/inlcue/asm
fi
rm -f asm/arch
//删除include目录下的asm下的arch链接文件
if [ -z "${soc}" ] ; then //此处不为空soc=exynos),并新建asm/arch目录,让他指向arch-exynos目录
ln -s ${LNPREFIX}arch-${cpu}asm/arch
else
ln -s${LNPREFIX}arch-${soc} asm/arch //建立链接
fi
if [ "${arch}" = "arm" ] ; then //删除现有的asm/proc目录,并新建asm/proc目录,指向proc-armv目录
rm -f asm/proc
ln -s${LNPREFIX}proc-armv asm/proc //建立链接
fi
(八)
( echo "ARCH =${arch}"
if [ ! -z"$spl_cpu" ] ; then //如果$spl_cpu"长度不为真,则
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 //
将上述打印写入config.mk
if [ -z "${vendor}" ] ; then //为vendor变量不为空,所以执行else
BOARDDIR=${board}
else
BOARDDIR=${vendor}/${board}
fi
(九)
//在文件的最开头可以看到APPEND为no,所以这里我们在include文件夹下建立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
for i in ${TARGETS} ; do
//我们TARGETS为空,上面不执行了
i="`echo${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`"
echo"#define CONFIG_${i}" >>config.h ;
done
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 "#defineCONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
[ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h
cat << EOF >> config.h // cat << EOF>> config.h 表示将如下内容追加到config.h中,直到出现EOF为止,
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
EOF
exit 0 //退出
######################################################
#生成config.h文件如下:
# /* Automatically generated - do not edit */
# #define CONFIG_SYS_ARCH "arm"
# #define CONFIG_SYS_CPU "arm920t"
# #define CONFIG_SYS_BOARD "smdk2410"
# #define CONFIG_SYS_VENDOR "samsung"
# #define CONFIG_SYS_SOC "s3c24x0"
# #define CONFIG_BOARDDIRboard/samsung/smdk2410
# #include <config_cmd_defaults.h>
# #include <config_defaults.h>
# #include <configs/smdk2410.h>
# #include <asm/config.h>
# #include <config_fallbacks.h>
#####################################################
总结:
make smdk2410_config 的工作如下:
1.include/asm --> arch/arm/include/arm
2.include/asm/arch --> arch-s3c24x0
3.include/asm/proc --> proc-armv
4.在include目录下新建了config.mk文件,文件内容是ARCH CPU BOARD VENDOR SOC的定义
5.在include目录下新建了config.h文件
相关文章推荐
- 51单片机串口通信 环形缓冲区队列(FIFO)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- hdu 下沙小面的(2)(DFS)
- (学习总结)鸟哥基础篇第三版:第十八章
- linux下网络配置 命令
- java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException 的解决办法之一
- Oracle DataGuard学习笔记(1)DataGuard简介
- ubuntu16.04 LTS 配置jdk1.8出现的问题