OpenEmbedded 环境1

转自:http://blog.csdn.net/fmddlmyy/archive/2008/11/08/3254033.aspx

 

1概述

OpenEmbeddedOE)是一个开源的嵌入式linux系统构建环境。Openmokopoky都使用了定制过的OpenEmbedded环境。Openmoko是一个开放软硬件设计的手机平台。Poky的本意是一个定制过的OpenEmbedded环境。

Poky环境包含了一个叫作SatoUI方案,我们有时也把这个方案叫作poky。其实我们可以在poky环境开发其它基于GTK+/MacthboxUI方案。

构建一个嵌入式linux系统需要构建引导模块、内核和文件系统。这是一个相当复杂的过程,特别是文件系统的构建。一个典型的文件系统可能需要下载、编译、安装几百个软件包。如果你做过LFSLinux FromScratch),就可以体会到手工创建文件系统的复杂性。嵌入式系统因为是交叉编译(在PC环境编译、在嵌入式环境运行),所以构建过程更加复杂。OpenEmbedded 就是为了简化嵌入式系统的构建过程而设计的。尽管存在着体积大、速度慢等缺点,但OpenEmbedded确实简化了嵌入式系统的构建过程。例如,在安装过需要的工具后,构建poky的完整过程只是在进入poky目录后,执行两条命令:

. poky-init-build-env

bitbake poky-image-sato

然后就是等待构建完成。构建过程可能需要12-36小时。目标系统的复杂程度、网速、软硬件环境都会影响构建时间。

在完成一次成功构建后,我们就可以在这个环境开发应用程序。这时我们只需要编译变化的部分。在应用开发完成后,我们可以手工将其安装到目标系统上测试。在需要的时候,也可以重新构建文件系统。这时,OE仅编译变化的软件包,并重做一次文件系统映像。重做一次文件系统映像大约需要10-15分钟。

2程序员看到的OpenEmbedded

2.1 脚本和数据

在程序员看来,OpenEmbedded是一些脚本(shellpython脚本)和数据构成的自动构建系统。脚本实现构建过程,包括下载(fetch)、解包(unpack)、打补丁(patch)、configure(如果使用了autotool)、编译(compile)、安装(install)、打包(package)、staging(以后讨论)、做安装包(package_write_ipk)、构建文件系统等。

数据主要提供两个方面的信息:

特定软件包的构建信息。怎样获取源代码和补丁?怎样构建,用Makefile还是Autotool?需要向目标编译环境输出哪些文件?需要安装哪些文件?每个软件包都需要描述文件。事实上,每个软件包的不同版本都有一个描述文件。

软件包之间的依赖关系。构建软件包A需要先构建什么主机平台工具,什么目标平台工具?软件包A在编译时依赖哪些软件包?软件包A在运行时依赖哪些软件包?一个目标应包含那些软件包?这些依赖关系把几百个软件包联系在一起,构成了一个完整的系统。

脚本和数据本来是一起打天下的。随着系统的完善,两者的独立性越来越强,就像《围城》中灌满了泥浆的裤子可以不依赖主人的腿而独自站立一样,数据和脚本也希望脱离对方独立发展。希望独立的脚本被称作bitbake。希望独立的数据就是OE元数据。

2.2 bitbakeOE元数据

可以把bitbake看作实现具体步骤的烹饪工具。把元数据看作食谱。如果只有烹饪工具,没有食谱,我们不知道要做什么。如果只有食谱,没有烹饪工具,就无法完成具体操作。

作为烹饪工具的bitbake是构建系统中代表稳定的部分。各种烹饪工具可以日趋完善,食谱可以随意选择自己需要的工具。

作为食谱的OE元数据是构建系统中代表变化的部分。变化来自两个方面:

虽然食谱系统不断完善,包含了大多数嵌入式系统可能用到的软件包。但还是会有新的软件包被开发出来。已有的软件包也会出新版本

每个系统总有自己独特的爱好和口味。OpenmokoPoky是定制过的OE环境。它们所定制的就是OE元数据。

Openmoko根据手机平台的需要,增加和定制了一些软件包,以及软件包的依赖关系。

Poky的主要风格是精简的GTK+/Macthbox系统。Openmoko环境有5千多个食谱文件,poky环境只有7百多个食谱文件。

我们可以根据自己的需要定制自己的元数据。Openmokopoky都是不错的起点。一个不错的选择是以poky为起点,再从openmoko中取己所需。当然,我们总要根据设计目标开发特有的应用。

3文件系统里的OpenEmbedded

OE环境中最重要的目录有3个:放工具的bitbake目录、放元数据的目录、和执行构建的build目录。

3.1 bitbake目录

这个目录里是我们的烹饪工具:bitbake。我们使用它,但通常不需要访问它

3.2 元数据目

poky中元数据目metaOpenmoko中元数据目openembedded。在元数据目中,有3个目里是真正的元数据。它是:classesconfpackages

3.2.1 packages

