uboot顶层Makefile前期所做工作说明二

一.  uboot顶层 Makefile文件

uboot顶层 Makefile,就是 uboot源码工程的根目录下的  Makefile文件。

本文继续对 uboot顶层 Makefile的前期准备工作进行介绍。续上一篇文章内容的学习,如下:

uboot顶层Makefile前期所做工作说明一_凌肖战的博客-CSDN博客

本文主要了解 uboot顶层 Makefile的前提部分内容,包括如下:

代码检查,模块编译,获取主机架构与系统,设置目标架构、交叉编译器与配置文件。

二.   Makefile 前期所做的内容

5.   代码检查

uboot 支持代码检查,使用命令 make C=1 使能代码检查,检查那些需要重新编译的文

件。make C=2用于检查所有的源码文件,顶层 Makefile 中的代码如下:

176 ifeq ("$(origin C)", "command line")
177 KBUILD_CHECKSRC = $(C)
178 endif
179 ifndef KBUILD_CHECKSRC
180 KBUILD_CHECKSRC = 0
181 endif
176 行判断 C 是否来源于命令行,如果 C 来源于命令行,那就将 C 赋值给变量
KBUILD_CHECKSRC ,如果命令行没有 C 的话 KBUILD_CHECKSRC 就为 0

6.  模块编译

uboot 中允许单独编译某个模块,使用 “make M=dir” 命令即可,旧语法 “make SUBDIRS=dir ” 命令也是支持的。顶层 Makefile 中的代码如下:
186 ifdef SUBDIRS
187 KBUILD_EXTMOD ?= $(SUBDIRS)
188 endif
189
190 ifeq ("$(origin M)", "command line")
191 KBUILD_EXTMOD := $(M)
192 endif
193
194 # If building an external module we do not care about the all: rule
195 # but instead _all depend on modules
196 PHONY += all
197 ifeq ($(KBUILD_EXTMOD),)
198 _all: all
199 else
200 _all: modules
201 endif
202
203 ifeq ($(KBUILD_SRC),)
204 # building in the source tree
205 srctree := .
206 else
207 ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
208 # building in a subdirectory of the source tree
209 srctree := ..
210 else
211 srctree := $(KBUILD_SRC)
212 endif
213 endif
214 objtree := .
215 src := $(srctree)
216 obj := $(objtree)
217
218 VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
219
220 export srctree objtree VPATH

186 行 判 断 是 否 定 义 了 SUBDIRS , 如 果 定 义 了 SUBDIRS , 变 量

KBUILD_EXTMOD=SUBDIRS ,这里是为了支持老语法“ make SUBIDRS=dir

190 行判断是否在命令行定义了 M ,如果定义了的话 KBUILD_EXTMOD=$(M)
197 行判断 KBUILD_EXTMOD 时为空,如果为空的话目标 _all 依赖 all ,因此要先编译出 all 。否则,默认目标 _all 依赖 modules ,要先编译出 modules ,也就是编译模块。一般情况
下我们不会在 uboot 中编译模块,所以此处会编译 all 这个目标。
203 行判断 KBUILD_SRC 是否为空,如果为空的话就设置变量 srctree 为当前目录,即 srctree 为“. ”,一般不设置 KBUILD_SRC
214 行设置变量 objtree 为当前目录。
215 216 行分别设置变量 src obj ,都为当前目录。
218 行设置 VPATH
220 行导出变量 scrtree objtree VPATH

7.  获取主机架构和系统

顶层 Makefile 会获取主机架构和系统,也就是我们电脑的架构和系统,代码如下:

227 HOSTARCH := $(shell uname -m | \
228 sed -e s/i.86/x86/ \
229 -e s/sun4u/sparc64/ \
230 -e s/arm.*/arm/ \
231 -e s/sa110/arm/ \
232 -e s/ppc64/powerpc/ \
233 -e s/ppc/powerpc/ \
234 -e s/macppc/powerpc/\
235 -e s/sh.*/sh/)
236
237 HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
238 sed -e 's/\(cygwin\).*/cygwin/')
239
240 export HOSTARCH HOSTOS

227 行定义了一个变量 HOSTARCH ,用于保存主机架构,这里调用 "uname -m"命令,获取架构名称。 结果如下:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux$ uname -m
x86_64

可以看出当前电脑主机架构为 “x86_64”“|”表示管道,意思是将 左边的输出作为右边的入,

sed -e 是替换命令,“sed -e s/i.86/x86/”表示将管道输入的字符串 中的 “ i.86” 替换为 “x86” ,其他的“sed -e s”命令同理。对于我的电脑而言,HOSTARCH=x86_64

237 行定义了变量 HOSTOS ,此变量用于保存主机 OS 的值,先使用  “uname -s” 命令来获取主机 OS ,结果如下:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux$ uname -s
Linux

可以看出此时的主机 OS 为“Linux”,使用管道将“Linux”作为后面“tr '[:upper:]' '[:lower:]'”的输入,“tr '[:upper:]' '[:lower:]'”表示将所有的大写字母替换为小写字母,因此得到 linux”。

最后同样使用管道,将“linux”作为“sed -e 's/\(cygwin\).*/cygwin/'”的输入,用于将 cygwin.*替换为 cygwin。因此,HOSTOS=linux

240 行导出 HOSTARCH=x86_64 HOSTOS=linux

下一篇文章继续了解 uboot顶层 Makefile的前期内容。

你可能感兴趣的:(嵌入式C开发,linux,arm开发)