LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3925|回复: 5

**Openembedded手册中文翻译版(已完成前7章)

[复制链接]
发表于 2008-10-27 12:50:24 | 显示全部楼层 |阅读模式
[size=+1]我的blog上的排版较好些:http://blog.chinaunix.net/u1/52172/
[size=+2]注意,由于排版麻烦,本帖以后不再更新,剩余内容请到blog查看,blog每天都会有新的更新,bitbake手册和一些指导手册的翻译都会跟上,一律在blog上发布,谢谢支持!:(2008-10-30)http://blog.chinaunix.net/u1/52172/


[size=+2]声明:


[size=+1]本文章为openembedded英文手册的中文翻译版。手册版权归OE所有。本翻译版版权规dangbinghoo@gmail.com所有。本文档只供技术和学习交流之用,不得用于商业用途,使用本文档如造成损失,译者一概不负任何责任。转载请注明出处和作者!
[size=+1]特此声明!     



第一章 1.简介
本章内容                                                         
*预览
*历史回顾

1.1预览
oe bitbake像所有的build工具一样(比如make,ant,jam)控制如何去构建并且解决构建依赖,但是
不像那些功能单一的工程管理工具比如make,bitbake不是基于那些把依赖写死了的makefile,而是
收集和管理大量之间没有依赖关系的描述文件(这里我们称为包的配方),然后自动按照正确的顺序进行
构建。

更确切点的说:openembedded是一些用来交叉编译,安装和打包的metadata(元数据)。oe已经被用
来构建和管理很多的嵌入式发行版,包括OpenZaurus,Angstrom,Familiar和SlugOS.

OE主要的用途是:
        *解决交叉编译
        *解决包之间的依赖关系
        *必须支持包的管理(tar,rpm,ipk)
        *必须支持将包作成镜像
        *必须支持高度的可定制性,以满足不同的机器,主机发行版和架构需求
        *编写元数据必须是容易的,并且可重用性要好

基于bitbake,OE可以满足以上所有要求,并且还支持更多。灵活性和强大的功能一直是OE的开发原则。

1.2 OE的历史
OE起源于OpenZaurus项目的建立和buildroot。buildroot支持ipk包格式,镜像的创建还有非常多的
机器,但是它却不能在不同的机器上和主机发行版使用不同的补丁和文件,为了改进这些,OE项目就诞生了。

几个月后就有其他的项目开始使用OE并且发回了反馈信息。2004年10月7日Chris Larson把OE分成了
两个项目。一个是bitbake(构建任务的执行者)和openembedded(实际上是为bitbake提供元数据)。

第二章:使用bitbake
本章内容
*获取bitbake
*获取openembedded
*配置oe
*编译

2.1获取bitbake

bitbake的更新很快。在写这篇文章的时候(2007年末),oe需要使用bitbake1.8或者更新的版本。

一个比较安全的获取bitbake的方式是从svn主分支上下载。(需要添加主版本号)
  1. CODE:        svn co [url]http://svn.berlios.de/svnroot/repos/bitbake/branches/bitbake-1.8[/url]
复制代码

这样就可以检出bitbake svn上的1.8版,使用svn up将把你的bitbake更新到最新的稳定版本。但是
通常情况下应该使用已经被知道可以正常运行的版本,除非oe告诉需要升级了。

2.2获取oe

OE 元数据的更新速度很快,所以你应当随时保持更新。为了获取oe,你要使用monotone工具0.28版本
来获得metadata(元数据)。大部分的发行版应该包含了该工具,你还可以在monotone 主页获得它。

接下来我们要下载数据库的快照:
  1. wget [url]http://openembedded.org/snapshots/OE.mtn.bz2[/url] [url]http://openembedded.org/[/url]
  2.         snapshots/OE.mtn.bz2.md5
复制代码

或者如果您使用monotone 0.30或者以上的版本,那么使用下面的命令

  1. wget [url]http://www.openembedded.org/snapshots/OE-this-is-for-mtn-0.30.mtn.bz2[/url]
  2.         wget [url]http://www.openembedded.org/snapshots/OE-this-is-for-mtn-0.30.mtn.bz2.md5[/url]
复制代码


然后使用md5sum来校验包的完整性:

  1. md5sum -c OE.mtn.bz2.md5sum
复制代码

       
然后解压数据包:

  1. bunzip OE.mtn.bz2
复制代码

       
最后检出oe的开发分支:
  1. mtn --db=OE.mtn co -b org.openembedded.dev
复制代码


*译者注*
注意:现在(至少在翻译本文档的时候,OpenEmbedded官方已经把monotone版本控制工具换成了git
所以你应该使用git来获取OE树。)
       
*使用git获取OpenEmbedded

注意:在以前的一段时间OE是使用monotone作版本控制的,所以如果在你的计算机中还是用Monotone
源的话你应该换成git源。

注意:这里仅仅是一些简单的示例,如果想要更详细的使用git的说明,你应该查看git的手册。

OE项目现在有git源,源的地址是:git://git.openembedded.net/org.openembedded.dev.git

为了获取OE,你需要作:
        1. 安装git
        2. 进入你的OE目录
       
可以建立一个stuff文件夹,然后cd进去
       
  1. $ cd stuff
复制代码

       
        下面用git检出源
       
  1. $ git clone git://git.openembedded.net/openembedded
复制代码

       
        或者您设置了防火墙的话,用http的
       
  1. $ git clone [url]http://repo.or.cz/r/openembedded.git[/url]
复制代码

       
        这样你就得到了你工作所需要的所有数据。
       
OE的.dev分支(开发分支)更新速度是很快的,通常情况下几小时就会更新一次。发行版的更新也是很
快的,所以最好你应该至少每天更新一次OE树。
       
使用下面的命令更新你的oe树:
  1. $ git pull --rebase
复制代码

       
(注意你必须在你的OE目录里执行此命令。本文的例子中,这个目录应该是/stuff/org.openembedded.dev,
如果你在当初检出OE树的时候设置了别的目录名字,那么你应该使用你自己设置的。)
       
       
2.3 配置
-_- 这部分官方手册还没有完成!!!

2.4 构建软件包

bitbake和OE被正确安装和配置之后,我们就可以像这样来构建软件包和镜像:

  1. bitbake <配方名>
复制代码

       
((以下官方手册还没有完成))

第三章 元数据(metadata)

本章内容:

*文件和目录布局说明
*符号
*类
*编写metadata(也即添加包)

3.1文件和目录布局说明
OE使用6个目录来存放bitbake元数据

conf 目录用来保存bitbake.conf,机器和发行版的配置。bitbake启动的时候将会读取bitbake.conf
文件并且会包含其他的local.conf 机器和发行版的配额之文件。bitbake会在BBPATH变量里搜寻这些
文件。

classes 目录包含了bitbake bb类(bbclass)。这些类可以被.bb文件继承和使用(译者注:这个源
于bitbake使用的python语言的类特性,可以提高代码的重用性和便于管理)。bitbake使用BBPATH
变量搜寻这些类文件。

packages 目录存放的bitbake bb 文件。每个软件包和任务我们给它分配一个目录。.bb文件是每个
包的元数据信息,每个包的每个版本都会有一个独立的bb文件。

3.2 符号

OE 使用了.conf .inc .bb .bbclass这些扩展名的文件。符号和这些文件的含义在bitbake手册页
中有详细的说明。

3.3 类

OE 提供了一些特殊的类来服务和支持包的编译,打包以及其他的动作。

((官方文档还没有完成!!!))


3.4 编写 meta data

本节将指导您编写.bb文件,或者用bitbake的话来说叫做“配方”

让我们首先从一些简单的开始,比如包的描述啊,协议啊:

  1. DESCRIPTION = "My first application, a really cool app containing lots of foo and bar"
  2. LICENSE = "GPLv2"
  3. HOMEPAGE = "http://www.host.com/foo/"
复制代码


这些选项所使用的选项名词是规定好了的,所以要多检查几次。

下面就是指定包的依赖关系了,包括编译时(或者构建时依赖):
  1. DEPENDS = "gtk+"
  2.         RDEPENDS = "cool-ttf-fonts"
复制代码


