码迷,mamicode.com
首页 > 其他好文 > 详细

u-boot 之配置分析 (2)

时间:2015-12-22 19:18:57      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

makefile简要分析
所有这些目录的编译连接都是由顶层目录的makefile来确定的。

1.在makefile中有:


unconfig:
 @rm -f $(obj)include/config.h $(obj)include/config.mk \
  $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp

 

%是个通配符,make xxx_config都是这个目标.目标的依赖是unconfig,

unconfig的命令是删除一些文件,而这些文正是从make xxx_config过程中产生的.unconfig就是清理配置的.

 

MKCONFIG := $(SRCTREE)/mkconfig

100ask24x0_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0         

 

 

等同为   ./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

$@就是指目标

$(@:_config=)是变量的替换引用

格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。

 

2.下面就是执行mkconfig脚本了

mkconfig文件:

./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

        $1    $2   $3   $4    $5  $6

OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE  := $(CURDIR)            
CURDIR是Makefile中的一个特殊参数,表示当前目录。所以,此句含义是决定使用BUILD_DIR还是CURDIR.

 

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"        #BOARD_NAME=100ask24x0    
$n 在linux脚本下为传入的参数第n个


[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1                    #目标参数小于4大于6退出

$# 参数的个数         -lt 小于  -gt 大于

echo "Configuring for ${BOARD_NAME} board..."
echo 打印

OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
如果定义 BUILD_DIR 等于 BUILD_DIR 否者为CURDIR

 cd ./include
 rm -f asm
 ln -s asm-$2 asm                      #ln -s asm-arm asm

删除原有asm建立一个链接文件 asm指向 asm-arm

 

 rm -f asm-$2/arch                       # rm -f asm-arm/arch
 
 if [ -z "$6" -o "$6" = "NULL" ] ;

如果$6为空或者等于null 
 ln -s ${LNPREFIX}arch-$6 asm-$2/arch           # ln -s arch-s3c24x0  asm-100ask24x0/arch

删除原有arch建立一个链接文件 arch指向 arch-s3c24x0 

 rm -f asm-$2/proc                     # rm -f asm-arm/proc
 ln -s ${LNPREFIX}proc-armv asm-$2/proc           # ln -s proc-armv asm-arm/proc

删除原有proc建立一个链接文件 proc指向 proc-armv

 

#

# Create include file for Make

#

echo "ARCH   = $2" >  config.mk

echo "CPU    = $3" >> config.mk

echo "BOARD  = $4" >> config.mk      

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

创建顶层Makefile包含的文件include/ 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
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h

创建开发板有关的头文件include/config.h    

内容为/* Automatically generated - do not edit */

#include <configs/100ask24x0.h>

 

现在总结回顾一下,配置命令 make smdk2410_config;实际执行 “./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0”命令

假设执行“./mkconfig $1    $2   $3   $4    $5  $6 ”命令。则产生如下结果。

(1) 开发板名称BOARD_NAME等于$1.

(2)创建到平台、开发板相关文件的链接,如如下所示;

    ln -s asm-$2 asm

    ln -s ${LNPREFIX}arch-$6 asm-$2/arch

    ln -s ${LNPREFIX}proc-armv asm-$2/proc  

(3)创建顶层Makefile包含的文件include/config.mk,如下所示:

    ARCH   = arm

    CPU    =arm920t

    BOARD  = 100ask24x0

    SOC    = s3c24x0

(4)创建开发板相关头文件include /config.h,如下所示:

    /* Automatically generated - do not edit */

    #include <configs/100ask24x0.h>

顶层makefile先调用各子目录的makefile,生成目标文件或者目标文件库。
然后再连接所有目标文件(库)生成最终的u-boot.bin。
连接的主要目标(库)如下:
OBJS  = cpu/$(CPU)/start.o 
LIBS  = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a /
 fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.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
LIBS += common/libcommon.a
LIBS += $(BOARDLIBS)
显然跟平台相关的主要是:
cpu/$(CPU)/start.o 
board/$(BOARDDIR)/lib$(BOARD).a 
cpu/$(CPU)/lib$(CPU).a
cpu/$(CPU)/$(SOC)/lib$(SOC).a 
lib_$(ARCH)/lib$(ARCH).a
这里面的四个变量定义在include/config.mk(见上述)。
其余的均与平台无关。
所以考虑移植的时候也主要考虑这几个目标文件(库)对应的目录。

 

u-boot 之配置分析 (2)

标签:

原文地址:http://www.cnblogs.com/CZM-/p/5067508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!