uboot的配置编译过程的主Makefile的分析:
本文以九鼎为x210移植的uboot很目录下的Makefile为分析目标,分析uboot在配置编译阶段的工作流程。
在正式介绍之前我想先介绍一些关于Makefile的语法问题,当然我讲的是一些比较浅显的常用的东西,如果想进一步了解学习的可以看看陈皓写的《跟我一起写Makefile》
Makefile的基础知识:
1.Makefile的三类文件:目标 依赖 条件
Makefile是用来做项目管理,方便编译链接过程。自动推导是Makefile的法则。
Makefile的目标:最终要生成的东西。顶格写,后面是依赖;
Makefile的依赖:用来生成目标的原材料;
Makefile的命令:也就是程序的具体实现,加工方式。
一个Makefile可以有多个目标,可以通过make+目标名实现目标,在默认的情况下实现的是第一个名为ALL的目标。 %是Makefile的通配符,例如%.x就代表.x的所有文件。Makefile定义变量和使用变量和shell很像,是一个弱类型语言,没有变量的类型,直接定义使用,引用时用$xxx。 伪目标直接执行目标之后的命令,没有依赖。一般用.PHONY声明。
2.Makefile引用其他的Makefile:
用include引用,应用的效果是原地展开,类似于C语言。静默执行:在执行命令前加上@可以使得命令输出时仅仅只是输出命令结果而不是将命令行本身也输出。
3.Makefile的赋值:
= 赋值时以最后一个值为变量最终的值。
?= 如果前面没有赋值就执行赋值语句,反则不执行。
+= 给一个已经赋值的变量接续赋值,把这次的值加到原来的值后面(将变量当做字符串来处理)
:=赋值时就地直接解析,只用往前看。也就是一般的赋值。
4.Makefile的环境变量:
在Makefile中用export导出的就是环境变量,用大写来表示,和普通变量不同,他是整个工程中所有Makefile可以共享的全局变量。而实际make时给Makefile传进去的参数优先级高于Makefile内定义的变量,可以覆盖Makefile的赋值
5.Makefile的通配符:
1. * 表示若干个任意的随意字符。
2. ?表示一个与依赖内相同的字符。
3. []表示括号内与依赖内相同的字符。
4. %表示任意多个字符,但是一般只用于规则描述之中,叫做规则通配符。
6.Makefile的自动变量:预定义的特殊意义符号,类似于C语言编译器中预定义的宏。
1. $@ 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
2. $< 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
3. $^ 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
4.$+这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标
7.makefile的两种编译方法:
1.原地编译,编译前的.c文件内同时存放着编译之后的.o文件。会导致污染原文件夹
2.单独的专用文件夹存放编译之后的文件。 指定的位置输出文件:①.make O =输出目录;'make O=/tmp/build all' ②export BULLD DIR=输出目录 注:CURDIR //源码目录 SRCTREE //顶层目录 OBJTREE:编译出的.o文件存放的目录的根目录。在make o=xx的编译方式
下面将对Makefile进行具体的分析:
make xxx 配置阶段完成之后生成的文件:
(1)uboot/include/config.mk 存放着ARCH CPU BOARD VENDOR SOC 参数
(2)uboot/include/autoconf.mk 指导编译阶段的宏文件
(3)uboot/board/samsung/x210/config.mk 用来存放链接地址的文件
1.确定uboot的版本号和主机信息:
VERSION &