uboot移植:uboot下的主Makefile解析

来源:互联网 发布:成都多益网络面试通知 编辑:程序博客网 时间:2024/05/22 10:45
一,环境变量HOSTARCH,HOSTOS(P31)
##sed为替换命令,如s/i.86/i386 表示将包含i_86的字段替换成i386
##uname 将正在使用的操作系统名写到标准输出中
##-m显示硬件运行系统的机器 ID 号
HOSTARCH := $(shell uname -m | \
sed -e s/i.86/i386/ \

##tr '[:upper:]' '[:lower:]'将标准输入中的所有大写字母转换为响应的小写字母
## uname -s 显示主机内核名字
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')

##HOSTARCH HOSTOS两个环境变量是主机的操作系统和主机的CPU架构
export HOSTARCH HOSTOS


二,静默编译
##make -s作为MAKEFLAGS传给Makefile,使得XECHO变量变为空(默认等于echo)
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif


三,在Makefile中的两种编译方法(P78-P123)
##编译方法的选择:默认为原地编译(原目录下),另一种方法是指定输出文件夹的编译(将所有编译生成的文件放到该输出目录)
##指定输出文件夹编译的两种方法:
#① make O=输出目录 (在命令行)
#② export BUILD_DIR=输出目录 (在Makefile中)
##当两种指定输出文件编译的方法同时指定目录时,第一种的优先级高,编译输出到“O=”后面的目录
ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)


四,目录OBJTREE和SRCTREE(P95)
##TREE表示根目录
##OBJTREE:编译出来的.o文件存放目录的根目录。在默认编译下,OBJTREE等于当前目录
# 在O=xx的编译下,OBJTREE等于我们设置的那个输出目录
##SRCTREE:源码目录,就是源代码的根目录,也就是当前目录(存放Makefile的目录)
# 在默认编译下,OBJTREE和SRCTREE相等
##这两个环境变量的定义就是为了实现指定输出目录的那种编译方式
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE


五,变量MKCONFIG(P101)
##MKCONFIG是源码根目录下定义的脚本(mkconfig),这个脚本是uboot配置阶段的配置脚本
MKCONFIG := $(SRCTREE)/mkconfig


六,obj和src的赋值(P109)
##通过OBJTREE和SRCTREE的值来判断编译的模式,并对obj和src进行变量赋值
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src


七,config.mk的生成(P130)
##/include/config.mk不是源码自带的,是在配置过程中生成的,因此该文件的值与配置过程有关
##config.mk的内容为:
#APCH = arm
#CPU = s5pc11x
#BOARD = GEC210
#RENDOR = samsung
#SOC =s5pc110
##export导出了以上5个变量作为环境变量,通过这种定义方法,使得这5个值可以被集中配置
##ARCH CPU BOARD VENDOR SOC的配置值来自配置项(Makefile下搜索gec210_sd_config 可得)
##由mkconfig(P123-129)创建的config.mk在此处包含
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC //(P134)

##ARCH CPU BOARD VENDOR SOC环境变量的配置 (P2589)
gec210_sd_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x gec210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
##$(@:_config=)分析:
#&@在这里代替的对象为目标gec210_sd_config
#":"表示对对它进行加工,将"="前面的部分替换成"="后面的部分
#$(@:_config=)表示为将gec210_sd_config后面的_confi替换成空,则结果是gec210_sd
##执行过程和结果:
## 执行了mkconfig脚本,并将传入6个参数
## $# = 6
# $1 = gec210_sd $2 = arm $3 = s5pc11x $4 = gec210 $5 = samsumg $6 = s5pc110


八,CROSS_COMPILE和ARCH的关系(P136)
#ARCH的意义是定义当前编译的目标CPU架构(arm)
##CROSS_COMPILE是定义交叉编译工具链的前缀的,前缀是为了后面使用
# (用前缀+后缀来定义编译过程用到的各种工具链的工具)
##将前后缀分开的原因是:便于区分各种CPU架构,以实现可移植性
# (在不同CPU架构上的交叉编译工具链,只是前缀不同,后缀都相同)
##CROSS_COMPILE是被ARCH所确定的
# (只要配置了ARCH,便只能去ARM的分支下去设置CROSS_COMPILE的值
# 只要能通过CROSS_COMPILE找到交叉编译工具链,绝对路径和相对路径都可以
# 若将工具链导出到环境变量,并且设置了符号链接,则令CROSS_COMPILE = arm-linux- 就可以)
##实际工程中,也可以在Makefile中去更改设置CROSS_COMPILE的值
# 通过CROSS_COMPILE=xxxx使得编译是传参的方法可以覆盖Makefile里面的设置
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm)

##在config.mk大量引用
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-


九,config.mk的引入(P185)
##在mkconfig(P121)中创建并进行编辑##
##TOPDIR为最高层目录,也就是主目录,引入文件config.mk(非常重要)
include $(TOPDIR)/config.mk
######转至config.mk中的111行######
######关于config.mk的解析转至<uboot移植:uboot下的config.mk>######


十,第一个目标all(P291)
##主Makefile的第一个目标all(在uboot目录下make其实就等于make all,就等于make这个目标)
all: $(ALL)


十一,unconfig的作用(P473)
##unconfig作为我们为各个开发板配置目标的依赖,使得多个开发板可以多次配置
##根据makefile规则的定义,GNU Make在处理这条规则的时候,先判断其依赖——也就是unconfig是否需要更新。
#再看看unconfig的规则,由于目录下没有一个叫unconfig的文件存在,
#所以和unconfig相关的这条规则总是得到处理,也就是其中的rm命令总是得到执行,
#该命令的目的是删除一些配置编译过程中产生的文件。
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep \
$(obj)board/$(VENDOR)/$(BOARD)/config.mk