X210之uboot源码分析

uboot源码分析

Makefile分析1

自己参考源码。

Makefile分析2

ifdef O
ifeq ("$(origin O)", "command line")    
BUILD_DIR := $(O)
endif
endif
    
/*如果定义了O变量,且定义O变量的方式是以命令行方式定义的,如: make O=tmp/builder,就将这个O变量值赋给BUILD_DIR变量如果O变量没有被定义,则上面语句不被执行。*/
ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)
    
/*如果BUILD_DIR不为空,就将BUILD_DIR的变量值赋给saved-output*/
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
    
/*	1. 此条命令——检测BUILD_DIR是否是一个目录,如果不存在则创建这个BUILD_DIR对应的目录
	2. []和test测试命令一样,Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试;
	3. -d的作用——如果文件存在且为目录则为真
	4. ||运算符——如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||		那么就执行这个命令。mkdir的-p参数——需要时创建上层目录,如目录早已存在则不当作错误,例如,我们要在当前目录创建目录		   Projects/a/src,使用命令mkdir -p Project/a/src,例如想要建立目录Project,其中含有4个文件夹a, b, c, d,且这4个文		 件都含有一个src文件夹。使用命令mkdir -p Project/{a,b,c,d}/src
	
*/
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)  
    
/* 如果能cd $(BUILD_DIR),则输出这个目录的路径;&&运算符——左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。 
*/

$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
 endif # ifneq ($(BUILD_DIR),)
    
/*
	检测BUILD_DIR是否为空,如果为空则提示错误并终止make
 	if函数——$(if CONDITION,THEN-PART[,ELSE-PART]).如果“CONDITION”的展开结果非空,则将第二个参数“THEN-PART”作为函数计	算表达式;“CONDITION”的展开结果为空,则执行第三个参数。error——$(error TEXT...)产生致命错	误,并提示“TEXT...”信息给	 用户,并退出make执行,没有返回值。

*/

参考博文

https://www.cnblogs.com/AndyChen1/p/8341136.html

https://www.cnblogs.com/Rainingday/p/7661937.html

Makefile分析3

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG
/*定义一个变量(这里定义,后面使用),它的值是源码根目录下的mkconfig(mkconfig是一个脚本,是uboot配置阶段的配置脚本)*/
ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
//在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...) 。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。(总结:用来展开文件列表)
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export	ARCH CPU BOARD VENDOR SOC
/*(1)include/config.mk不是源码自带的(也就是说,在没有编译的源码目录下是找不到这个文件的),是在配置过程中自动生成(也就是x210_sd_config中生成的)。
  (2)这里export只是导出环境变量,这里还没有给出5个环境变量的值(原因:我们希望这5个值可以轻易的被集中配置),下面的配置值来自主Makefile的2589行那调用MKCONFIG脚本传参时的参数。
*/

//config.mk生成的内容:
/*ARCH   = arm
  CPU    = s5pc11x
  BOARD  = x210
  VERDOR = samsung
  SOC    = s5pc110

*/
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
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
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
ifeq ($(ARCH),mips)
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2)
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)
CROSS_COMPILE = m68k-elf-
endif
ifeq ($(ARCH),microblaze)
CROSS_COMPILE = mb-
endif
ifeq ($(ARCH),blackfin)
CROSS_COMPILE = bfin-uclinux-
endif
ifeq ($(ARCH),avr32)
CROSS_COMPILE = avr32-linux-
endif
ifeq ($(ARCH),sh)
CROSS_COMPILE = sh4-linux-
endif
ifeq ($(ARCH),sparc)
CROSS_COMPILE = sparc-elf-
endif	# sparc
endif	# HOSTARCH,ARCH
endif	# CROSS_COMPILE

export	CROSS_COMPILE
/*(1)CROSS_COMPILE是定义交叉编译工具链的前缀,
  (2)注意的点是:
  		1.HOSTARCH是开头export导出的主机架构。
		2.ifndef CROSS_COMPILE的意思是如果外部没有定义CROSS_COMPILE则执行下面的代码判断出			  CROSS_COMPILE,如果在编译时用make CROSS_COMPILE = xxx来设置,则可以覆盖makefile		  里面的设置
*/

Makefile分析4

include $(TOPDIR)/config.mk    //主Makefile185行,导入一个config.mk

config.mk比较重要的部分:

//(1)编译工具的定义(97-107行)
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
//(2)开发板配置项目
# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk
    
/*autoconf.mk一些注意的点:
	(1)autoconf.mk文件不是源码提供的,是是配置过程中自动生成的
	(2)作用:用来指导整个uboot的编译过程(autoconf.mk文件里面是定义的一些CONFIG_开头的宏),而这		  些宏会影响编译过程的走向(原因:是因为条件编译)。
    (3)autoconf.mk文件产生需要原材料(原材料目录:include/configs/xxx.h头文件)这个h头文件里面		  全是宏定义,这些宏定义就是对当前开发板的移植(每个开发板的移植都对应这个目录下的一个头文		   件)。
*/
//(3)链接脚本(142-149行)
ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
endif
/*如果定义了宏CONFIG_NAND_U_BOOT,则链接脚本叫u-boot-nand.lds,否则为u-boot.lds
我们的开发板是iNand版本,所以这个宏不存在。因此在board/samsung/x210目录下有u-boot.lds链接脚本,


*/   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值