u-boot分析之Makefile结构分析

我们分析一个文件的时候,想知道它是什么结构?是怎么链接的,最好的方法就是分析它的makefile文件。

之前说过u-boot配置、编译;

为什么知道先配置后编译?源码中有个readme文件;

先从makefile文件中分析一下配置过程;
u-boot分析之Makefile结构分析_第1张图片

执行make的时候,就相当执行这条命令:
这里写图片描述

我们先在Makefile文件中搜索一下 MKCONFIG看一下是什么东西?
u-boot分析之Makefile结构分析_第2张图片

从上可以看出,在源文件的目录下面有一个mkconfig文件;

我们执行配置命令的时候,就相当执行这条脚本命令:

这里写图片描述

接着需要打开mkconfig文件分析。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-2006 DENX Software Engineering, Wolfgang Denk 
#

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


#分析传入的参数里面有没有 "--",“-a”等
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有没有定义,如果没有则为:$1,其中$1为传入的第一个参数,依次类推

[ "${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
#

#如果这两个不相等,可以看一下makefile文件,这两个是从makefile里面来的
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-;配置的时候临时生成指向某一个架构,如果为i386架构,则为asm-i386
    ln -s asm-$2 asm
fi

rm -f asm-$2/arch

#如果第六个参数为NULL或者为空
if [ -z "$6" -o "$6" = "NULL" ] ; then
    ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
    #我们这里执行这个分支
    #建立一个链接文件,指向${LNPREFIX}arch-$6,其中$6为传进来的参数
    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
#
#新建一个config.mk文件,> 表示新建
echo "ARCH   = $2" >  config.mk
#在config.mk追加, >> 表示追加
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk


#判断第5个参数,追加 VENDOR = xx 
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk


#判断第6个参数,追加 SOC    =  xx
[ "$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

#把以下内容追加到config.h文件中去
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include $1.h>" >>config.h
#其中 #include   就是生成的配置文件

exit 0

配置过程分析完毕;

接着分析一下编译过程,在makefile文件里面,有如下代码:

include $(OBJTREE)/include/config.mk

这里的config.mk就是上面配置生成的配置文件,这就将配置与编译结合起来了;

继续往下查看makefile文件

#########################################################################
# U-Boot objects....order is important (i.e. start must be first)

OBJS  = cpu/$(CPU)/start.o

把所有编译好了的文件打包一个.a库

LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

all:        $(ALL)

$(obj)u-boot.hex:	$(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@

$(obj)u-boot.srec:	$(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@

$(obj)u-boot.bin:	$(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

$(obj)u-boot.img:	$(obj)u-boot.bin
        ./tools/mkimage -A $(ARCH) -T firmware -C none \
        -a $(TEXT_BASE) -e 0 \
        -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
            sed -e 's/"[     ]*$$/ for $(BOARD) board"/') \
        -d $< $@

$(obj)u-boot.dis:	$(obj)u-boot
        $(OBJDUMP) -d $< > $@

$(obj)u-boot:		depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
        UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
        cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
            --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
            -Map u-boot.map -o u-boot

生成了u-boot.bin文件,生成的依赖于u-boot,…..

u-boot分析之Makefile结构分析_第3张图片

你可能感兴趣的:(嵌入式学习笔记)