所有的食文件(以.bb名)都放在package个相独立的件包或构建任package下都有自己的子目。在一个子目中可以有多个食文件。它可能是同一个件包的不同版本。也可能描述了基于同一个件包的不同构建目

有的食谱简单,有的食谱复杂简单的食谱仅描述一个件包的构建。最复杂的食就是要求构建文件系的食,例如poky境中的poky-image-satoopenmoko中的openmoko-devel-image个食文件本身并不,甚至很短,但它通赖关系将几百个甚至几千个其它食文件卷入了构建程。 packagesimages子目下就是些要求构建文件系的食

3.2.2 classes

个目放的是食文件(以.bbclass名)。文件包含了一些bitbake的定,例如怎配置、怎安装。食文件文件,就承了些任的定。例如:我如果增加一个使用autotool件包,只要在食文件中autotools.bbclassinherit autotools

bitbake就知道怎使用autotool工具配置、编译、安装了。所有的食文件都自动继承了base.bbclass base.bbclass提供了大部分bitbake的默认实现

一个食文件可以承多个文件。以后的文章会介bitbake的任,届会更详细讨论bitbake承。目前,我只要知道文件是一构建程的用方式就可以了。

3.2.3 conf目录

conf包含编译的配置文件(以.conf名)。bitbake在启动时bitbake.conf

bitbake.conf会装提供的local.conf。然后根据用local.conf中定的硬件平台(MACHINE)和布目DISTRO)装machine子目distro子目的配置文件。

machine子目里是硬件平台相的配置文件。distro子目里是与布目的配置文件。配置文件负责设bitbake内部使用的量。量会影响整个构建程。

3.3 build

build是我嵌入式系的大厨房。整个构建程就是在buildtmp子目完成的。 buildconf子目里是用的配置文件local.conf

tmp7个子目cachecrossrootfsstagingworkdeploystamps。其中cachebitbake内部使用的存目cross是构建程中生的交互编译器。所交互编译器就是在主机平台运行,用于编译平台代编译器。rootfs是制作文件系映像前临时建立的根文件系。我在工作中通常不需要访问这3个目。我们访问多的是其它4个目stagingworkdeploystamps

3.3.1 staging

件包B在构建可能依赖软件包A提供的文件、文件,也可能要使用件包C生成的工具。 staging就是放出文件的地方。

在食文件中用“DEPENDS”量声明构建的依赖关系。

bitbake就会在构建件包B前先构建件包A件包C,并将件包B需要的文件、文件、和工具放在staging这样,在构建件包B就可以从staging得到需要的文件、文件、和工具。

3.3.2 work

所有件包的解包、打丁、配置、编译、安装等工作都是在work录进行的。所以work包含了整个嵌入式系的完整源代

work下按照硬件平台、行人、目平台的不同又分了几个子目。所有件包都被放在对应子目中。件包都有一个独立的目。因为软件包

根据一个食文件构建的,所以件包所在的目就是对应文件的工作目。在讨论bitbake和食文件们还会回来,更仔察食文件的工作

3.3.3 deploy

是保存出成果的目。其中images保存构建成功后生的文件系映像、内核映像。 ipk保存件包的安装包。我在修改、构建件包后,可以在目平台手工安装ipk下的对应安装包。确没有问题后,再制作文件系映像。

3.3.4 stamps

work录类似,stamps也按照硬件平台、行人、目平台的不同又分了几个子目件包在完成bitbake后都会在对应子目touch一个对应时间戳。有会手工除某个件包的时间戳,bitbake重新构建件包。

3.4 sources

OE境的sources是一个,用来放从网上下的源代包。 fetch务负责,放到sources

我通常在OE录树之外建一个公共sources。然后在OE录创一个软链接指向sources这样,如果我同在多个OE编译多个版本,OE境的sources可以指向同一个公共sources。我openmokopoky也使用同一个公共sources这样,大量构建系所需的的件包被保存在公共sources。在重新编译一个目版本,可以省下载时间。在没有外网也能完成整个构建程。以后,即使有些件包的接失效了,我们还是可以构建完整的系

4

在自化嵌入式系构建程的同OpenEmbedded 把前人的构建经验用脚本的形式记录下来。我可以通过阅读OE脚本更直地学构建一个嵌入式系

windowslinuxRTOS上,也无使用C/C++Java是脚本,程序员总是在将化从不中分离出来。

OpenEmbedded 将脚本和元数据分离来,将化的元数据和不的元数据分离来。如果OpenEmbedded能更有效地区分必关联和可关联,将关联的配置相集中起来,定制系可能会更简单

本文是OpenEmbedded 简单,下面我了解bitbake世界的土人情,食文件的规则例,在tmp/work中究竟生了什。后面的文章假设读者已经编译、运行pokyopenmoko。本文的例子主要基于poky

不管OpenmokoOpenedHandpoky开发者,已被Intel)如何展,放在我面前的是一套完整的嵌入式Linux方案。只要我愿意,我可以看到个系细节行代,包括构建系本身的行脚本。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值