admin管理员组

文章数量:1597897

一.uboot主Makefile分析1

1、uboot version确定(Makefile的24-29行)

Makefile代码部分

(1)uboot的版本号分3个级别:

VERSION:主板本号

PATCHLEVEL:次版本号,即补丁版本号

SUBLEVEL:再次版本号

EXTRAVERSION:另外附加的版本信息

这4个用.分隔开共同构成了最终的版本号U_BOOT_VERSION ,这个变量记录了Makefile中配置的版本号。

2、include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以源目录中没有,但是编译过后的uboot中就有了。它里面的内容是一个宏定义,宏定义的值内容就是我们在Makefile中配置的uboot的版本号。

2、HOSTARCH和HOSTOS

  1. Makefile代码部分:

注:sed的替换功能

test = abcdefgabc  

Test1 = \$(test) \| sed -e s/abc/123/  

Test2 = \$(test) \| sed -e s/abc/123/g  

\@echo \$(Test1 )  

\@echo \$(Test2 )  

结果:

123defabc

123def123

abc被替换成了123,如果不加字母g,结果就变成了只有第一个abc被替换

1、HOSTARCH这个名字:HOST是主机,就是当前在做开发用的这台电脑就叫主机;ARCH是architecture(架构)的缩写,表示CPU的架构。所以HOSTARCH就表示主机的CPU的架构。

2、直接在shell中执行uname
-m得到i686,得到的值其实你当前执行这个命令的电脑的CPU的版本号。

3、shell中的|叫做管道,管道的作用就是把管道前面一个运算式的输出作为后面一个的输入再去做处理,最终的输出才是我们整个式子的输出。

4、这两个环境变量是主机的操作系统和主机的CPU架构,得出后保存备用,后面自然会用到。

uboot主Makefile分析2

1、静默编译(50-54行)

Makefile代码部分:

1、平时默认编译时命令行会打印出来很多编译信息。但是有时候我们不希望看到这些编译信息,就后台编译即可。这就叫静默编译。

2、使用方法就是编译时make -s,-s会作为MAKEFLAGS传给Makefile,在50-54行这段代码作用下XECHO变量就会被变成空(默认等于echo),于是实现了静默编译。

2、2种编译方法(原地编译和单独输出文件夹编译)

1、编译复杂项目,Makefile提供2种编译管理方法。默认情况下是当前文件夹中的.c文件,编译出来的.o文件会放在同一文件夹下。这种方式叫原地编译。原地编译的好处就是处理起来简单。

2、原地编译有一些坏处:第一,污染了源文件目录。第二的缺陷就是一套源代码只能按照一种配置和编译方法进行处理,无法同时维护2个或2个以上的配置编译方式。

3、为了解决以上2种缺陷,uboot支持单独输出文件夹方式的编译(linux
kernel也支持,而且uboot的这种技术就是从linux
kernel学习来的)。基本思路就是在编译时另外指定一个输出目录,将来所有的编译生成的.o文件或生成的其他文件全部丢到那个输出目录下去。源代码目录不做任何污染,这样输出目录就承载了本次配置编译的所有结果。

(4)具体用法:默认的就是原地编译。如果需要指定具体的输出目录编译则有2种方式来指定输出目录。(具体参考Makefile
56-76行注释内容)

第一种:make O=输出目录

第二种:export BUILD_DIR=输出目录 然后再make

如果两个都指定了(既有BUILD_DIR环境变量存在,又有O=xx),则O=xx具有更高优先级,听他的。

(5)两种编译的实现代码在Makefile的78-123行,如下

3.uboot主Makefile分析3

1、OBJTREE、SRCTREE、TOPDIR(环境变量)

(1)OBJTREE:编译出的.o文件存放的目录的根目录。

在默认编译下,OBJTREE等于当前目录;

在O=xx编译下,OBJTREE就等于我们设置的那个输出目录。

(2)SRCTREE: 源码目录,其实就是源代码的根目录,也就是当前目录。

总结:在默认编译下,OBJTREE和SRCTREE相等;在O=xx这种编译下OBJTREE和SRCTREE不相等。Makefile中定义这两个变量,其实就是为了记录编译后的.o文件往哪里放,就是为了实现O=xx的这种编译方式的。

2、MKCONFIG(Makefile的101行)

Makefile中定义的一个变量(在这里定义,在后面使用),它的值就是我们源码根目录下面的mkconfig。这个mkconfig是一个脚本,这个脚本就是uboot配置阶段的配置脚本。

3、include $(obj)include/config.mk(133行)

  1. Makefile代码部分:

  2. # load ARCH, BOARD, and CPU configuration

  3. include $(obj)include/config.mk

  4. export ARCH CPU BOARD VENDOR SOC

(1)include/config.mk不是源码自带的(你在没有编译过的源码目录下是找不到这个文件的),要在配置过程(make
x210_sd_config)中才会生成这个文件。因此这个文件的值和我们配置过程有关,是由配置过程根据我们的配置自动生成的。

(2)我们X210在iNand情况下配置生成的config.mk内容为:

**ARCH   = arm**

**CPU    = s5pc11x**

**BOARD  = x210**

**VENDOR = samsung**

**SOC    = s5pc110**

(3)我们在下一行(134行)export导出了这5个变量作为环境变量。所以着两行加起来其实就是为当前makefile定义了5个环境变量而已。之所以不直接给出这5个环境变量的值,是因为我们希望这5个值是可以被人很容易的、集中的配置的。

(4)这里的配置值来自于2589行那里的配置项。如果我们要更改这里的某个配置值要到2589行那里调用MKCONFIG脚本传参时的参数。

  1. M

本文标签: 详解过程Linuxuboot