DEPENDS 就是构建时依赖了,这里这个包依赖于gtk+,然后cool-ttf-fonts就是运行时依赖。OE在
shlibs-code里把运行时依赖会添加上。根据你所添加包的实际情况来替换例子中。

有了这些信息,OE就知道了在编译此包之前应该编译好那些包。但是从那下包呢?下面我们就来指定包
的下载地址:

  1. SRC_URI = "http://www.host.com/foo/files/${P}.tar.bz2;md5sum=yoursum"
复制代码


这将告诉OE的下载程序到哪里去下载源码包,而且它还会使用您指定的yoursum 数据作md5sum校验。
yoursum 的生成可以使用如下方式:

  1. md5sum foo-1.9.tar.bz2
复制代码

       
然后你会得到类似这样的数据
  1. a6434b0fc8a54c3dec3d6875bf3be8
复制代码

在这段数据的后面添上mtn就是合法的yoursum了。

注意{P}变量代表包。${PN} 是包的名字,${PV}就是包的版本了。使用这些标记的话,下次如果你
把这个包的一个版本升级的话,直接拷贝这个文件就可以了,而不用你再重新写上具体的值。当然实际
上不会这么简单,因为一个新的包将会面临新的问题。

当我们执行实际的编译动作之前我们必须了解一个包在编译时依赖与那些包。如果幸运的话,我们可以
在一个包的源码包里发现configure脚本,这时候我们可以bitbake的类autotools 来解决包的编译。
如果源码包里还有.pro文件的就要包含qmake类。

使用这些类需要按照这样的格式:
  1. inherit autotools pkgconfig qmake
复制代码


好在我们是幸运的,大部分的程序都使用 autotool.

We are in luck!这将是一个很好的bb配方。这样这个包就可以被自动化的配置和编译了。

让我们开始编译吧:

  1. bitbake foo
复制代码

       
根据您的包的不同和您之前已经编译过了哪些包以及您的计算机的速度,这将会耗费一段时间。所以不要
着急。

.....过了一段时间之后.....

您的计算机屏幕上应该有类似这样的信息:

  1. NOTE: package foo-1.9-r0: task do_build: completed
  2. NOTE: package foo-1.9: completed
  3. NOTE: build 200605052219: completed
复制代码


一切似乎看起来都很好,但是请等等,回滚屏幕:
  1. NOTE: the following files where installed but not shipped:
  2.     /usr/weirdpath/importantfile.foo
复制代码

OE 包含了一些标准的路径和文件,但是它不一定能找到所有的东西。所以让我们告诉它这个文件的位置:

  1. FILES_${PN} += "/usr/weirdpath/importantfile.foo"
复制代码


这里一定要使用+= ,这告诉OE是添加一个文件而不是覆盖原来的设置。
 楼主| 发表于 2008-10-27 17:48:11 | 显示全部楼层

第4章和第5章

第4章 特殊功能

本章内容
*debian 包命名方式
*共享库的处理
*BitBake 的特性说明
*基于任务
*覆盖和重写

4.1 debian 包命名方式
  1. INHERIT +="debian"
复制代码

将上面这句添加到你的${DISTRO}.conf或者local.conf中该包产生的库文件将被重命名。假设一个包
的名字是foo,然后这个包编译时产生了一个(并且只有一个)libfoo.so.1.2.3库文件,那么根据
debian包命名机制这个包将被重命名为libfoo1。

4.2 共享库处理(shlibs)

打包一个软件的时候,此包的运行时依赖的其他包必须被添加。而且运行时依赖的包应当是最小化依赖的。
OE会自己分析一个包的所有二进制文件的最小依赖库,这就是SO_NEEDED库。然后OE会根据这个库来搜寻
安装这些库的其他包。这些包将被自动添加到RDEPENDS.这样,作为构建包的人就不需要担心共享库的问
题了因为这些会被自动添加上。

注意:这个机制并不会添加该包的插件。

4.3 BitBake
       
        ((这部分官方原版文档还没有完成!!!))
  1.         BBFILES := "${OEDIR}/openembedded/packages/*/*.bb ${LOCALDIR}/packages/*/*.bb"
  2.         BBFILE_COLLECTIONS = "upstream local"
  3.         BBFILE_PATTERN_upstream = "^${OEDIR}/openembedded/packages/"
  4.         BBFILE_PATTERN_local = "^${LOCALDIR}/packages/"
  5.         BBFILE_PRIORITY_upstream = "5"
  6.         BBFILE_PRIORITY_local = "10"
复制代码
       
4.4 bb基于任务的特性

“基于任务“是一种新的构建基本根文件系统的思想方法。task-base(基于任务) 允许你指定一个机器
的特性,然后“基于任务“ 的方法就可以根据机器特性来构建此发行版(oe里的发行版)支持的特性功能。

举个例子,加入一个oe发行版的配置文件里有这样的配置:
  1. DISTRO_FEATURES = "nfs smbfs ipsec wifi ppp alsa bluetooth ext2 irda pcmcia
  2.         usbgadget usbhost"
复制代码
机器特定的配置文件里这么写:
  1. MACHINE_FEATURES = "kernel26 apm alsa pcmcia bluetooth irda usbgadget"
复制代码

这样,“基于任务”的构建将支持pcmcia,但是却不会支持usbhost

        ((译者注:可以理解为功能集合,机器没有的功能当然是编译不了的了。))
       
“基于任务” 确切指明了那个选项是机器特定的那个是oe发行版特定的。机器相关的配置选项反映了机
器的能力和功能。然后oe发行版相关的选项反映了发行版维护者的想要添加和删除的功能。

4.5 重写和覆盖

((此部分官方文档尚未完成!!!))

第5章 常规操作

本章内容:
*创建一个新的发行版
*添加一个新的机器硬件
*添加一个新的包
**1.使用不稳定版本的源码包编译
*创建你自己的镜像
*使用一个预编译的工具链编译包
**1.工具链
**2.预编译库
**3.设置安装oe
**4.有用的提示
**5.重点提醒
*使用新的包格式

5.1 创建一个新的发行版

尽管创建一个新的发行版并不是非常复杂,但是我们还是建议您先使用oe现在已有的版本,因为做错一
件事情也是很容易的。要创建一个新的发行版,你需要添加一个配置文件到/conf/distro目录里,配置
文件需要包含以下内容:
  1.    *DISTRO_VERSION                          这样用户就知道了他在用那个版本的发行版
  2.    *DISTRO_TYPE(release/debug)        用来在各个包的“配方”里启用或者禁止某些特性:
  3.                                                                    比如打开内核输出信息的"debug"选项。
  4.    *libc的类型                                        是使用glibc(TARGET_OS=“linux”)呢还是使用uclibc
  5.                                                                    (TARGET_OS=“linux-uclibc”)呢?
  6.    *工具链版本                                        例如:基于gcc 3.4.4的版本应该有下面的配置:
  7.            PREFERRED_PROVIDERS+=" virtual/${TARGER_PREFIX}gcc-initial:gcc-cross-initial"
  8.            PREFERRED_PROVIDERS += " virtual/${TARGET_PREFIX}gcc:gcc-cross"
  9.            PREFERRED_PROVIDERS += " virtual/${TARGET_PREFIX}g++:gcc-cross"
  10.         PREFERRED_VERSION_binutils = "2.16"
  11.         PREFERRED_VERSION_binutils-cross = "2.16"
  12.        
  13.         REFERRED_VERSION_gcc = "3.4.4"
  14.         PREFERRED_VERSION_gcc-cross = "3.4.4"
  15.         PREFERRED_VERSION_gcc-initial-cross = "3.4.4"
  16.        
  17.         *DISTRO_FEATURES                         描述该发行版有什么特性。更多的内容请参考task-base(
  18.                                                                 “基于任务“)章节
  19.         *内核版本号支持的设备
  20.         PREFERRED_VERSION_linux-omap1_omap5912osk ?= "2.6.18+git"
  21.         PREFERRED_VERSION_linux-openzaurus ?= "2.6.17"
  22.        
  23.         *为了更稳定的构建,最好包含sane-srcdates.inc 文件,这个文件里包含了SRCDATE描述信息,
  24.         描述了meta库里面哪些“配方”是可以工作的。
  25.                 require conf/distro/include/sane-srcdates.inc
  26.         同时你应该在配置文件里包含全局的SRCDATE设置(格式是 iso 日期:年月日)
  27.        
  28.         SRCDATE = "20061014"
