×
单片机 > 单片机程序设计 > 详情

TQ210 —— S5PV210 uboot顶层Makefile分析

发布时间:2024-05-21 发布时间:
|

#

# (C) Copyright 2000-2008

# Wolfgang Denk, DENX Software Engineering, wd@denx.de.

#

# See file CREDITS for list of people who contributed to this

# project.

#

# This program is free software; you can redistribute it and/or

# modify it under the terms of the GNU General Public License as

# published by the Free Software Foundatio; either version 2 of

# the License, or (at your option) any later version.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program; if not, write to the Free Software

# Foundation, Inc., 59 Temple Place, Suite 330, Boston,

# MA 02111-1307 USA

#

##################################################################################

# U_BOOT_VERSION = 1.3.4

# 从2008年10月,发行版的名称的含义发生了变化,从数字版本号变为使用时间戳作为版本号,

# 使用发布年份和月份确定发布的版本号(VERSION和PATCHLEVEL),

# (SUBLEVEL和EXTRAVERSION)表示候选发布版或修复bug了的稳定版本

# 指定时间信息头文件和版本信息头文件

VERSION = 1

PATCHLEVEL = 3

SUBLEVEL = 4

EXTRAVERSION =

U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

VERSION_FILE = $(obj)include/version_autogenerated.h

##################################################################################################################

# HOSTARCH这个变量的赋值,是通过执行一套shell程序来完成的,其中$(shell xxx)的语法就是在shell中执行xxx的命令.

# 这里的'|'就是linux中的管道处理符,''就是换行的连接符,表示下一行与本行是同行程序处理. uname -m,得到机器硬件名。

# sed -e允许在同一行里执行多条命令,就是表示后面跟的是一串命令脚本,s/abc/def/的命令表达式,

# 就是表示要从标准输入中,查找到内容为abc的,然后替换成def。例如电脑使用Intel Core2系列的CPU,因此"uname –m"

# 输出"i686"。 "i686"可以匹配命令"sed -e s/i.86/i386/"中的"i.86",因此在执行Makefile时,HOSTARCH将被设置成"i386" 。

# 这样执行这一套程序下来,就知道了机器的硬件体系了。

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

##########################################################################################

# "uname –s"输出主机内核名字,因此"uname –s"结果是"Linux"。

# "tr '[:upper:]' '[:lower:]'"作用是将标准输入中的所有大写字母转换为响应的小写字母。

# 结果是将HOSTOS = "linux"

HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' |

sed -e 's/(cygwin).*/cygwin/')

#########################################################################

# export等价于C中的extern,即变量全局可用,这样这些变量将设置成环境变量

# export的作用就是将自定义变量转成环境变量【环境变量就是在哪里都能用】

export HOSTARCH HOSTOS

# Deal with colliding definitions from tcsh etc.

# 定义生产厂家名称

VENDOR=

#########################################################################

# Allow for silent builds

################################################################################

# 检查是否禁止在编译过程中向终端输出信息,findstring函数检查MAKEFLAGS是否为参数s

# 如编译uboot时,输入make -s,则MAKEFLAGS = s,执行XECHO = echo,即输出编译信息

# 否则XECHO = :,不输出编译信息

ifeq (,$(findstring s,$(MAKEFLAGS)))

XECHO = echo

else

XECHO = :

endif

#########################################################################

#

# 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.

#

#########################################################################

# U-boot支持定义源码及生成的目标文件存放的目录的功能。有两种方法可以实现:

# 1)指定编译参数 O=目录,例如:make O= /tmp/build all

# 2)设置环境变量BUILD_DIR,该变量指定目录并设置为设置为环境变量

# 例如:export BUILD_DIR=/tmp/build 然后 make

# 第二种方法同样可以用在一个 MAKEALL脚本

# 例如:export BUILD_DIR=/tmp/build 然后执行之 ./MAKEALL

# 命令行参数的设置会覆盖到 BUILD_DIR这一环境变量

