U-boot 顶层Makefile 学习(1)

Makefile可以说是学习路上的难点之一,刚开始看视频学习时,很难跟得上讲师的步伐,虽然讲的很详细,但是由于没有Makefile基础,理解较为困难。建议自主学习,思考后再看视频,能收获的更多。

U-boot顶层Makefile
1、版本号

字面意思,分别对应版本号、补丁版本号、子版本号、附加版本号、名字。

2、MAKEFLAGS变量
make 命令是支持递归调用的,一般顶层Makefile中的变量若要供给子目录中的Makefile使用,这就需要使用以下命令
$(MAKE) -C subdir

 我们希望哪个变量能传递给子Makefile,那么我们需要导出变量,采用 export VARIABLE。不希望传递给子Makefile的变量,采用 unexport VARIABLE。**特殊的变量"SHELL"和"MAKEFLAGS",除非使用unexport,否则自动传递给子Makefile。

3、命令输出
uboot编译过程不会自动显示完整的命令,需要加上 V=1
这里

  1. Line 73 首先判断V 是否是从Command Line输入。这里使用的origin函数,origin的作用就是判断变量从哪里来。
    Line 74- 79 字面意思,略
  2. Line 80判断Command Line输入的值是否等于1,若满足
    quiet =
    Q =
    若不满足
    quiet = quiet_
    Q = @
  3. 在Makefile中有许多使用quiet和Q的命令,例如:
    ( Q ) (Q) (Q)(MAKE) ( b u l i d ) = t o o l s 如 果 V = 0 , 就 是 @ m a k e (bulid)=tools 如果V=0,就是 @make (bulid)=tools如果V=0,就是@make(build)=tools
    make在执行时会在终端中输出命令,如果加上了@,就不会打印出来。

4、静默输出
如果不想看到make执行的过程,可以使用make -s,这样会不打印执行的命令,直到make执行结束。

  1. 推荐先阅读注释内容,自行理解,再看讲解。
  2. Line 93 就是判断编译器的版本是否是4.x,其中filter函数表示仅保留以4.%格式的单词,其中%为通配符。
  3. Line 94就是判断 是否有%s字符,如果有,quiet = silent_
    这里需要理解quiet,如果变量 quiet 为“quiet_”的话,仅输出短版本。
    如果变量 quiet 为“silent_”的话,整个命令都不会输出。
    **这里需要学习,怎么样用调试的思路学习Makefile,通过打印变量的值帮助理解,能更有效的学习。
    采用如下TEST Code
    mytest:
    @echo ‘filename’=x ( M A K E V E R S I O N ) 能 够 打 印 出 x (MAKE_VERSION) 能够打印出x (MAKEV​ERSION)能够打印出x(MAKE_VERSION)的信息,帮助理解。

5、设置编译结果输出目录
uboot可以将编译生出的文件放到指定的目录下,使用make O=out

判断O是否从命令行输入,如果是,路径赋给 KBUILD_OUTPUT变量

如果 KBUILD_OUTPUT变量不为空,那么保存路径给saved-output
同时覆盖KBUILD_OUTPUT的值(创建目录的绝对路径),通过mkdir创建用户选中的文件夹,并进入
这里我百度学习了 " = " " += " " ?= " " := "四种赋值符号的区别
其中
" = "是最基本的赋值
" += "是拼接字符后再进行赋值
" ?= "是判断如果没有赋值,就赋给等号后面的值
" := "是直接覆盖前面的值

这里又存在 " := “和” = "的区别:

  1. " = "是在make命令执行完后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。

      a = aaab = $(a)bbba = ccc
    

    那么b的值应该是cccbbb,而不是aaabbb。

  2. " := "表示变量的值决定变量在Makefile中的位置,就是按照正常的逻辑看。
    a = aaa
    b = $(a)bbb
    a = ccc
    这里b的值就是aaabbb。

6、代码检查
uboot支持代码检查,一般使用命令 make C=1即可,检查需要差分编译的文件。如果是需要检查全部的源码文件,那么需要使用make C=2。

这里就是给变量 KBUILD_CHECKSRC 赋值的地方

7、模块编译
在uboot中允许单独编译某个模块,使用命令"make M=dir"即可,旧语法 make SUBDIRS=dir 也可

这里就是给变量 KBUILD_EXTMOD 赋值的地方,路径赋给它

Line 199 - 203 如果路径非空,_all依赖于all,否则依赖于module
Line 205 - 215 如果KBUILD_SRC为空,设置srctree := . "."是当前的路径,这里我使用@echo打印shell pwd $(srctree)得到确实为当前的路径。
Line 206 - 218 objtree 赋给 “.” ,src赋给 “.” ,obj 赋给 “.”

