make tiny4412_config分析

来源:互联网 发布:西亚斯网络教学平台 编辑:程序博客网 时间:2024/05/18 13:06

在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 fileBOARD_NAME=""   # Name to print in make outputTARGETS=""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}fiwhile [ $# -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 ;;    esacdone/* *  $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 suffixesCONFIG_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 1fi/* *  有没有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 asmelse    cd ./include    rm -f asm    ln -s ../arch/${arch}/include/asm asmfirm -f asm/archif [ -z "${soc}" ] ; then    ln -s ${LNPREFIX}arch-${cpu} asm/archelse    ln -s ${LNPREFIX}arch-${soc} asm/archfi/* *  LNPREFIX为空,无作用 */if [ "${arch}" = "arm" ] ; then    rm -f asm/proc    ln -s ${LNPREFIX}proc-armv asm/procfi/* *  LNPREFIX为空,无作用 *//* *  4.创建make配置文件 */## Create include file for Make#echo "ARCH   = ${arch}"  >  config.mkecho "CPU    = ${cpu}"   >> config.mkecho "BOARD  = ${board}" >> config.mk[ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk[ "${soc}"    ] && echo "SOC    = ${soc}"    >> config.mk# Assign board directory to BOARDIR variableif [ -z "${vendor}" ] ; then    BOARDDIR=${board}else    BOARDDIR=${vendor}/${board}fi/* *  5.创建具体芯片板的头文件 */## Create board specific header file#if [ "$APPEND" = "yes" ]   # Append to existing config filethen    echo >> config.helse    > config.h      # Create new config filefiecho "/* Automatically generated - do not edit */" >>config.hfor i in ${TARGETS} ; do    i="`echo ${i} | sed '/=/ {s/=/\t/;q } ; { s/$/\t1/ }'`"    echo "#define CONFIG_${i}" >>config.h ;donecat << EOF >> config.h#define CONFIG_BOARDDIR board/$BOARDDIR#include <config_defaults.h>#include <configs/${CONFIG_NAME}.h>#include <asm/config.h>EOFexit 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文件

原创粉丝点击