u-boot之顶层Makefile分析(一)

顶层Makefile差不多3200,接下来详细分析这个文件。

u-boot版本以及环境变量

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

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/')
#$(error HOSTARCH = $(HOSTARCH)  HOSTOS = $(HOSTOS) "WAITING for value!")
export	HOSTARCH HOSTOS

# Deal with colliding definitions from tcsh etc.
VENDOR=
  • 最前面三个变量组合成一个U_BOOT_VERSION变量,形成了u-boot的版本号,这个版本号最后存储在include/version_autogenerated.h文件中。打开后其内容为#define U_BOOT_VERSION "U-Boot 1.3.4"
  • sed的sed s/i.86/i386/是一种替换语法,意思是将i.86替换成i386,例如echo "33i.86" | sed s/i.86/i386/的输出结果为33i386,sed中-e的意思是可以多个替换同时进行。
  • uname -m是显示Linux的架构,例如当前虚拟机的命令结果为x86_64,从值可以看出并没有i.86,sun4u,…,macppc,所以HOSTARCH的值就等于uname -m的输出结果。
  • uname -s是显示内核名称,因此这里显示"Linux",tr '[:upper:]' '[:lower:]'命令的结果是将所有字母都设置成小写。则最后HOSTOS的值为linux
  • 为了验证判断的是否正确,可以打开export上一行的注释。意思是Makefile执行到这句之后停止(将 error换成info之后将不停止),并输出这两个变量值。
  • 取消上述注释后运行make,则结果为Makefile:43: *** HOSTARCH = x86_64 HOSTOS = linux "WAITING for value!"。 停止。,因此我们的分析是正确的。
  • 然后将HOSTARCHHOSTOS导出(export)为环境变量,以便让子shell使用。
  • 定义VENDOR变量为空

静默编译

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif

当我们使用make -s命令编译u-boot时将不输出任何信息,视为静默编译

设置单独的编译输出文件夹

#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
#
# 1) Add O= to the make command line
# 'make O=/tmp/build all'
#
# 2) Set environement variable BUILD_DIR to point to the desired location
# 'export BUILD_DIR=/tmp/build'
# 'make'
#
# The second approach can also be used with a MAKEALL script
# 'export BUILD_DIR=/tmp/build'
# './MAKEALL'
#
# Command line 'O=' setting overrides BUILD_DIR environent variable.
#
# When none of the above methods is used the local build is performed and
# the object files are placed in the source directory.
#

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),)

从最开始的注释可以看出来,u-boot是支持将源代码目录与编译生成的目录分开存放的,但是厂商在移植的时候似乎放弃了这个功能,无论我如何试都没有成功,因此这里就不再讲了,只是为了完整性放在这里。

几个重要的变量

OBJTREE		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE		:= $(CURDIR)
TOPDIR		:= $(SRCTREE)
LNDIR		:= $(OBJTREE)
export	TOPDIR SRCTREE OBJTREE

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG
#$(info OBJTREE = $(OBJTREE))
#$(info SRCTREE = $(SRCTREE))
#$(error )

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
  • 上述代码会产生编译出来的文件储存根目录(OBJTREE)以后源码根目录(SRCTREE)。由于我们并没有设置不同的目录,所以两个的值都是一样的,取消注释后会看到运行结果。
  • 设置MKCONFIG变量,定义源码路径下的mkconfig文件
  • 由于OBJTREE值与SRCTREE值相同,则obj,srcREMOTE_BUILD三个变量皆为空。

Makefile分析卡住了

ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
  • 在u-boot顶层目录使用命令make distclean删除全部生成文件。
  • 然后使用make会发现报System not configured - see README错误。这是由于没有上述的config.mk文件造成的。
  • 在我们的uboot环境搭建与编译一文中,make之前只进行了make x210_sd_config命令,因此config.mk文件是在此命令之后生成的。
  • 接下来我们分析该文件的生成过程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贱贱的剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值