当前位置: 首页 > 工具软件 > tinyscript > 使用案例 >

make tiny4412_config分析

丌官子安
2023-12-01

在u-boot目录执行make相关操作会调用到Makefile文件。执行make tiny4412_config时,会匹配到如下:

%_config::      unconfig
        @$(MKCONFIG) -A $(@:_config=)

PS:%在makefile中是通配符,其后可以匹配任意字符。
    @表示不显示这条指令,在makefile中执行的指令都会显示出来
    $(MKCONFIG)在前面被设为mkconfig
    $@表示目标文件(XX_config),$(@:_config=)就是将XX_config中_config去掉

相当于执行:mkconfig -A tiny4412


分析mkconfig这个脚本:

#!/bin/sh -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-2010 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#

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

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

/*
 *  1.获取参数,在Makefile中传入的是mkconfig -A tiny4412   
 */

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
    }
/*
 *  egrep结果是得到boards.cfg中的这一行tiny4412                     arm                       armv7       tiny4412            samsung        exynos
 */ 
    set ${line}
/*
 *  将tiny4412                     arm                       armv7       tiny4412            samsung        exynos分别设置为$1-$6
 */
    # add default board name if needed
    [ $# = 3 ] && set ${line} ${1}
fi

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

/*
 *  $1不满足
 */

[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1

/*
 *  参数个数如果小于4或者大于7就会退出
 */

/*
 *  2.解析参数,CONFIG_NAME、BOARD_NAME=$1
 *           arch="$2"     
 *           cpu="$3"
 *           board="$4"
 *           vendor="$5"
 *           soc="$6"
 */

# Strip all options and/or _config suffixes
CONFIG_NAME="${1%_config}"

[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"

arch="$2"
cpu="$3"
if [ "$4" = "-" ] ; then
    board=${BOARD_NAME}
else
    board="$4"
fi
[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"
[ $# -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
}

/*
 *  没有$7
 */

if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then
    echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" 1>&2
    exit 1
fi

/*
 *  有没有ARCH
 */

if [ "$options" ] ; then
    echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"
else
    echo "Configuring for ${BOARD_NAME} board..."
fi

/*
 *  3.创建架构头文件链接
 *  ln -s ${SRCTREE}/arch/${arch}/include/asm ${SRCTREE}/include/asm
 */

#
# 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
    rm -f asm
    ln -s ${SRCTREE}/arch/${arch}/include/asm asm
else
    cd ./include
    rm -f asm
    ln -s ../arch/${arch}/include/asm asm
fi

rm -f asm/arch

if [ -z "${soc}" ] ; then
    ln -s ${LNPREFIX}arch-${cpu} asm/arch
else
    ln -s ${LNPREFIX}arch-${soc} asm/arch
fi

/*
 *  LNPREFIX为空,无作用
 */

if [ "${arch}" = "arm" ] ; then
    rm -f asm/proc
    ln -s ${LNPREFIX}proc-armv asm/proc
fi

/*
 *  LNPREFIX为空,无作用
 */

/*
 *  4.创建make配置文件
 */

#
# Create include file for Make
#
echo "ARCH   = ${arch}"  >  config.mk
echo "CPU    = ${cpu}"   >> config.mk
echo "BOARD  = ${board}" >> config.mk

[ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk

[ "${soc}"    ] && echo "SOC    = ${soc}"    >> config.mk

# Assign board directory to BOARDIR variable
if [ -z "${vendor}" ] ; then
    BOARDDIR=${board}
else
    BOARDDIR=${vendor}/${board}
fi

/*
 *  5.创建具体芯片板的头文件
 */


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

for i in ${TARGETS} ; do
    i="`echo ${i} | sed '/=/ {s/=/\t/;q } ; { s/$/\t1/ }'`"
    echo "#define CONFIG_${i}" >>config.h ;
done

cat << EOF >> config.h
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
EOF

exit 0

总结:
1.从boards.cfg中获取tiny4412对应的信息
tiny4412 arm armv7 tiny4412 samsung exynos
2.ln -s arch/arm/include/asm include/asm
3.在include目录下创建config.mk文件
4.在include目录下创建config.h文件

 类似资料: