uboot中的主makefile详细分析

mk脚本源码
make distclean //先清除uboot,防止我们拿到的版本是编译过的
make x210_sd_config //配置uboot成x210版本
make -j4 //多线程make


########################################################################
########################################################################


分析make x210_sd_config:

首先,这个目标在主makefile里面是这样子的

x210_sd_config :	unconfig
	@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
	@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
其中
MKCONFIG := $(SRCTREE)/mkconfig
当前目录下的makefile的配置文件
其次
$(@:_config=)的意思是得到$@清除_config之后的字符串,也就是得到x210_sd


#####################################################################
#####################################################################


我们先分析@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
mkconfig脚本我们传进去的参数
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
$# = 6
$1 = x210_sd
$2 = arm
$3 = s5pc11x
$4 = x210
$5 = samsung
$6 = s5pc110


源码关键之一(原地编译的情况之下):
cd ./include
rm -f asm
ln -s asm-$2 asm

进入根目录下的include
删除已有的asm符号链接

然后将asm-arm做成一个名为asm的符号链接


rm -f asm-$2/arch
删除asm-arm里面的arch符号链接

ln -s ${LNPREFIX}arch-$6 asm-$2/arch
将include下的arch-s5pc110做成符号链接asm-arm/arch


源码关键之二:
# create link for s5pc11x SoC
if [ "$3" = "s5pc11x" ] ; then
        rm -f regs.h
        ln -s $6.h regs.h
        rm -f asm-$2/arch
        ln -s arch-$3 asm-$2/arch
删除regs.h头文件
将当前目录下的s5pc110.h做成regs.h的符号链接
删除asm-arm/arch
将arch-s5pc11x文件夹做成asm-arm/arch符号链接


源码关键之三:
if [ "$2" = "arm" ] ; then
	rm -f asm-$2/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
删除当前目录下的asm-arm/proc
将当前目录下的proc-armv做成名为asm-arm/proc的符号链接


源码关键之四:
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
将信息打印到config.mk上以供主makefile使用
ARCH	= arm
CPU		= s5pc11x
BOARD	= x210
VENDOR	= samsung
SOC		= s5pc110
源码关键之五:
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
创建一个叫config.h的头文件
并且将信息打印到头文件中,这个头文件让我们写程序的时候调用
/* Automatically generated - do not edit */
#include <configs/x210_sd.h>
总结一下mkconfig做的事情:
进入根目录下的include将下面的做成符号链接:
1、asm-arm -> asm
2、asm-arm/arch -> asm/arch-s5pc11x
3、s5pc110.h -> regs.h
4、asm-arm/proc-armv -> asm-arm/proc
然后在当前目录include下生成config.mk文件,并打印以下信息到此文件上去
ARCH = arm
CPU = s5pc11x
BOARD = x210
VENDOR = samsung
SOC = s5pc110
最后,我们mkconfig脚本生成一个config.h文件让我们调用,并包含一下信息:
/* Automatically generated - do not edit */
#include <configs/x210_sd.h>
至此,mkconfig就完成工作了


#######################################################################
#######################################################################


再次回到主makefile中的x210_sd_config配置目标的第二条命令
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
这里将TEXT_BASE=0xc3e00000输出到我们的根目录下board/samsung/x210/config.mk的文件上,这里其实就牵扯上我们的s5pv210的链接脚本了。其实这是一个链接地址,供我们的主makefile使用,因为我们uboot的源码并不是全部都是位置无关码,而且我们的uboot是分前16kb和后面的剩余部分的,我们在链接脚本中会首先在代码段上将16kb所需要的.o文件往前放,之后的随便放,所以要写一个链接脚本


#######################################################################
#######################################################################


make x210_sd_config之后,我们就make -j4多线程编译了
现在我们来分析我们的uboot的主makefile


HOSTARCH:得到i386主机架构
HOSTOS:得到小写的linux
BUILD_DIR:这是我们用第二种方法来实现单独输出文件编译所特有的。原地编译不用管
OBJTREE:.o文件的目录,为当前目录,因为BUILD_DIR是空
CURDIR:这是make的内嵌变量,自动设置为当前目录(根目录)
SRCTREE:源码的目录,其实就是当前目录(根目录),SRCTREE := $(CURDIR)
TOPDIR:源码的顶层目录。即当根目录
LNDIR:链接目录。其实是根目录


MKCONFIG := $(SRCTREE)/mkconfig
当前目录下的makefile的配置文件


obj:=
src:=
上面的可以表示为当前目录.


主makefile关键之一:
include $(obj)include/config.mk
export	ARCH CPU BOARD VENDOR SOC
将我们之前make x210_sd_config配置的东西包含进主makefile中调用
并将他们都导出成为环境变量,以供其他的子makefile使用


主makefile关键之二:(这是移植uboot的非常关键的地方)
ifeq ($(ARCH),arm)
#CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
这里主makefile在配置我们的板子的架构,我们的架构为arm架构
CROSS_COMPILE是我们的交叉编译工具链的绝对路径
当然,如果我们导出了交叉编译工具链为linux的环境变量,并做了符号连接
那么我们就可以像上面的注释一样:
#CROSS_COMPILE = arm-linux-
这样做也不会错


export CROSS_COMPILE
最后导出CROSS_COMPILE作为环境变量以供子makefile使用


主makefile关键之三:
include $(TOPDIR)/config.mk
注意:这个config.mk是我们根目录下的,是我们uboot大神写的,并不是在配置中自动生成的
其中,这里将我们交叉编译工具链的东西包含了进来
AS	= $(CROSS_COMPILE)as
LD	= $(CROSS_COMPILE)ld
CC	= $(CROSS_COMPILE)gcc
CPP	= $(CC) -E
AR	= $(CROSS_COMPILE)ar
NM	= $(CROSS_COMPILE)nm
LDR	= $(CROSS_COMPILE)ldr
STRIP	= $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB	= $(CROSS_COMPILE)RANLIB
还有一点值得注意的是:
# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk


ifdef	ARCH
sinclude $(TOPDIR)/$(ARCH)_config.mk	# include architecture dependend rules
endif
ifdef	CPU
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk	# include  CPU	specific rules
endif
ifdef	SOC
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk	# include  SoC	specific rules
endif
ifdef	VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
endif
ifdef	BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk	# include board specific rules
endif
这里包含了我们很多的配置文件,但是有很多都是我们编译时的规范
其中有两个很特别
一个是:
sinclude $(OBJTREE)/include/autoconf.mk
这个autoconfig.mk里面包含了很多我们变量,其中有些变量类似于我们uboot的环境变量的设置时的参数
另一个是:
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif
这个config.mk是我们make x210_sd_config之后生成的文件
内容是:TEXT_BASE = 0xc3e00000
这个是我们uboot的链接地址
这个根目录下的config.mk就不一一解释了,很多都是编译时的规范


现在我们回到我们的主makefile
OBJ变量:这个变量是我们的生成uboot.bin的依赖,都是.o的依赖
LIBS变量:是我们编译时所需要的库,里面包含很多驱动


至此,主makefile我就分析到这里,有什么补充我会在增加

猜你喜欢

转载自blog.csdn.net/tanjialiang_/article/details/79223657