U-boot主Makefile详尽分析
2016-07-04 09:24:16 来源:TaurenKing的博客
收藏 我要投稿
主Makefile位于uboot源码的根目录下,其内容主要结构为:
1. 确定版本号及主机信息(23至48行)
2. 实现静默编译功能(48至55行)
3. 设置各种路径(56至123行)
4. 设置编译工具链(124至186行,大部分在config.mk内)
5. 设置规则(187至470行)
6. 设置与cpu相关的伪目标(480至末尾)
需要注意的是,结构顺序不代表代码执行顺序
为了保证阅读的效果,请按推荐的顺序阅读源码。
0.许可声明(1至22行,略)
在Makefile的语法中,井号只有在行首才具有完整的行注释功能,与C语言中的//用法略有不同
1.确定版本号及主机信息(23至48行)
1 2 3 4 5 6 7 |
|
这四个变量的含义依次为:主版本号、次版本号、再次版本号、附加的版本信息(值为空,可以给用户使用) U-Boot_VERSION这个变量的值为真正的uboot版本号,易知其值为1.3.4 VERSION_FILE变量的值是一个.h文件,注意=是并行赋值的意思,类似于Verilog语言中的<=。要注意:=(可以理解为串行赋值)和=的区别。$(obj)这个变量是在后面定义并赋值的,其值是编译输出路径 version_autogenerated.h这个文件是在make之后自动生成的,文件内容是一条宏,这条宏给将其他.c文件提供uboot的版本号
1 2 3 4 5 6 7 8 9 |
|
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
1 2 3 |
|
这个HOSTOS变量和上一句HOSTARCH变量的原理类似,管道第一部分uname -s会得到负责编译的主机的OS,比如Linux 管道第二部分是将大写转换成小写 管道第三部分的意思是如果前面一个部分得到了cygwin系统,则格式要转换一下。不必深究,因为cygwin基本没人用…… 由此可见这个HOSTOS变量的值将得到负责编译的主机操作系统,大部分情况下我们得到的都是linux
1 |
|
导出上面两个变量到全局,使其为环境变量,让其他的文件也可以使用架构和系统信息
2.实现静默编译功能(48至55行)
1 2 3 4 5 6 7 8 |
|
这整段是为了实现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.设置各种路径(56至123行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|