复制代码

5.2 添加一个新的硬件平台

为一个机器编译,oe当然先要知道这是支持的,所以要写一个机器的配置文件。这些文件都应该放在
/conf/machine目录。

通常还需要一些变量:
  1.         *TARGET_ARCH 描述该机器使用什么架构的CPU
  2.         *MACHINE_FEATURES 描述该机器有什么功能特性。具体参考“基于任务”一节。
  3.         *PREFERRED_PROVIDER_virtual/kernel 指出该机器的正确的内核“配方”(就是内核bb文件)。
复制代码
       
接下来您还要添加内核的“配方”。

5.3 添加一个新的包

5.3.1 使用不稳定版本的源码包编译

构建一个很新的包往往会造成很多混乱。为了不会对OE造成随机的损坏,弄清楚一个包的修正方案是值得的。
下面我们来告诉您如何正确的作这些:

* svn :添加'PV = "1.1+svnr${SRCREV}"'到你的bb文件。
* cvs :添加'PV = "1.1+cvs${SRCREV}"'到你的bb文件。

您可以在conf/distro/include/sane-srcrevs.inc追踪一个已知构建成功的修正。

如果你是真的想从最新的源码来构建,那么请把类似这样的语句
  1. 'SRCREV_pn-linux-davinci ?= ${AUTOREV}'
复制代码
添加到local.conf里。按照本例中的配置,你将必须为pn-linux-davinci从最新的源码构建包。

5.4 创建你自己的镜像

创建你自己的镜像是很容易的,只需要设置几个变量就可以了。
  1. *IMAGE_BASENAME 你的镜像的名字
  2. *PACKAGE_INSTALL 该镜像所包含的包列表
  3. *RDEPENDS 该镜像所依赖的运行时依赖包列表
  4. *IMAGE_LINGUAS 该包所支持的语言列表
复制代码

然后添上image类
  1. inherit image
复制代码

好了,image配方就可以用了。

5.5 使用一个预编译的工具链编译包

在oe中使用预编译的工具链是可行的。下面讨论了很多这方面的话题:

5.5.1.工具链

我们假定您有一个工具链并且包含了c,c++编译器,汇编器以及其他的工具。下面的列表展示了ARM架构
的3.4.4版本的gcc工具链。我们还假定工具链在您的PATH路径里。
  1. ls pre-built/cross/bin
  2. arm-linux-g++
  3. arm-linux-ld
  4. arm-linux-ranlib
  5. arm-linux-ar
  6. arm-linux-g77
  7. arm-linux-readelf
  8. arm-linux-as
  9. arm-linux-gcc
  10. arm-linux-gcc-3.4.4
  11. arm-linux-c++
  12. arm-linux-size
  13. arm-linux-c++filt
  14. arm-linux-nm
  15. arm-linux-strings
  16. arm-linux-cpp
  17. arm-linux-objcopy
  18. arm-linux-strip
  19. arm-linux-objdump
复制代码

5.5.2.预编译库

我们需要库头文件和库本身。下面的目录结构是假设的。PRE_BUILT(预编译的库)通常包含两个子目录:
一个是include,里面是头文件,另外一个是lib目录,里面是静态的和动态的链接库文件。另外,Qt2
目录页会有各include和lib子目录。
  1. ls $PRE_BUILT
  2. include
  3. lib
  4. qt2
复制代码
5.5.3.设置安装oe

这里我们将进行oe的设置。我们假定你的机器和发行版还不被oe所支持,所以就会在local.conf产生
相应的记录。你需要准备bitbake和oe的一个版本。

5.5.3.1创建环境变量脚本

为了简便起见,我们建议你创建一个可以加载的脚本,写上一些变量以便于使用。这里我们命名为
build_source,然后使用source命令加载它。
  1.         BITBAKE_PATH=/where/is/bitbake/bin
  2.         TOOLCHAIN=/where/is/toolchain/bin
  3.         HOST_TOOLS=/where/is/hosttools/bin
  4.         export PRE_BUILT=/where/is/pre-built
  5.         export PATH=$BITBAKE_PATH:$TOOLCHAIN:$HOST_TOOLS:$PATH
  6.         export OEDIR=$PWD
  7.         export LOCALDIR=$PWD/secret-isv
复制代码
使用source build_source 加载这个脚本,使用env命令检查你的设置是否正确。

5.5.3.2 创建local.conf文件

现在设置oe,跟上一步的操作类似。
  1.         DL_DIR = "${OEDIR}/sources"
  2.         BBFILES := "${OEDIR}/openembedded/packages/*/*.bb ${LOCALDIR}/packages/*/*.bb"
  3.         BBFILE_COLLECTIONS = "upstream local"
  4.         BBFILE_PATTERN_upstream = "^${OEDIR}/openembedded/packages/"
  5.         BBFILE_PATTERN_local = "^${LOCALDIR}/packages/"
  6.         BBFILE_PRIORITY_upstream = "5"
  7.         BBFILE_PRIORITY_local = "10"
  8.         BBMASK = ""
复制代码
${OEDIR}/openembedded将会是一个前卫的发布,以上我们设置它在当前的工作目录里。另外我们有
个变量${LOCALDIR},我们把这两各目录合并到BBFILE_COLLECTION。
  1.         #
  2.         # machine stuff
  3.         #
  4.         MACHINE = "secret-killer"
  5.         PACKAGE_EXTRA_ARCHS = "armv4 armv4t armv5te iwmmxt xscale""
  6.         TARGET_CC_ARCH = "-mcpu=xscale -mtune=iwmmxt"
  7.         TARGET_ARCH = "arm"
  8.         PACKAGE_ARCH="xscale"
复制代码

以上我们告诉oe我们将为ARM平台构建,并且为xscale和iwmmxt作了优化。
  1.         INHERIT += " package_ipk debian"
  2.         TARGET_OS  = "linux"
  3.         TARGET_FPU = "soft"
  4.         DISTRO = "secret-disro"
  5.         DISTRO_NAME = "secret-distro"
  6.         DISTRO_VERSION = "x.y.z"
  7.         DISTRO_TYPE = "release"
复制代码
创建一个发行版版本号。以上代码告诉oe我们将构建linux和glibc,使用软件的浮点数运算支持。如果
您的工具链是uclibc的,你还需要设置TARGET_OS为linux-uclibc
  1.         export CC="${CCACHE}arm-linux-gcc-3.4.4 ${HOST_CC_ARCH}"
  2.         export CXX="${CCACHE}arm-linux-g++ ${HOST_CC_ARCH}"
  3.         export CPP="arm-linux-gcc-3.4.4 -E"
  4.         export LD="arm-linux-ld"
  5.         export AR="arm-linux-ar"
  6.         export AS="arm-linux-as"
  7.         export RANLIB="arm-linux-ranlib"
  8.         export STRIP="arm-linux-strip"
复制代码
上面这些设置覆盖了bitbake.conf里的设置,这就会让oe使用预编译的工具链。
  1.         #
  2.         # point OE to the lib and include directory
  3.         #
  4.         TARGET_CPPFLAGS_append = " -I${PRE_BUILT}/include "
  5.         TARGET_LDFLAGS_prepend = " -L${PRE_BUILT}/qt2/lib -L${PRE_BUILT}/lib \
  6.         -Wl,-rpath-link,${PRE_BUILT}/lib -Wl,-rpath-link,${PRE_BUILT}/qt2/lib "
  7.        
  8.         # special to Qt/Qtopia
  9.         QTDIR  = "${PRE_BUILT}/qt2"
  10.         QPEDIR = "${PRE_BUILT}"
  11.         palmtopdir = "/opt/Qtopia"
  12.         palmqtdir  = "/opt/Qtopia"
