Linux专题-Makefile(2)

本文主要分析Uboot的主Makefile

1.版本号

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

这里需要注意最后一行,使用$(obj)解引用obj这个值,上面明明没有obj变量,怎么去用呢?不要忘了我们在上一篇中说到的Makefile中的幅值符号“=”,是找最后一次赋值的结果,也就是说这个“obj”需要往下找;这里的include是uboot文件夹目录下的include文件夹;后面的头文件是自动生成的。

2.HOSTARCH和HOSTOS

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

这里的两个值是环境变量,为啥?因为下面用到了export,有export的就一定是环境变量。直接在shell中执行uname -m得到i686,得到的值其实你当前执行这个命令的电脑的CPU的版本号;“|”这个符号是管道,管道的作用就是把管道前面一个运算式的输出作为后面一个的输入再去做处理,最终的输出才是我们整个式子的输出,我们看到sed -e s/i.86/i386/这个就是前面那句识别到CPU的版本,比如是i686,在这里进行匹配i686能和i.86匹配上,能匹配上就将它替换成i386!下面几行就是其他型号的CPU的,大部分应该都是i386这种。
uname -s是Linux;但是执行完整句代码后导出的是linux,即小写。

3.静默编译

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

平时默认编译时命令行会打印出来很多编译信息。但是有时候我们不希望看到这些编译信息,就后台编译即可。这就叫静默编译。使用方法就是编译时make -s,-s会作为MAKEFLAGS传给Makefile,上述这段代码作用下XECHO变量就会被变成空(默认等于echo),于是实现了静默编译。

4.设置编译结果输出目录

ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

以上代码列出一小部分,作用是在执行make o=xxx时,将编译生成的.o等文件输出到XXX这个路径下,而不是完全放在源文件目录下,为了保证文件的干净。
上述代码中使用ifeq来判断"$(origin O)""command line"是否相等。这里用到了Makefile中的origin函数。这个函数不操作变量的值,而是用于告诉你变量是从哪里来的。比如这里的$(origin O),表示的就是变量O的来源。如果O是在命令行定义的那么它的来源就是"command line"。也就是在命令行输入了make o=XXX命令。这样这两个就相等了,那么接下来就会让BUILD_DIR的值赋为XXX。 其他命令类似分析。

5.设置目标架构、交叉编译器

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- atk_7020_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

上面所述的语句即是编译uboot的语句;第一句是清除工程;第二句是配置uboot;第三句是使用8核来编译uboot。在语句中我们使用的完整的命令。
ARCH=arm是设置目标为arm架构,也就是需要运行此uboot的平台,开发板的话一般即是arm,注意这里千万不要和上面的HOSTARCH 混淆,那个是指的电脑的架构!
CROSS_COMPILE=arm-linux-gnueabihf-指定所使用的交叉编译器,只需要指明编译器前缀就可以了。
从Makefile中例举一小段

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

第一句判断如果外部没有定义CROSS_COMPILE(所谓外部没有定义,就是在make命令中输入的不是完整的make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean这种,而是简单的make distclean),则判断HOSTARCH和ARCH是否相等,即当前的编译的那台主机与将来要运行的平台的架构是否一样,如果一样,那么就不需要使用交叉编译工具;如果不相等,则镜像下面的判断,比如下面的ARCH=arm,那么CROSS_COMPILE 则定义成自己安装的交叉编译工具。
需要注意的一点是:在编译时传参使用的命令:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean传入Makefile的CROSS_COMPILE值是可以覆盖Makefile中原来的CROSS_COMPILE的值的。

相关推荐

  1. Linux专题-Makefile2

    2024-05-11 20:52:04       13 阅读
  2. Linux专题-Makefile(1)

    2024-05-11 20:52:04       11 阅读
  3. Linux Makefile

    2024-05-11 20:52:04       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-11 20:52:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-11 20:52:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-11 20:52:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-11 20:52:04       20 阅读

热门阅读

  1. SpringSecurity安全管理框架-(一)初识SpringSecurity

    2024-05-11 20:52:04       9 阅读
  2. 力扣:763. 划分字母区间

    2024-05-11 20:52:04       15 阅读
  3. 算法学习笔记(博弈论中的SG函数)

    2024-05-11 20:52:04       28 阅读