Uboot Makefile 代码笔记(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SilverFOX111/article/details/86438851

1. 24-29行代码

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
  • VERSION : 主版本号
  • PATCHLEVEL : 副版本号
  • SUBLEVEL : 二级副版本号
  • EXTRAVERSION : 自定义版本
    U_BOOT_VERSION由以上几个版本号组成总版本号
    VERSION_FILE在执行make命令后会生成,里面的内容即版本信息

2. 31-43行代码

HOSTARCH := $(shell uname -m | \
	sed -e s/i.86/i386/ \
	    -e s/sun4u/sparc64/ \
	    -e s/arm.*/arm/ \
	    -e s/sa110/arm/ \
	    -e s/powerpc/ppc/ \
	    -e s/ppc64/ppc/ \
	    -e s/macppc/ppc/)

HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
	    sed -e 's/\(cygwin\).*/cygwin/')

export	HOSTARCH HOSTOS
  • HOSTARCH : 主机CPU的架构
  • HOSTOS : 主机操作系统
    uname用于显示当前操作系统名称,-m显示硬件运行系统的机器 ID 号,-s显示系统名,标志缺省为开,其他详见uname详解
    | 是Linux的管道符,关于它的妙用可以参考博客
    sed 命令是用于处理文件内容的指令,-e可有可无,表示按照s/i.86/i386/处理管道输入的内容,s表示替换操作,大意为将内容中i.86格式的字符串替换为i386,其他用法详见sed命令详解
    tr 主要用于字符串修改,tr ‘[:upper:]’ ‘[:lower:]’ 相当于tr ‘[A-Z]’ ‘[a-z]’,用于将大写变小写,其他详见tr命令详解
    export 将HOSTARCH与HOSTOS两个变量导出到环境变量。

3. 50-54行代码

ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
  • XECHO 决定了Uboot是否静默编译
    findstring 是Makefile中查找字符串的函数,成功返回查找的字符串,否则返回空串。
  • MAKEFLAGS 是Makefile自动生成的变量,用于传递参数,终端输入make -s 即可达到静默编译的效果。

4. 78-122行代码

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		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE		:= $(CURDIR)
TOPDIR		:= $(SRCTREE)
LNDIR		:= $(OBJTREE)
export	TOPDIR SRCTREE OBJTREE

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG

ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD	:= 1
export REMOTE_BUILD
endif

# $(obj) and (src) are defined in config.mk but here in main Makefile
# we also need them before config.mk is included which is the case for
# some targets like unconfig, clean, clobber, distclean, etc.
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src

# Make sure CDPATH settings don't interfere
unexport CDPATH

这一段代码目的主要是设置了两种目标文件生成方式,一种是命令行输入make O=[object path] all ,另一种是通过导出环境变量

export BUILD_DIR=[object path]  
make all

若不按照上述方式设置,默认目标文件输出到源代码目录,此外第一种方式优先级高于第二种方式。还需注意的地方是,若按上述第一种方式生成目标文件时,在配置和清空目录时也需要加上O=xx。

make O=./output/ distclean   
make O=./output/ x210_sd_config  
make O=./output/ all

origin 函数用于返回变量在哪“出生”的。
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) 中 -d 用于判断文件目录是否存在,不在就创建一个。
$(if [condition] , then part , else part) 是Makefile中典型的if语句 。

5. 130-185行代码

ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
#第464行#endif 

# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export	ARCH CPU BOARD VENDOR SOC

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

# load other configuration
include $(TOPDIR)/config.mk

第一句用于检查config.mk文件是否创建,内容为:

ARCH   = xxx
CPU    = xxx
BOARD  = xxx
VENDOR = xxx
SOC    = xxx

如果创建成功,执行133-464行代码。export ARCH CPU BOARD VENDOR SOC 导出 ARC, CPU, BOARD, VENDOR, SOC 5个环境变量。这几个变量是在2589-2591行配置的,具体如下:

x210_sd_config :	unconfig
	@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
	@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
  • MKCONFIG 是config.mk的所在文件路径。
    第二行执行mkconfig脚本文件,$(@:_config=)将x210_sd_config改为x210_sd,详解点击此处
  • CROSS_COMPILE 是编译交叉工具链的前缀,可以在命令行设置make CROSS_COMPILE=[path] ,并且具有最高优先级,可以覆盖Makefile中的定义。ifeq ($(HOSTARCH),$(ARCH)) 用于判断主机CPU架构与被调试机的CPU架构是否一致,不一致则需设置新的CROSS_COMPILE,一致不需要设置。140-178行设置为符合ARCH的工具链。

猜你喜欢

转载自blog.csdn.net/SilverFOX111/article/details/86438851
今日推荐