Uboot Makefile 分析
======
1. make smdk2410_config 执行过程
Makefile 目标内容:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
替换后
smdk2410_config : unconfig
mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
1. 执行 unconfig 依赖
unconfig:
@rm -f include/config.h include/config.mk \
board/*/config.tmp board/*/*/config.tmp
删除生成的文件,如: config.h, config.mk config.tmp
2. 执行脚本,生成头文件和链接配置
Parameters: Target Architecture CPU Board [VENDOR] [SOC]
mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
将 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]
BOARD_NAME="$1"
echo "Configuring for ${BOARD_NAME} board..."
#
# Create link to architecture specific headers
#
cd ./include
rm -f asm
ln -s asm-$2 asm
rm -f asm-$2/arch
ln -s arch-$6 asm-$2/arch
rm -f asm-$2/proc
ln -s proc-armv asm-$2/proc
#
# Create include file for Make
#
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
echo "SOC = $6" >> config.mk
#
# Create board specific header file
#
> config.h # Create new config file
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
exit 0
```
mkconfig 脚本效果:
1. 在include目录下成链接文件
asm -> asm-arm
asm-arm/arch -> arch-s3c24x0
asm-arm/proc -> proc-armv
2. 在 include 目录下生成 config.mk 和 config.h 文件
config.mk
```
ARCH = arm
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0
```
config.h
```
#include <configs/smdk2410.h>
```
2. make 编译过程
make 默认目标为 all
```
all: u-boot.srec u-boot.bin System.map
```
all 目标依赖于 u-boot.srec, u-boot.bin, System.map
1. 目标:u-boot.srec
```
u-boot.srec: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
```
依赖于 u-boot
1. 目标 u-boot
```
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
```
依赖于 depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
1. 目标 depend
在 tools examples post post/cpu 目录下生成文件 .depend ,包含了各个目标的依赖
2. 目标 version
生成 include/version_autogenerated.h ,包含为 版本号
3. 目标 $(SUBDIRS)
SUBDIRS = tools examples post post/cpu
进入各个目录执行make all
4. 目标 $(OBJS)
OBJS = cpu/$(CPU)/start.o
uboot 启动代码
5. 目标 $(LIBS)
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
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
编译依赖的库
6. 目标 $(LDSCRIPT)
2. 目标: u-boot.bin
u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
3. 目标: System.map
System.map: $(obj)u-boot
@$(NM) $< | \
grep -v '\(compiled\)|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)|\(LASH[RL]DI\)' | \
sort > $(obj)System.map