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链接脚本,
*/