U-boot 顶层Makefile 学习(1)
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
这里
- Line 73 首先判断V 是否是从Command Line输入。这里使用的origin函数,origin的作用就是判断变量从哪里来。
Line 74- 79 字面意思,略 - Line 80判断Command Line输入的值是否等于1,若满足
quiet =
Q =
若不满足
quiet = quiet_
Q = @ - 在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执行结束。
- 推荐先阅读注释内容,自行理解,再看讲解。
- Line 93 就是判断编译器的版本是否是4.x,其中filter函数表示仅保留以4.%格式的单词,其中%为通配符。
- 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 (MAKEVERSION)能够打印出x(MAKE_VERSION)的信息,帮助理解。
5、设置编译结果输出目录
uboot可以将编译生出的文件放到指定的目录下,使用make O=out
判断O是否从命令行输入,如果是,路径赋给 KBUILD_OUTPUT变量
如果 KBUILD_OUTPUT变量不为空,那么保存路径给saved-output
同时覆盖KBUILD_OUTPUT的值(创建目录的绝对路径),通过mkdir创建用户选中的文件夹,并进入
这里我百度学习了 " = " " += " " ?= " " := "四种赋值符号的区别
其中
" = "是最基本的赋值
" += "是拼接字符后再进行赋值
" ?= "是判断如果没有赋值,就赋给等号后面的值
" := "是直接覆盖前面的值
这里又存在 " := “和” = "的区别:
" = "是在make命令执行完后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。
a = aaab = $(a)bbba = ccc
那么b的值应该是cccbbb,而不是aaabbb。
" := "表示变量的值决定变量在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)相关推荐
- 正点原子imx6ullUBOOT顶层Makefile学习笔记
跟据正点原子的linux开发板手册与视频学习了uboot的顶层makefile工作流程. 一.准备阶段 $(MAKE) -C subdir:调用subdir目录下的makefile文件,make支持递 ...
- 顶层Makefile学习记录
make xxx_defconfig 的过程 make am64x_evm_r5_defconfig O=./testbuild V=1 make -C /home/wzx/ti-processor- ...
- Linux 内核顶层Makefile 详解
目录 前602行分析 make xxx_defconfig 过程 Makefile.build 脚本分析 make 过程 built-in.o 文件编译生成过程 make zImage 过程 前几章我 ...
- 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- linux内核顶层Makefile详解
文章目录 一.linux内核获取 二.linux内核初次编译 三.linux工程目录分析 1.获取源码 2.目录介绍 1.总体浏览 2.arch 目录 3.block 目录 4.crypto 目录 5 ...
- Linux 内核顶层 Makefile 详解
Linux 内核获取 Linux 由 Linux 基金会管理与发布, Linux 官网为 https://www.kernel.org,所以你想获取最新的 Linux 版本就可以在这个网站上下载 最新 ...
- U-Boot顶层Makefile分析
参考:U-Boot顶层Makefile介绍 作者:一只青木呀 发布时间: 2020-10-22 16:22:17 网址:https://blog.csdn.net/weixin_45309916/ar ...
- U-BOOT分析(二)之顶层Makefile文件(1)
U-BOOT分析(二)之顶层Makefile文件(1) U-BOOT版本 u-boot版本: u-boot-2021.01.tar.bz2 Makefile && make简介 ...
- 【正点原子Linux连载】第三十一章 U-Boot顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
最新文章
- python编程基础是什么-Python面向对象编程基础解析(一)
- why do you want to university of cambridge?
- 经典文章解释apache与tomcat!看完秒懂
- KVM安装Win系列虚拟机学习笔记
- freemarker 概述
- vf求计算机系统当前日期的年份数,计算机二级VF常用函数列表
- linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响
- Nmap源码分析(整体架构)
- Ubuntu下安装Balsamiq Mockups
- golang 系统级服务器,golang 服务器监控
- jq中使用promise封装ajax
- 程序员必须掌握的 CPU 硬核干货!
- 不只有BERT!盘点2018年NLP令人激动的10大想法
- 【深度学习】卷积计算与训练模型的几种方法
- 分子生物学词汇(G~K)
- xp电脑不能访问服务器共享文件夹,XP系统电脑无法访问WIN7共享文件夹怎么办
- win10并排显示窗口怎么不能占据全屏
- 像扫二维码一样的快速录入银行卡信息
- 展望 2017年商业智能BI发展的趋势分析
- java 验证手机号_Java使用正则表达式验证手机号和电话号码的方法
热门文章
- 用python画玫瑰
- python webdriver 测试框架-数据驱动xml驱动方式
- python文件操作的一般步骤_4.1Python文件基本操作
- 合宙AIR105(四): SPI, MAX7219 8x8LED驱动
- 浙大远程教育计算机作业2,2016浙大远程教育计算机应用基础作业-2.docx
- PicoScope 6软件 | 垂直分辨率增强和低通过滤的使用
- 笔记:PicoScope 3405D采集卡简单使用
- 258_密码必须由6-20位英文字母或数字组成
- ITS America和AASHTO要求美国运输部为V2X保留5.9 GHz频谱
- PMBOK 第六版十大知识领域