# 如果不指定任何目录,则编译生成的目标文件存放在源代码的顶层目录下

#

# 如果参数O不为空(即使用了O参数),则利用函数origin返回的参数O的来源

# 函数$( origin, variable) 输出的结果是一个字符串,输出结果由变量variable定义的方式决定,

# 若variable在命令行中定义过,则origin函数返回值为"command line"。

# 假若在命令行中执行了“export BUILD_DIR=/tmp/build”的命令,则“$(origin O)”值为“command line”,

# 而BUILD_DIR被设置为“/tmp/build”。

ifdef O

ifeq ("$(origin O)", "command line")

BUILD_DIR := $(O)

endif

endif

#########################################################################

# 如果BUILD_DIR不为空,则将BUILD_DIR路径保存到saved-output中

ifneq ($(BUILD_DIR),)

saved-output := $(BUILD_DIR)

# Attempt to create a output directory.

# 如果BUILD_DIR不存在,则创建BUILD_DIR目录

$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# Verify if it was successful.

###############################################################################

# 执行cd命令进入BUILD_DIR目录,然后执行pwd命令得到当前目录路径【防止创建失败】

# if(a, b, c) —— 判断a的真假,为真执行b,为假执行c(类似三目运算符)

# 这段意思是如果BUILD_DIR创建成功,则什么不做,失败则返回error这段错误代码

BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)

$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))

endif # ifneq ($(BUILD_DIR),)

#########################################################################

# 普通的变量赋值,OBJTREE和LNDIR存放生成文件的目录,SRCTREE和TOPDIR为源码

# 目录,CURDIR变量指示当前的工作目录【uboot顶层目录】

# export将这些变量设置成环境变量

OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))

SRCTREE := $(CURDIR)

TOPDIR := $(SRCTREE)

LNDIR := $(OBJTREE)

export TOPDIR SRCTREE OBJTREE

#########################################################################

# MKCONFIG指向源码根目录下的mkconfig脚本文件,并设置为设置为环境变量

MKCONFIG := $(SRCTREE)/mkconfig

export MKCONFIG

#################################################################################

# 如果存放生成文件的目录和源码目录相同则REMOTE_BUILD = 1,并设置为设置为环境变量

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.

# $(obj)和$(src)在config.mk中有定义,但是在包含config.mk之前主Makefile在执行某些目标

# 如unconfig, clean, clobber, distclean, etc等的时候同样需要$(obj)和$(src)

#

# 如果OBJTREE和SRCTREE不同目录,则指定obj和src为OBJTREE和SRCTREE目录,

# obj:编译文件的输出目录,src:uboot代码顶层目录

# 作为编译输出文件的存放目录,一般OBJTREE和SRCTREE是相同的路径,否则obj和src为空

# 设置obj和src为环境变量

ifneq ($(OBJTREE),$(SRCTREE))

obj := $(OBJTREE)/

src := $(SRCTREE)/

else

obj :=

src :=

endif

export obj src

# Make sure CDPATH settings don't interfere

# 撤销CDPATH为环境变量,设置其为文件私有,为了防止冲突

unexport CDPATH

#########################################################################

# 如果ARCH等价于powerpc,则ARCH等于ppc

ifeq ($(ARCH),powerpc)

ARCH = ppc

endif

##################################################################################################

# 检查include目录下是否存在config.mk文件,【wildcard函数是取匹配模式的文件名】

# 如果include下存在config.mk文件,则$(wildcard $(obj)include/config.mk)就会

# 返回$(obj)include/config.mk,如果不存在config.mk文件,则返回值为空。

# include目录下是否存在config.mk文件。

# 为什么要检查config.mk存在与否呢?原因是:我们在编译U-boot前必须配置目标板的信息,也就是要执行

# make

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ..[13]
TQ210S5PV210uboot顶层Makefile分析

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于arm的指纹识别门禁系统是如何设计的