Line 223 取得VPATH的路径
Line 225 变量srctree objtree VPATH传递给下级Makefile路径

8、获取主机架构和系统
接下来Makefile会获取主机架构和系统,也就是我们电脑的架构和系统

Line 227定义了一个变量HOSTARCH,这里调用shell命令 uname -m x86_64
shell中的"|"表示管道,意思是将左边的输出作为右边的输入
sed -e 是替换命令 sed -e s/i.86/x86/”表示将管道输入的字符串中的“i.86”替换为“x86”

Line 242定义了变量HOSTOS,用于保存主机OS的值。 uname -s 得到 Linux
“tr ‘[:upper:]’ ‘[:lower:]’”将大写换为小写,得到linux
sed -e 同替换原理
最后导出变量 HOSTARCH = x86_64
HOSTOS = linux

U-boot 顶层Makefile 学习(1)相关推荐

  1. 正点原子imx6ullUBOOT顶层Makefile学习笔记

    跟据正点原子的linux开发板手册与视频学习了uboot的顶层makefile工作流程. 一.准备阶段 $(MAKE) -C subdir:调用subdir目录下的makefile文件,make支持递 ...

  2. 顶层Makefile学习记录

    make xxx_defconfig 的过程 make am64x_evm_r5_defconfig O=./testbuild V=1 make -C /home/wzx/ti-processor- ...

  3. Linux 内核顶层Makefile 详解

    目录 前602行分析 make xxx_defconfig 过程 Makefile.build 脚本分析 make 过程 built-in.o 文件编译生成过程 make zImage 过程 前几章我 ...

  4. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. linux内核顶层Makefile详解

    文章目录 一.linux内核获取 二.linux内核初次编译 三.linux工程目录分析 1.获取源码 2.目录介绍 1.总体浏览 2.arch 目录 3.block 目录 4.crypto 目录 5 ...

  6. Linux 内核顶层 Makefile 详解

    Linux 内核获取 Linux 由 Linux 基金会管理与发布, Linux 官网为 https://www.kernel.org,所以你想获取最新的 Linux 版本就可以在这个网站上下载 最新 ...

  7. U-Boot顶层Makefile分析

    参考:U-Boot顶层Makefile介绍 作者:一只青木呀 发布时间: 2020-10-22 16:22:17 网址:https://blog.csdn.net/weixin_45309916/ar ...

  8. U-BOOT分析(二)之顶层Makefile文件(1)

    U-BOOT分析(二)之顶层Makefile文件(1) U-BOOT版本 u-boot版本:    u-boot-2021.01.tar.bz2 Makefile && make简介 ...

  9. 【正点原子Linux连载】第三十一章 U-Boot顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. python编程基础是什么-Python面向对象编程基础解析(一)
  2. why do you want to university of cambridge?
  3. 经典文章解释apache与tomcat!看完秒懂
  4. KVM安装Win系列虚拟机学习笔记
  5. freemarker 概述
  6. vf求计算机系统当前日期的年份数,计算机二级VF常用函数列表
  7. linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响
  8. Nmap源码分析(整体架构)
  9. Ubuntu下安装Balsamiq Mockups
  10. golang 系统级服务器,golang 服务器监控
  11. jq中使用promise封装ajax
  12. 程序员必须掌握的 CPU 硬核干货!
  13. 不只有BERT!盘点2018年NLP令人激动的10大想法
  14. 【深度学习】卷积计算与训练模型的几种方法
  15. 分子生物学词汇(G~K)
  16. xp电脑不能访问服务器共享文件夹,XP系统电脑无法访问WIN7共享文件夹怎么办
  17. win10并排显示窗口怎么不能占据全屏
  18. 像扫二维码一样的快速录入银行卡信息
  19. 展望 2017年商业智能BI发展的趋势分析
  20. java 验证手机号_Java使用正则表达式验证手机号和电话号码的方法

热门文章

  1. 用python画玫瑰
  2. python webdriver 测试框架-数据驱动xml驱动方式
  3. python文件操作的一般步骤_4.1Python文件基本操作
  4. 合宙AIR105(四): SPI, MAX7219 8x8LED驱动
  5. 浙大远程教育计算机作业2,2016浙大远程教育计算机应用基础作业-2.docx
  6. PicoScope 6软件 | 垂直分辨率增强和低通过滤的使用
  7. 笔记:PicoScope 3405D采集卡简单使用
  8. 258_密码必须由6-20位英文字母或数字组成
  9. ITS America和AASHTO要求美国运输部为V2X保留5.9 GHz频谱
  10. PMBOK 第六版十大知识领域