U-Boot Makefile 文件详细分析

1. Makefile到底做了什么

  之前看了网上许多牛人写的关于Makefile的解析的文章,在这里,我也结合我个人的理解,去分析U-Boot的Makefile。

  首先,我们大致了解一下,Makefile到底做了些什么工作?其实,顶层Makefile的主要任务就是组织整个U-Boot工程的编译,概括可以分为以下几个步骤:

  • 首先通过执行make *_config传入$(@:_config=), ARCH, CPU, BOARD, VENDOR, SOC参数(一共六个参数但不一定同时存在),给mkconfig。
  • mkconfig接收到传递过来的参数后,将include头文件夹相应的头文件夹链接好,生成config.h
  • 然后执行make分别调用各个子目录的makefile文件,以生成所有的obj文件(包括start.o)和obj库文件*.a。
  • 最后,通过链接器把所有目标文件链接起来,生成uboot镜像。不同格式的镜像都是调用相应工具,经由elf镜像间接或者直接的生成的。

2. Makefile分析

  接下来我们具体分析这些代码。规定说明:Makefile文件的代码用黑色,文件原注释用橄榄色,作者注释用浅蓝色。

VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 6
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

#以上是预先定义一些变量,则U_BOOT_VERSION=1.1.6,VERSION_FILE表示版本文件。

HOSTARCH := $(shell uname -m | \
 sed -e s/i.86/i386/ \          //将i.86替换成i386,以下类似
     -e s/sun4u/sparc64/ \
     -e s/arm.*/arm/ \
     -e s/sa110/arm/ \
     -e s/powerpc/ppc/ \
     -e s/macppc/ppc/)

# uname 将正在使用的操作系统名写到标准输出中,-m显示硬件运行系统的机器 ID 号。

#sed 是一种在线编辑器,它一次处理一行内容。

#比如本人的电脑使用Intel Core2系列的CPU,因此“uname –m”输出“i686”。 “i686”可以匹配命令“sed -e s/i.86/i386/”中的“i.86”,因此在作者的机器上

#执行Makefile,HOSTARCH将被设置成“i386” 。

HOSTOS := $(shell uname -s | tr ‘[:upper:]‘ ‘[:lower:]‘ | \
     sed -e ‘s/\(cygwin\).*/cygwin/‘)

export HOSTARCH HOSTOS

#“uname –s”输出主机内核名字,作者使用Linux发行版Ubuntu9.10,因此“uname –s”结果是“Linux”。“tr ‘[:upper:]‘ ‘[:lower:]‘”作用是将标准输入中的所有大写字母转换为响应的小写字母。因此执行结果是将HOSTOS 设置为“linux”。

# Deal with colliding definitions from tcsh etc.
VENDOR=  #表示开发商

#########################################################################
#此段注释比较重要,因此翻译出来。

# U-boot 的编译过程可以支持向一个自己定义的路径生成最终的目标文件。这里提供两种方法:
# U-boot build supports producing a object files to the separate external directory. Two use cases are supported:

# 第一种用法:通过在终端执行命令make O=/dir(即你指定的生成的目标文件的存放目录)
# 1) Add O= to the make command line
# ‘make O=/tmp/build all‘

#第二种用法:通过设置环境变量来指定目标文件存放目录,如下举例所示:
# 2) Set environement variable BUILD_DIR to point to the desired location
# ‘export BUILD_DIR=/tmp/build‘
# ‘make‘
#

#第二种方法也可以写成MAKEALL脚本,然后执行MAKEALL,如下:
# The second approach can also be used with a MAKEALL script
# ‘export BUILD_DIR=/tmp/build‘
# ‘./MAKEALL‘
#

#命令行‘O=‘设置会覆盖环境变量BUILD_DIR的设置
# Command line ‘O=‘ setting overrides BUILD_DIR environent variable.
#

#如果都不采用上面两种方法,那么目标文件放到源码顶层目录,也就是U-BOOT顶层目录
# When none of the above methods is used the local build is performed and
# the object files are placed in the source directory.
#

<由于工作忙,待续>

时间: 2024-07-28 14:27:00

U-Boot Makefile 文件详细分析的相关文章

/etc/rc.d/init.d/functions文件详细分析

/etc/rc.d/init.d/functions文件详细分析 functions这个脚本是给/etc/init.d里边的文件使用的(可理解为全局文件). 提供了一些基础的功能,看看里边究竟有些什么.首先会设置umask,path,还有语言环境,然后会设置success,failure,warning,normal几种情况下的字体颜色. 下面再看看提供的重要方法:checkpid:检查是否已存在pid,如果有一个存在,返回0(通过查看/proc目录)daemon:启动某个服务./etc/ini

linux-2.6.22.6内核启动分析之Makefile文件

学习目标 分析Makefile文件,了解内核中的哪些文件被编译,如何被编译,连接时顺序如何确定! Linux内核源码中包含很多的Makefile文件,这些Makefile文件又包含其它的一些文件,比如配置信息.通用规则等等.我们可以把内核中的Makefile文件分为5类,如下表所示: 顶层Makefile 所有Makefile文件的核心,从总体控制内核的编译.连接 .config 配置文件,在执行配置命令时生成.所有Makefile文件都根据.config来决定如何使用哪些文件 arch/$(A

分析Linux 0.11中的kernel部分的makefile文件

## 在UltraEdit下注释# # ## if you want the ram-disk device, define this to be the# size in blocks.#RAMDISK = #-DRAMDISK=512 ##8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码???zzz#AS86 =as86 -0 -a LD86 =ld86 -0 ##GNU汇编编译器和连接器#AS =gas   LD =gld ##GNU连接器gl

u-boot的Makefile语法教程分析

U-BOOT是一个LINUX下的工程,在编译之前必须已经安装对应体系结构的交叉编译环境,这里只针对ARM,编译器系列软件为arm-linux-*. U-BOOT的下载地址: http://sourceforge.net/projects/u-boot我下载的是1.1.6版本,一开始在FTP上下载了一个次新版,结果编译失败.1.1.6是没问题的. u-boot源码结构    解压就可以得到全部u-boot源程序.在顶层目录下有18个子目录,分别存放和管理不同的源程序.这些目录中所要存放的文件有其规

【转】SYNOPSYS VCS Makefile文件编写与研究

原文地址:http://www.cnblogs.com/zhtxwd/archive/2012/03/30/2425180.html YNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明: makefile 其实完全可以用csh或其他脚本来编写,只是VCS使用的linux内置的make命令定义了一个标准的仿真脚本,make命令是专门用来 做项目的源文件管理和编

Linux内核Makefile文件(翻译自内核手册)

转载自:http://www.cnblogs.com/jason-lu/p/3728198.html --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 This document describes the Linux kernel Makefiles 本文当介绍了Linux内核的Makefile === Table of Contents=== 目录

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个

Makefile中export分析

在分析内核启动过程的./arch/arm/Makefile文件里碰到了这样字段 162 export TEXT_OFFSET GZFLAGS MMUEXT 然后在子目录arch/arm/kernel/vmlinux.lds文件中又用到了TEXT_OFFSET 24 . = PAGE_OFFSET + TEXT_OFFSET; 上网一查export才知道: 这个是用来提供该子目录makefile(sub make)中访问的,同一级的另外一个makefile中,是无法访问/得到的. (可以通过mak

C语言Makefile文件制作

本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile 写完之后才发现基本上都是一些比较枯燥的规则,看看一.二.八三个部分就可以了.当作参考工具吧,什么时候用到了再来看看. 一.概述 我所使用的make 版本是 GNU Make 3.81,使用的系统是