U-boot主Makefile分析

本文详细分析了U-boot主Makefile的结构,包括确定版本号及主机信息、静默编译功能、设置路径、编译工具链、规则设定和CPU相关伪目标。重点关注了如何设置编译环境、版本信息、路径变量、编译规则以及配置脚本mkconfig的作用。通过对Makefile的解读,揭示了U-boot编译过程的关键步骤。
摘要由CSDN通过智能技术生成

U-boot主Makefile分析

主Makefile位于uboot源码的根目录下,其内容主要结构为:
1. 确定版本号及主机信息
2. 实现静默编译功能
3. 设置各种路径
4. 设置编译工具链
5. 设置规则
6. 设置与cpu相关的伪目标

需要注意的是,结构顺序不代表代码执行顺序,关于代码的执行顺序以及推荐阅读顺序请移步 [ U-boot配置及编译阶段流程宏观分析 ]

1.确定版本号及主机信息

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
  • 这四个变量的含义依次为:主版本号、次版本号、再次版本号、附加的版本信息(值为空,可以给用户使用)
  • U-Boot_VERSION这个变量的值为真正的uboot版本号,易知其值为1.3.4
  • VERSION_FILE变量的值是一个.h文件,注意=是并行赋值的意思,类似于Verilog语言中的<=。要注意:=(可以理解为串行赋值)和=的区别。$(obj)这个变量是在后面定义并赋值的,其值是编译输出路径
  • version_autogenerated.h这个文件是在make之后自动生成的,文件内容是一条宏,这条宏给将其他.c文件提供uboot的版本号
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/)
  • makefile的函数调用与变量调用很类似,格式是$( function arguments),其实上面一大段的意思是变量HOSTARCH的值是一个函数的返回值
  • shell是makefile中的一个函数,$(shell XXX)会被解析成执行shell命令XXX;此处是执行了一条 uname -m |sed -e ……,符号 \是makefile的换行符
  • 其中,|是shell语法中的管道结构,例如:XXX | YYY ,表达式XXX 的输出将作为表达式YYY的输入,YYY的输出才是整句表达式的输出
  • uname -m 指令将输出负责编译的主机cpu架构,比如ixx86;sed -e是替换命令,比如把ixx86替换为i386
  • 由此可见这个HOSTARCH变量的值将得到负责编译的主机cpu架构。大部分情况下我们得到的都是i386
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
        sed -e 's/\(cygwin\).*/cygwin/')
  • 这个HOSTOS变量和上一句HOSTARCH变量的原理类似,管道第一部分uname -s会得到负责编译的主机的OS,比如Linux
  • 管道第二部分是将大写转换成小写
  • 管道第三部分的意思是如果前面一个部分得到了cygwin系统,则格式要转换一下。不必深究,因为cygwin基本没人用……
  • 由此可见这个HOSTOS变量的值将得到负责编译的主机操作系统,大部分情况下我们得到的都是linux
export  HOSTARCH HOSTOS
  • 导出上面两个变量到全局,使其为环境变量,让其他的文件也可以使用架构和系统信息

2.实现静默编译功能

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
  • 这整段是为了实现make的静默选项功能,其中,findstring一个函数,$(findstrings, $ (MAKEFLAGS))功能是从$(MAKEFLAGS)中找出字符‘s’
  • $(MAKEFLAGS)是make的flag(选项),如果在控制台中输入make -s,则$(MAKEFLAGS)的值为‘s’
  • 如果$(findstring $(MAKEFLAGS))没找到‘s’,这个表达式的值为空,则ifeq()为真,即make时无需静默
  • 无需静默的实现方法是令变量XECHO值为关键字echo,因为makefile中每次需要打印都会使用XECHO,而不是直接使用echo本身
  • 静默make的实现方法是令变量XECHO值为空,当makefile需要打印时会调用XECHO,由于其为空,故无法打印make信息
  • 注:编译工具链的信息是永远打印的,和make的静默选项无关

3.设置各种路径

  • 这里开始阐述了makefile所支持的“单独外部路径编译”,它的原理和keil把.o、.l、.bin、.a等中间文件放在单独的文件夹内的原理相同,都是为了使源码更简洁明了,防止被中间文件污染;以及为了同时维护多个配置编译方式
  • 若要使用单独外部路径编译,有两种方法,方法一:例如在控制台中输入 make O=/tmp/build ,将输出文件夹路径作为参数
  • 方法二:导出环境变量,即export BUILD_DIR=/tmp/build
  • 注:方法一的优先级高,会覆盖方法二。而且方法一必须每次输入make时都要输入参数(不论是make clean还是make config 的时候),格式如make O=/tmp/build disclean
ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值