复制代码
这个设置把PRE_BUILT预编译工具链的库和头文件添加了进来。Qt也一样。
  1.         ASSUME_PROVIDED += " virtual/${TARGET_PREFIX}gcc "
  2.         ASSUME_PROVIDED += " virtual/libc "
  3.         ASSUME_PROVIDED += " virtual/qte "
  4.         ASSUME_PROVIDED += " virtual/libqpe "
  5.         ASSUME_PROVIDED += " libqpe-opie "
复制代码
现在我们已经告诉了bitbake c库,编译器,Qtopia已经是准备好的了,oe不会再自己编译一份这些了。
  1.         source build_source
  2.         bitbake your-killer-app
复制代码
哈哈,现在你应该可以成功用你的预编译工具链来构建系统了。

5.5.4.有用的提示

如果你有更多的预编译的库,你还可以添加进来,在local.conf里适当设置ASSUME_PROVIDED变量就
可以了。使用bitbake -vvv PACKAGE命令你可以很容易的查看你添加的预编译的库。

5.5.5.重点提醒
  1.         NOTE: Couldn't find shared library provider for libqtopia.so.1
  2.         NOTE: Couldn't find shared library provider for libqtopia2.so.2
  3.         NOTE: Couldn't find shared library provider for libqpe.so.1
  4.         NOTE: Couldn't find shared library provider for libpthread.so.0
  5.         NOTE: Couldn't find shared library provider for libstdc++.so.6
  6.         NOTE: Couldn't find shared library provider for libqte.so.2
  7.         NOTE: Couldn't find shared library provider for libgcc_s.so.1
  8.         NOTE: Couldn't find shared library provider for libc.so.6
  9.         NOTE: Couldn't find shared library provider for libm.so.6
复制代码
OE在构建包时会自动那些运行时依赖的包。oe使用shlibs来添加它们。照此推理,预编译的库将不会被
找到。这意味着,oe构建包的时候不会把预编译库添加到RDEPENDS(运行时依赖)。这会导致严重的错
误,这样oe创建的镜像里也会丢掉那些预编译的库,这肯定是行不通的。为了解决这个问题,你应该创建
一个metadata(配方)把这些库都安装上,然后使用${BOOTSTRAP_EXTRA_RDEPENDS}以确保这些库会
被在创建包的时候安装上。

但是,这里有个更好的方法: 设置 ASSUME_SHLIBS变量。例如上文提到的包就可以这样设置:
  1.         ASSUME_SHLIBS = "libqtopia2.so.2:qtopia2_2.4 libc.so.6:libc"
复制代码
格式是:shlib文件名:包版本 (shlib_file_name: package[_version].).如果指定了特定的版本,
那么oe将认为这是版本依赖里最小的依赖版本。(译者注:也即至少要安装这个版本)。

5.6使用新的包格式

((官方文档尚未完成))



第6章 与其他的build工具比较

本章内容:
*buildroot
*crosstool
*handmade

6.1 buildroot

Bitbake的“配方“文件相比较makefile而言是很简单和直观的,并且可以提供更好的扩展性。这样你
就可以很快的编写适合您的需求的“配方“。使用OE你可以构建工具链,软件发行版开发包,完整的发行
版以及单个软件包。OE弹性的设计可以让你很好的重用你之前写好的“配方“。OE提供了所有buildroot
的功能,但是跟buildroot相比较,oe可以让你实现任何你想实现的,你可以添加新的打包方式支持,新
的文件系统,新的输出类型等等。总之,OE会非常适合你的口味!

6.2 crosstool

crosstool可以帮助你构建工具链。但是,它是能够构建工具链,它不能构建除工具链之外的其他库和
应用程序,它不能正确的解决包依赖,也不支持打包,但OE支持所有crosstool有的功能。

6.3 handmade (自己动手)

交叉编译是一个很头疼的问题。这并不是说交叉编译本身怎么样,而是大多数人误用他们的主机系统去直
接编译他们的软件。这会许会让你惹上大麻烦。这样的话在软件编译之前的配置阶段你就会失败,因为交
叉编译的二进制程序是不能在主机上直接运行的。使用OE你不用忙着到处去找补丁,OE会帮你搞定这些。
OE可以让你直接选择使用软件包。

OE可以生成直接用于烧写的flash镜像,并且支持很多种格式和文件系统。OE允许你非常容易的构建完整
的和定制的发行版。


((译者注:除了这些工具之外,T2 SDE也是一个支持定制和各种特性的构建工具,它还支持BSD等其他
的系统内核。))

第7章 如何使用bitbake和OpenEmbedded

本章内容
*简介
*配置
*工作空间
*任务
*单个“配方”相关的工作
*交互式的bitbake
*Devshell
        *.继承devshell类
        *.devshell附加特性
        *.使用devshell
*补丁和补丁管理

7.1 简介

阅读手册到这里您应该对于oe是什么应该比较清楚了,OE有很多的软件包可供选择,可以帮助你构建在
你的目标机器上运行的系统。这包括下载源码包,编译,打包或者生成可以烧到flash的镜像等。由于需
要进行令人头疼的交叉编译,还要支持各种类型的设备,所以,基于oe的发行版将比你知道的典型的桌面
发行版要复杂的多。

OE的主要功能是为各种工程项目的需要编译源码。不管是什么工程,以下任务都是要作的:

        1. 下载源码包,还有其他的系统支持文件(比如初始化脚本);
        2. 解压源码包,然后打上需要的补丁;
        3. 如果需要的话就进行软件包配置(比如运行configure脚本);
        4. 编译所有的东西;
        5. 把所有编译好的文件打成各种格式的包,然后准备安装。
       
其实这些并没有什么非常不寻常的。困难的是:
       
        1. 交叉编译:交叉编译是困难的,大部分软件包根本不支持交叉编译,OE里包含的都是支持交叉
        编译的。
        2. 目标系统和主机是不同的: 这意味着你不能编译一个程序就直接运行它---那是给在目标板上
        运行的。有很多的软件包在编译的时候会编译并且运行一些帮助或者测试程序,这在交叉编译的时
        候会导致失败。
        3.工具链总是很难编译的。交叉工具链更是如此。通常情况下你可能会选择去下载一个别人做好的,
        但是使用OE你就不需要如此。在OE里整个工具链在编译系统的时候都会被创建。OE的这种方式或许
        在开始的时候会带来一些困难和不便。但是如果你需要打上补丁或者对工具链做些调整就会很容易。
       
当然,除了这些之外,oe还有很多的功能,其中包括:
       
        * 同时支持glibc和uclibc;
        * 只使用oe一个工具你就可以为多种目标机器构建系统;
        * 自动编译一切构建时和编译时依赖的包;
        * 直接创建各种可以在目标机器上直接运行的镜像(包括jffs2,ext2.gz,squashfs等等);
        * 支持各种打包格式;
        * 自动构建交叉工具链;
        * 支持构建“本地包”。本地包指为了完成编译给主机编译的包,最终不会用到目标板上。

本章以下内容假设你已经掌握了OE的Getting Start guides(新手指南),并且已经能够正确安装和
配置oe,而且你也成功的构建了交叉工具链。本章节将告诉你OE的内幕以帮助你调式和开发oe。

下面的内容里也不会提到诸如变量设置和指定目录这样的主题,如果需要你应该参照第8章:"包'配方'"
的内容.

7.2 配置

配置涵盖的内容包括在哪里可以找到各种文件,输出或者生成的东西应该放在哪里,还有指定一些配置
选项比如在最终的镜像中你想让它包括那些功能和特性。OE里主要的配置区域有:

conf/machine

        此目录包含了目标机器的配置信息。每个平台设备都有一个专属的配置文件用来描述诸如:设备的
        架构体系,硬件特性(该设备有usb吗,有键盘吗等等),以及该机器需要什么类型的flash和磁盘
        镜像,串口设置啊等等信息。如果你要添加一个新的目标板,你应该为这个目标板创建一个单独的
        配置文件。
       
conf/distro
       
        这个目录包含了oe发行版相关的配置文件,定义了一个发行版在最终的镜像里会包含那些东西。比
        如:网络如何配置,是否支持usb,使用那种打包方式,使用什么样的libc(uclibc或者glibc?)
       
conf/bitbake.conf

        这是bitbake的主配置文件。这个文件我们不会编辑它,但是我们可以看看文件里包含的大量oe使用
        的变量设置,以及bitbake如何控制那么多oe提供的功能。

conf/local.conf
       
        这是面向最终用户(或者说普通用户)的配置文件.用户需要复制和编辑这个文件,配置各种工作目
        录,将要使用的机器,还有发行版等等。
       
7.3 工作空间

让我们先看看一个典型的工作空间设置吧。这里的可能会跟你的大不一样,但是看看这个我们可以了解
事情是怎么样进行的。这里我们看看tmp目录(tmp目录是在你的local.conf里的变量TMPDIR里设置的):
  1.         ~%> find tmp -maxdepth 2 -type d
  2.         tmp
  3.         tmp/stamps
  4.         tmp/cross
  5.         tmp/cross/bin
  6.         tmp/cross/libexec
  7.         tmp/cross/lib  
  8.         tmp/cross/share
  9.         tmp/cross/sh4-linux
  10.         tmp/cache
  11.         tmp/cache/titan
  12.         tmp/work
  13.         tmp/work/busybox-1.2.1-r13
  14.         tmp/work/libice-1_1.0.3-r0
  15.         tmp/work/arpwatch-2.1a15-r2
  16.         ...
  17.         tmp/rootfs
  18.         tmp/rootfs/bin
  19.         tmp/rootfs/usr
  20.         tmp/rootfs/media
  21.         tmp/rootfs/dev  
  22.         tmp/rootfs/var  
  23.         tmp/rootfs/lib  
  24.         tmp/rootfs/sbin
  25.         tmp/rootfs/mnt  
  26.         tmp/rootfs/boot
  27.         tmp/rootfs/sys  
  28.         tmp/rootfs/proc
  29.         tmp/rootfs/etc  
  30.         tmp/rootfs/home
  31.         tmp/rootfs/tmp  
  32.         tmp/staging     
  33.         tmp/staging/man
  34.         tmp/staging/x86_64-linux
  35.         tmp/staging/pkgdata
  36.         tmp/staging/pkgmaps
  37.         tmp/staging/var
  38.         tmp/staging/sh4-linux
  39.         tmp/staging/local
  40.         tmp/staging/etc  
  41.         tmp/deploy
  42.         tmp/deploy/addons
  43.         tmp/deploy/ipk   
  44.         tmp/deploy/sources
  45.         tmp/deploy/images
复制代码
tmp目录下的第一级目录包括:

stamps

        用户不需要关心这个目录。这里是bitbake放置的时间戳,用来标记和追踪什么任务已经完成了,
        什么任务还在等待处理。这样bitbake就会知道什么事情已经做过了,而不用再重做一边。
       
cross

        这里放置的是交叉工具链。包括运行在主机上但给目标机器产生程序的gcc和binutils。
       
cache

        用户不需要关心这个目录。bitbake在这里缓冲数据,这样可以加速bitbake的运行,bitbake在
        第2次之后运行的时候就不用再去从“配方“文件里读取数据了。
       
work
       
        工作目录。这就是所有包被构建的地方。包在这里被解压,打补丁,配置,编译,安装和打包。这
        将是你运行oe的时候大部分时间要查看的地方。
       
rootfs

        oe为你的目标板生成的根文件系统镜像就放在这里。就是根文件系统的内容(注意:这是没有正确
        的设备节点的虚拟根目录。)
       
staging

        stage目录,用来存放一些中途编译的用于主机的临时工具。
       
deploy

        包含了oe最终产生的东西。包括:打包了的程序,flash或者磁盘镜像。这是你最终用到你产品上
        的东西。
       
当人们说起"临时目录"的时候就说的这个tmp目录。

当你需要重新构建系统的时候,你或许应该重新命名这个目录或者删除它。我建议你保留老的tmp目录以
便后面比对看看究竟问题出在哪里。给个例子:
  1.         %> rm -fr tmp.OLD
  2.         $> mv tmp tmp.OLD
  3.         %> bitbake bootstrap-image
复制代码

工作目录(temp/work)

就像上面说的,work目录才是包被解压,打补丁,编译和打包的地方。换句话说,这里才是所有事情发
生的地方。在这里,每个“配方“都会产生一个单独的子目录,里面包含了“配方“名,版本号,发布号等。

这里给个例子,仅仅列出了一些文件:
  1.         ~%> find tmp/work -maxdepth 1 -type d | head -4
  2.         tmp/work
  3.         tmp/work/busybox-1.2.1-r13
  4.         tmp/work/libice-1_1.0.3-r0
  5.         tmp/work/arpwatch-2.1a15-r2
复制代码
你看到的是几百个里的前三个,分别是busybox 1.2.1的第13个发布版,libice的1.1.0.3的0版和
arpwath的2.1a15的2版。你也可以把这里目录放在一个为你的机器和发行准备的特性目录里,就像下面
的这样:
  1.         ~%> find tmp/work -maxdepth 2 -type d | head -4
  2.         tmp/work
  3.         tmp/work/sh4-linux
  4.         tmp/work/sh4-linux/busybox-1.2.1-r13
  5.         tmp/work/sh4-linux/libice-1_1.0.3-r0
  6.         tmp/work/sh4-linux/arpwatch-2.1a15-r2
复制代码

上面例子中的sh4-linux目录说明这个发行版是为sh4机器准备的linux系统。oe对这个特性的支持就
保证了它可以同时为多平台目标构建系统。这样做可以让拥有不同内核的构建版本在构建过程中共享一些
库和机器不相关的包以节省编译时间和空间。文中下面的内容会假设你并没有使用多平台编译这个功能。
如果你要使用请记得自己添加一个目录。

下面使用lzo 1.08作为例子,我们来看看一个典型的“配方“的工作目录的内容是怎样的:
  1.         ~%> find tmp/work/lzo-1.08-r14 -maxdepth 1
  2.         tmp/work/lzo-1.08-r14
  3.         tmp/work/lzo-1.08-r14/temp
  4.         tmp/work/lzo-1.08-r14/lzo-1.08
  5.         tmp/work/lzo-1.08-r14/install
  6.         tmp/work/lzo-1.08-r14/image
复制代码

tmp/work/lzo-1.08-r14就是配方lzo-1.08-r14的工作目录,这个是在bitbake的WORKDIR变量里
设置的。1.08是lzo的版本,r14是发布号,是在“配方“里的PR变量里设置的。

**译者注: 这里的WORKDIR实际上变动的,当每编译一个包的时候,WORKDIR就会是当前包的工作目录。

在WORKDIR下面有4个子目录:

temp

        temp目录包含了日志和一些特殊用途的脚本,比如用于配置和编译源码的脚本。
       
        你可以在这个目录里查看日志以了解到底那些做了,那些还没有。这是在你报告bug之前首先应该
        查看和收集的。
       
        这里的脚本实际上是oe编译包的时候执行的,你可以看看那些究竟是怎么完成的。
       
lzo-1.08

        这个就是lzo的源码目录。目录的名字由两部分构成 "<包名>-<版本>" ,在“配方“用变量S来代
        表,如果源码包是被解压在其他什么地方的话,那么就应该在“配方“里的S变量里设定一下。
       
image

        这是镜像目录(没有打包的)或者叫目标板根文件系统目录。在配方里用变量D代替,所以一个包
        里的程序安装到/usr/bin的实际要安装在${D}/usr/bin里,所以一定不要忘了${D},我想你也
        不想让oe把你主机上的程序换成交叉编译了的!
       
install

        install目录是用来存放打包了的程序的。每个程序安装到image目录里的文件将被建一个目录
        然后安装在image里的目录结构来存放(同时还包括-doc,-dbg,-dev目录),然后打包。
        (译者注        :实际上几乎所有的打包都是这样的方式,包括rpm和deb)。配方里的FILES_
        和PACKAGES变量记录了如何控制从image里取出属于该包的文件到单独的目录。
       
(看这个真无聊!活跃下气氛吧!)让我们来看看一些你会用到的信息吧:

怎么知道lzo包的配置阶段究竟发生了什么呢?
        答案当然是检查temp目录里的日志文件了:
  1.         ~%> less tmp/work/lzo-1.08-r14/temp/log.do_configure.*
  2.         ...
  3.         checking whether ccache sh4-linux-gcc -ml -m4 suffers the -fschedule-insns                 bug...         unknown
  4.         checking whether ccache sh4-linux-gcc -ml -m4 suffers the -fstrength-reduce         bug... unknown
  5.         checking whether ccache sh4-linux-gcc -ml -m4 accepts -fstrict-aliasing... yes
  6.         checking the alignment of the assembler... 0
  7.         checking whether to build assembler versions... no
  8.         configure: creating ./config.status
  9.         config.status: creating Makefile
  10.         config.status: creating examples/Makefile
  11.         config.status: creating include/Makefile
  12.         config.status: creating ltest/Makefile
  13.         config.status: creating minilzo/Makefile
  14.         config.status: creating src/Makefile
  15.         config.status: creating tests/Makefile
  16.         config.status: creating config.h
  17.         config.status: executing depfiles commands
复制代码

哦,或者你想想看看到底oe怎么从image镜像里的一对文件里找出这个包的文件然后放到一起打包的呢?
对了!看看install目录不就知道了么:
  1.         ~%> find tmp/work/lzo-1.08-r14/install               
  2.         tmp/work/lzo-1.08-r14/install
  3.         tmp/work/lzo-1.08-r14/install/lzo-doc
  4.         tmp/work/lzo-1.08-r14/install/lzo-dbg
  5.         tmp/work/lzo-1.08-r14/install/lzo-dbg/usr
  6.         tmp/work/lzo-1.08-r14/install/lzo-dbg/usr/lib
  7.         tmp/work/lzo-1.08-r14/install/lzo-dbg/usr/lib/.debug
  8.         tmp/work/lzo-1.08-r14/install/lzo-dbg/usr/lib/.debug/liblzo.so.1.0.0
  9.         tmp/work/lzo-1.08-r14/install/lzo-dev
  10.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr
  11.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include
  12.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo2a.h
  13.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1y.h
  14.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1.h
  15.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1b.h
  16.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1f.h
  17.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzoconf.h
  18.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1x.h
  19.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo16bit.h
  20.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1a.h
  21.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1z.h
  22.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzoutil.h
  23.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1c.h
  24.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib
  25.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib/liblzo.a
  26.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib/liblzo.so
  27.         tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib/liblzo.la
  28.         tmp/work/lzo-1.08-r14/install/lzo.shlibdeps
  29.         tmp/work/lzo-1.08-r14/install/lzo-locale
  30.         tmp/work/lzo-1.08-r14/install/lzo
  31.         tmp/work/lzo-1.08-r14/install/lzo/usr
  32.         tmp/work/lzo-1.08-r14/install/lzo/usr/lib
  33.         tmp/work/lzo-1.08-r14/install/lzo/usr/lib/liblzo.so.1
  34.         tmp/work/lzo-1.08-r14/install/lzo/usr/lib/liblzo.so.1.0.0
复制代码
       
7.4 "任务"

当你要编译安装一个软件包时,就会有很多任务要执行,并且对于绝大多数软件包来说都是这样的。你
可能会从下载源码包开始,然后解压源码包。或许你会因为一些原因打上一些补丁,然后,你会运行包
的configure脚本,或许你还会根据你的喜好给它传递一些参数,然后你会运行“make install”来
安装这个软件。如果实际上你是想构建二进制包,比如.deb或者.rpm的话你或许还会做一些事情。

你会发现实际上OpenEmbedded的工作与这个类似。这里将会有一大堆要执行的“任务“,顺序取决于
每个“配方“里定义和配置。这些任务里的许多都跟"下载源码"这样任务的都是类似的。实际上你都已
经见过这里的一些任务了--bitbake在运行任务的时候会显示它们的:
  1.         ~%> bitbake lzo
  2.         NOTE: Psyco JIT Compiler (http://psyco.sf.net) not available. Install it to         increase performance.
  3.         NOTE: Handling BitBake files: \ (4541/4541) [100 %]
  4.         NOTE: Parsing finished. 4325 cached, 0 parsed, 216 skipped, 0 masked.
  5.         NOTE: build 200705041709: started
  6.         OE Build Configuration:
  7.         BB_VERSION     = "1.8.2"
  8.         OE_REVISION    = "<unknown>"
  9.         TARGET_ARCH    = "sh4"
  10.         TARGET_OS      = "linux"
  11.         MACHINE        = "titan"
  12.         DISTRO         = "erouter"
  13.         DISTRO_VERSION = "0.1-20070504"
  14.         TARGET_FPU     = ""
  15.         NOTE: Resolving missing task queue dependencies
  16.         NOTE: preferred version 2.5 of glibc not available (for item virtual/sh4-linux-libc-for-gcc)
  17.         NOTE: Preparing Runqueue
  18.         NOTE: Executing runqueue
  19.         NOTE: Running task 208 of 226 (ID: 11, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_fetch)
  20.         NOTE: package lzo-1.08: started
  21.         NOTE: package lzo-1.08-r14: task do_fetch: started
  22.         NOTE: package lzo-1.08-r14: task do_fetch: completed
  23.         NOTE: package lzo-1.08: completed
  24.         NOTE: Running task 209 of 226 (ID: 2, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_unpack)
  25.         NOTE: package lzo-1.08: started
  26.         NOTE: package lzo-1.08-r14: task do_unpack: started
  27.         NOTE: Unpacking /home/lenehan/devel/oe/sources/lzo-1.08.tar.gz to /home/lenehan/        devel/oe/build/titan-glibc-25/tmp/work/lzo-1.08-r14/
  28.         NOTE: package lzo-1.08-r14: task do_unpack: completed
  29.         NOTE: package lzo-1.08: completed
  30.         NOTE: Running task 216 of 226 (ID: 3, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_patch)
  31.         NOTE: package lzo-1.08: started
  32.         NOTE: package lzo-1.08-r14: task do_patch: started
  33.         NOTE: package lzo-1.08-r14: task do_patch: completed
  34.         NOTE: package lzo-1.08: completed
  35.         NOTE: Running task 217 of 226 (ID: 4, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_configure)
  36.         NOTE: package lzo-1.08: started
  37.         NOTE: package lzo-1.08-r14: task do_configure: started
  38.         NOTE: package lzo-1.08-r14: task do_configure: completed
  39.         NOTE: package lzo-1.08: completed
  40.         NOTE: Running task 218 of 226 (ID: 12, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_qa_configure)
  41.         NOTE: package lzo-1.08: started
  42.         NOTE: package lzo-1.08-r14: task do_qa_configure: started
  43.         NOTE: Checking sanity of the config.log file
  44.         NOTE: package lzo-1.08-r14: task do_qa_configure: completed
  45.         NOTE: package lzo-1.08: completed
  46.         NOTE: Running task 219 of 226 (ID: 0, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_compile)
  47.         NOTE: package lzo-1.08: started
  48.         NOTE: package lzo-1.08-r14: task do_compile: started
  49.         NOTE: package lzo-1.08-r14: task do_compile: completed
  50.         NOTE: package lzo-1.08: completed
  51.         NOTE: Running task 220 of 226 (ID: 1, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_install)
  52.         NOTE: package lzo-1.08: started
  53.         NOTE: package lzo-1.08-r14: task do_install: started
  54.         NOTE: package lzo-1.08-r14: task do_install: completed
  55.         NOTE: package lzo-1.08: completed
  56.         NOTE: Running task 221 of 226 (ID: 5, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_package)
  57.         NOTE: package lzo-1.08: started
  58.         NOTE: package lzo-1.08-r14: task do_package: started
  59.         NOTE: DO PACKAGE QA
  60.         NOTE: Checking Package: lzo-dbg
  61.         NOTE: Checking Package: lzo
  62.         NOTE: Checking Package: lzo-doc
  63.         NOTE: Checking Package: lzo-dev
  64.         NOTE: Checking Package: lzo-locale
  65.         NOTE: DONE with PACKAGE QA
  66.         NOTE: package lzo-1.08-r14: task do_package: completed
  67.         NOTE: package lzo-1.08: completed
  68.         NOTE: Running task 222 of 226 (ID: 8, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_package_write)
  69.         NOTE: package lzo-1.08: started
  70.         NOTE: package lzo-1.08-r14: task do_package_write: started
  71.         Packaged contents of lzo-dbg into /home/lenehan/devel/oe/build/titan-glibc-25/tmp/deploy/ipk/sh4/liblzo-dbg_1.08-r14_sh4.ipk
  72.         Packaged contents of lzo into /home/lenehan/devel/oe/build/titan-glibc-25/tmp/deploy/ipk/sh4/liblzo1_1.08-r14_sh4.ipk
  73.         NOTE: Not creating empty archive for lzo-doc-1.08-r14
  74.         Packaged contents of lzo-dev into /home/lenehan/devel/oe/build/titan-glibc-25/tmp/deploy/ipk/sh4/liblzo-dev_1.08-r14_sh4.ipk
  75.         NOTE: Not creating empty archive for lzo-locale-1.08-r14
  76.         NOTE: package lzo-1.08-r14: task do_package_write: completed
  77.         NOTE: package lzo-1.08: completed
  78.         NOTE: Running task 223 of 226 (ID: 6, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_populate_staging)
  79.         NOTE: package lzo-1.08: started
  80.         NOTE: package lzo-1.08-r14: task do_populate_staging: started
  81.         NOTE: package lzo-1.08-r14: task do_populate_staging: completed
  82.         NOTE: package lzo-1.08: completed
  83.         NOTE: Running task 224 of 226 (ID: 9, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_qa_staging)
  84.         NOTE: package lzo-1.08: started
  85.         NOTE: package lzo-1.08-r14: task do_qa_staging: started
  86.         NOTE: QA checking staging
  87.         NOTE: package lzo-1.08-r14: task do_qa_staging: completed
  88.         NOTE: package lzo-1.08: completed
  89.         NOTE: Running task 225 of 226 (ID: 7, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_distribute_sources)
  90.         NOTE: package lzo-1.08: started
  91.         NOTE: package lzo-1.08-r14: task do_distribute_sources: started
  92.         NOTE: package lzo-1.08-r14: task do_distribute_sources: completed
  93.         NOTE: package lzo-1.08: completed
  94.         NOTE: Running task 226 of 226 (ID: 10, /home/lenehan/devel/oe/build/titan-        glibc-25/packages/lzo/lzo_1.08.bb, do_build)
  95.         NOTE: package lzo-1.08: started
  96.         NOTE: package lzo-1.08-r14: task do_build: started
  97.         NOTE: package lzo-1.08-r14: task do_build: completed
  98.         NOTE: package lzo-1.08: completed
  99.         NOTE: Tasks Summary: Attempted 226 tasks of which 213 didn't need to be rerun and 0 failed.
  100.         NOTE: build 200705041709: completed
复制代码
  1.         注意:输出信息根据你的实际情况可能跟这个是不同的。重点是看看各种任务怎么被执行的,
  2.         bitbake显示了它什么时候开始一个任务,然后什么时候完成了这个人物。
复制代码

所以说,为了生成一个最终的包将有一大堆的任务需要执行。你看到了每个配方都运行了一组相同的任
务(当然一个配方亦可以运行另外的任务,这个我们后面会谈到的)。那些任务大都跟下面的类似:

获取源码(fetch)

        获取源码任务 对于获取任何源码都是很重要的。这里说的包括下载文件和从一些版本控制的软件仓
        库里获取源码,比如git和svn

解压(unpack)

        解压任务 对于从一些压缩格式中解出文件是至关重要的,比如.tar.gz,解压任务会把文件解压到
        工作空间,然后还会拷贝些附件的文件,比如初始化脚本。
       
打补丁(patch)

        此任务可以给解压了的包打上任何补丁。
       
配置(configure)

        配置任务 执行包的配置阶段。通常是运行configure脚本("./configure <选项>"),configure
        不是唯一存在的软件配置系统(译者注:有些软件会使用其他类型的配置系统)
       
编译(compile)

        编译任务 才实际上编译软件。这可能会很简单,有时就是运行make
       
中间处理环节(populate_staging (stage) )

        中间处理任务 用来作一些库和头文件的设置。比如,你编译了zlib,然后你就应当设置一下以便
        其他的软件编译的时候可以找到头文件和库文件。
       
        注意:
        这里的中间处理设置库和头文件跟设置主机上的是不同的,因此,下文说的“安装”任务里的设置
        是为了目标系统最终使用的,而这里的仅仅是为了编译过程。
       
安装(install)

        安装任务 实际上安装所有的东西。软件被安装到目标目录(D变量)。D目录最终并不会成为软件的
        一部分,一个软件被安装到${D}/bin,但在目标机器上就会是/bin.
       
装包(package)

        装包任务 为每个包把已安装上的文件从${WORKDIR}/install目录里分离出来到单独的目录,然后
        移动到该包的目标目录($D)以便打包.通常一个主包将会有一个独立的-doc,-dev和-dbg目录。
       
打包(package_write)

        打包 任务把 “装包“环节产生的每个软件的目录打包成各种格式,比如.ipk,.deb,.rpm等。目前
        .ipk是唯一被完全支持的包格式,.dev现在也能工作了。对于有经验的oe开发者来说添加一个其他
        的包格式是很容易的如果需要的话。
       
        注意:
        或许你已经注意到bitbake在任务输出里加了前缀“do_”,比如install为do_install.这会令
        人有点迷惑,因为在“配方“和一些类里有很多函数也有"do_"前缀。你应该只关注do_前缀后面的
        信息。(译者注:那仅仅是bitbake的很随便的一个输出而已,表示它作“做“什么,跟那些函数
        没有直接的联系)。

你应该注意下面的这个内容:在一个“任务“队列里添加附加的任务有很多种方式。比如类insane.bbclass
,它可以作各种QA检查(验证),你可以在配置(configure)和编译(compile)任务中间添加一个新的
任务叫做"qa_configure",在中间处理环节任务和安装任务中间添加"qa_staging"的任务. 这样就会
在实际执行的时候验证配置和中间处理环节的执行结果。

想看看一个包配方都支持哪些任务,你可以用bitbake来完成,运行类似下面的命令:
  1.         ~%> bitbake -b packages/perl/perl_5.8.8.bb -c listtasks
  2.         NOTE: package perl-5.8.8: started
  3.         NOTE: package perl-5.8.8-r11: task do_listtasks: started
  4.         do_fetchall
  5.         do_listtasks
  6.         do_rebuild
  7.         do_compile
  8.         do_build
  9.         do_populate_staging
  10.         do_mrproper
  11.         do_fetch
  12.         do_configure
  13.         do_clean
  14.         do_package
  15.         do_unpack
  16.         do_install
  17.         do_package_write
  18.         do_distribute_sources
  19.         do_showdata
  20.         do_qa_configure
  21.         do_qa_staging
  22.         do_patch
  23.         NOTE: package perl-5.8.8-r11: task do_listtasks: completed
  24.         NOTE: package perl-5.8.8: completed
  25.         ~%>
复制代码

如果你是个细心的读者,你或许会注意到listtasks本身就是一个任务,-c选项让bitbake执行了listtasks
任务。在下一节中我们会用到这个。

7.5 单个“配方”相关的工作
       
在开发过程中,你会发现你大多数时间都在跟一个bitbake“配方“打交道,要么是修复什么,要么就是
添加一个新的版本,或者是写一个全新的配方。现在你已经有了所有关于“任务”的知识,这可以帮助加
速你的开发和调试过程。

Bitbake可以被指定直接的处理一个单个“配方”文件,使用-b参数就可以了,这个选项把“配方”作为
一个参数传递给bitbake,bitbake将只会处理这个名字的“配方”。注意,这种方式忽略了依赖关系,
所以你需要在这之前装好所有它依赖的包。

下面给出一个典型的例子,本例使用"清理"任务来清理包,然后打开bitbake的debug输出来重新构建:
  1.         ~%> bitbake -b <bb-file> -c clean
  2.         ~%> bitbake -b <bb-file> -D
复制代码

下面是bitbake的一些最常用的选项介绍:

-b <bb文件>
        要处理的“配方”;
       
-c <动作(或者说“任务”)>
        要执行的动作,通常是配方所支持的“任务“

-D
        显示调试信息,使用两个-D会打开附加调试信息。
       
-f
        强制执行某个操作。这个在处理bitbake正常模式下不会执行的操作时很有用。举个例子,如果你
        把相同的任务写了两边,那么bitbake在第二次的时候会什么也不做因为之前已经作过了。使用-f
        可以强制它执行。
       
        最常用的动作包括(和-c选项一起使用):
       
        fetch                 (获取源码)
                下载所有需要的源码文件,但是不干其他的事情。
        unpack                (解压)
                解压源码,但不打补丁。有时候你需要看看刚解压的源码,而不是已经打上补丁的(有时候你
                需要手动使用干净的源码来生成一个包的补丁)
        patch                (打补丁)
                打上所有的补丁
        configure        (配置)
                配置软件包。
        compile
                编译软件包。
        stage                (中间环节)
                任何被另一个包需要的文件比如头文件和库文件都会被安装。
        install
                安装软件,为后面的打包准备。
        package
                产生软件包,把文件从安装目录移动到打包安装目录。如果要重新产生的话得首先重新执行
                安装动作。
        clean
                清理这个版本的软件的整个目录。
               
        注意,任何和“任务“相对应动作的都会执行在它之前还没有执行过的“任务“,所以执行编译
        (compile)也将会执行获取源码,解压,打补丁,和配置动作。
       
        通常情况下一个开发过程伴随这编辑文件和重新构建一直到它可以正常工作:
  1.        
  2.         [... 测试 ...]
  3.         ~%> bitbake -b packages/testapp/testapp_4.3.bb -c compile -D
  4.        
  5.         [... 复制一份 main.c 然后做些修改 ...]
  6.         ~%> vi tmp/work/testapp-4.3-r0/main.c
  7.         ~%> bitbake -b packages/testapp/testapp_4.3.bb -c compile -D -f
  8.        
  9.         [... 建了一个补丁文件,然后写到包“配方”里 ...]
  10.         ~%> vi packages/testapp/testapp_4.3.bb
  11.        
  12.         [... 清理了重新测试 ...]
  13.         ~%> bitbake -b packages/testapp/testapp_4.3.bb -c clean
  14.         ~%> bitbake -b packages/testapp/testapp_4.3.bb
  15.         [... 注意这里没有讨论怎么去生成一个补丁文件 ...]
复制代码
7.6 交互式bitbake

要做交互式测试使用:
  1.         ~%> bitbake -i
复制代码

这样会打开一个bitbake 命令行(bitbake shell),这里面有很多命令(使用help查看)。

你需要知道的第一件事情是解析“配方”文件(最新的bitbake版本可以自动的做这些,所以你不需要
手动来):
  1.         BB>> parse
复制代码
       
你可以构建指定的“配方“
  1.         BB>> build net-snmp
复制代码

如果这个失败了你可以清理它,然后重试:
  1.         BB>> clean net-snmp
复制代码

如果你编辑了.bb文件修正了某些东西,你或许想清理包,重新解析“配方”,然后构建:
  1.         BB>> clean net-snmp
  2.         BB>> reparse net-snmp
  3.         BB>> build net-snmp
复制代码

注意在bitbake命令行里是可以使用通配符的:
  1.         BB>> build t*
复制代码
       
       
7.7 Devshell

在oe里,有一个内容是设置各种环境变量(比如像CC,PATH等等)为合适的值以便进行交叉编译。如果你
希望在开发过程中手动运行configure脚本,编译文件,那么设置好这些变量会很有利。devshell提供
给你一个交互式的命令行来设置合适的变量以便后面的交叉编译工作。

        7.7.1 继承devshell类
       
        这是一种新的使用devshell的方式,也是推荐用户使用的方式。新的方式需要在配置文件里继承
        devshell类,通常这是在你的local.conf或者你的发行版配置文件里设置的:
       
  1.                 INHERIT += "src_distribute_local insane multimachine devshell"
复制代码
               
        包含这个类之后你会发现devshell已经被作为一个新的“任务”可以在配方中使用了:
  1.        
  2.                 ~%> bitbake -b packages/lzo/lzo_1.08.bb -c listtasks
  3.                 NOTE: package lzo-1.08: started
  4.                 NOTE: package lzo-1.08-r14: task do_listtasks: started
  5.                 do_devshell
  6.                 do_fetchall
  7.                 do_listtasks
  8.                 do_rebuild
  9.                 do_compile
  10.                 do_build
  11.                 do_mrproper
  12.                 do_fetch
  13.                 do_configure
  14.                 do_clean
  15.                 do_populate_staging
  16.                 do_package
  17.                 do_unpack
  18.                 do_install
  19.                 do_package_write
  20.                 do_distribute_sources
  21.                 do_showdata
  22.                 do_qa_staging
  23.                 do_qa_configure
  24.                 do_patch
  25.                 NOTE: package lzo-1.08-r14: task do_listtasks: completed
  26.                 NOTE: package lzo-1.08: completed
复制代码

        要呼出devshell你可以在处理一个“配方“的时候给bitbake传递 -c devshell 参数:
  1.                 ~%> ./bb -b packages/lzo/lzo_1.08.bb -c devshell
  2.                 NOTE: package lzo-1.08: started
  3.                 NOTE: package lzo-1.08-r14: task do_devshell: started
  4.                 [... devshell 将在这里显示 ...]
  5.                 NOTE: package lzo-1.08-r14: task do_devshell: completed
  6.                 NOTE: package lzo-1.08: completed
复制代码
       
        devshell怎么样显示取决于TERMCMD变量的设置,你可以在conf/bitbake.conf文件查看默认设
        置以及其他相关的值。如果愿意你可以在你的local.conf里设置。通常情况下你会看到打开了一个
        你的终端窗口,这就是devshell窗口。
       
        devshell“任务“是插在打补丁(patch)“任务“之后的,所以如果你是在用bitbake处理的一个
        “配方“的话,在打开shell之前它会先下载源码和添加补丁。
       
        注意:这种打开devshel的方式在你使用bash shell的时候才能工作。zsh已知是不能工作的,其
        他可能也可能不能工作。
       
        7.7.2 devshell附加特性
       
        devshell附加特性就是以前打开devshell的方式。
       
        这种方式不需要你改变配置文件,而是首先你构建devshell配方(devshell被作为一个包来处理)。
  1.        
  2.                 bitbake devshell
复制代码

        然后,手动运行devshell。一旦在devshell里,你通常需要进入工作目录:
  1.                 ~%> ./tmp/deploy/addons/sh4-linux-erouter-titan-devshell
  2.                 bash: alias: `./configure': invalid alias name
  3.                 [OE::sh4-linux-erouter-titan]:~$ cd tmp/work/lzo-1.08-r14/lzo-1.08
  4.                 [OE::sh4-linux-erouter-titan]:~tmp/work/lzo-1.08-r14/lzo-1.08$
复制代码
       
        注意devshell是依赖于目标机器和系统的,所以你用的名字可能与此不同,看看以-devshell结尾
        的名字。
       
        7.7.3 使用devshell
       
        ((官方文章尚未完成!))
       
       
7.8 补丁和补丁管理

((官方文章尚未完成!))
回复 支持 反对

使用道具 举报

发表于 2008-10-27 21:48:13 | 显示全部楼层
刚在邮件列表看到信息,特来顶一个
  1. 建议用代码方式来贴
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-28 11:10:15 | 显示全部楼层
已将代码部分标记。谢谢!
回复 支持 反对

使用道具 举报

发表于 2008-11-5 01:02:38 | 显示全部楼层
顶啊!最近也在搞poky。 多谢楼主!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-29 00:13:57 | 显示全部楼层

OE手册接着翻译: 已经完成8.11的几个小节.大家留意查看!

最近终于抽空可以做下之前一直没有做完的事情了,看看已经将近两年了,甚是惭愧,人有时候的诺言确实兑现不了.

不过确实该把这个做完了,今天接着翻译了8.11的几小节,后面的也会跟上,大家拍转吧.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表