|
楼主 |
发表于 2008-10-27 17:48:11
|
显示全部楼层
第4章和第5章
第4章 特殊功能
本章内容
*debian 包命名方式
*共享库的处理
*BitBake 的特性说明
*基于任务
*覆盖和重写
4.1 debian 包命名方式
将上面这句添加到你的${DISTRO}.conf或者local.conf中该包产生的库文件将被重命名。假设一个包
的名字是foo,然后这个包编译时产生了一个(并且只有一个)libfoo.so.1.2.3库文件,那么根据
debian包命名机制这个包将被重命名为libfoo1。
4.2 共享库处理(shlibs)
打包一个软件的时候,此包的运行时依赖的其他包必须被添加。而且运行时依赖的包应当是最小化依赖的。
OE会自己分析一个包的所有二进制文件的最小依赖库,这就是SO_NEEDED库。然后OE会根据这个库来搜寻
安装这些库的其他包。这些包将被自动添加到RDEPENDS.这样,作为构建包的人就不需要担心共享库的问
题了因为这些会被自动添加上。
注意:这个机制并不会添加该包的插件。
4.3 BitBake
((这部分官方原版文档还没有完成!!!))- BBFILES := "${OEDIR}/openembedded/packages/*/*.bb ${LOCALDIR}/packages/*/*.bb"
- BBFILE_COLLECTIONS = "upstream local"
- BBFILE_PATTERN_upstream = "^${OEDIR}/openembedded/packages/"
- BBFILE_PATTERN_local = "^${LOCALDIR}/packages/"
- BBFILE_PRIORITY_upstream = "5"
- BBFILE_PRIORITY_local = "10"
复制代码
4.4 bb基于任务的特性
“基于任务“是一种新的构建基本根文件系统的思想方法。task-base(基于任务) 允许你指定一个机器
的特性,然后“基于任务“ 的方法就可以根据机器特性来构建此发行版(oe里的发行版)支持的特性功能。
举个例子,加入一个oe发行版的配置文件里有这样的配置:
- DISTRO_FEATURES = "nfs smbfs ipsec wifi ppp alsa bluetooth ext2 irda pcmcia
- usbgadget usbhost"
复制代码 机器特定的配置文件里这么写:
- 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目录里,配置
文件需要包含以下内容:- *DISTRO_VERSION 这样用户就知道了他在用那个版本的发行版
- *DISTRO_TYPE(release/debug) 用来在各个包的“配方”里启用或者禁止某些特性:
- 比如打开内核输出信息的"debug"选项。
- *libc的类型 是使用glibc(TARGET_OS=“linux”)呢还是使用uclibc
- (TARGET_OS=“linux-uclibc”)呢?
- *工具链版本 例如:基于gcc 3.4.4的版本应该有下面的配置:
- PREFERRED_PROVIDERS+=" virtual/${TARGER_PREFIX}gcc-initial:gcc-cross-initial"
- PREFERRED_PROVIDERS += " virtual/${TARGET_PREFIX}gcc:gcc-cross"
- PREFERRED_PROVIDERS += " virtual/${TARGET_PREFIX}g++:gcc-cross"
- PREFERRED_VERSION_binutils = "2.16"
- PREFERRED_VERSION_binutils-cross = "2.16"
-
- REFERRED_VERSION_gcc = "3.4.4"
- PREFERRED_VERSION_gcc-cross = "3.4.4"
- PREFERRED_VERSION_gcc-initial-cross = "3.4.4"
-
- *DISTRO_FEATURES 描述该发行版有什么特性。更多的内容请参考task-base(
- “基于任务“)章节
- *内核版本号支持的设备
- PREFERRED_VERSION_linux-omap1_omap5912osk ?= "2.6.18+git"
- PREFERRED_VERSION_linux-openzaurus ?= "2.6.17"
-
- *为了更稳定的构建,最好包含sane-srcdates.inc 文件,这个文件里包含了SRCDATE描述信息,
- 描述了meta库里面哪些“配方”是可以工作的。
- require conf/distro/include/sane-srcdates.inc
- 同时你应该在配置文件里包含全局的SRCDATE设置(格式是 iso 日期:年月日)
-
- SRCDATE = "20061014"
复制代码
5.2 添加一个新的硬件平台
为一个机器编译,oe当然先要知道这是支持的,所以要写一个机器的配置文件。这些文件都应该放在
/conf/machine目录。
通常还需要一些变量:- *TARGET_ARCH 描述该机器使用什么架构的CPU
- *MACHINE_FEATURES 描述该机器有什么功能特性。具体参考“基于任务”一节。
- *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追踪一个已知构建成功的修正。
如果你是真的想从最新的源码来构建,那么请把类似这样的语句
- 'SRCREV_pn-linux-davinci ?= ${AUTOREV}'
复制代码 添加到local.conf里。按照本例中的配置,你将必须为pn-linux-davinci从最新的源码构建包。
5.4 创建你自己的镜像
创建你自己的镜像是很容易的,只需要设置几个变量就可以了。- *IMAGE_BASENAME 你的镜像的名字
- *PACKAGE_INSTALL 该镜像所包含的包列表
- *RDEPENDS 该镜像所依赖的运行时依赖包列表
- *IMAGE_LINGUAS 该包所支持的语言列表
复制代码
然后添上image类
好了,image配方就可以用了。
5.5 使用一个预编译的工具链编译包
在oe中使用预编译的工具链是可行的。下面讨论了很多这方面的话题:
5.5.1.工具链
我们假定您有一个工具链并且包含了c,c++编译器,汇编器以及其他的工具。下面的列表展示了ARM架构
的3.4.4版本的gcc工具链。我们还假定工具链在您的PATH路径里。- ls pre-built/cross/bin
- arm-linux-g++
- arm-linux-ld
- arm-linux-ranlib
- arm-linux-ar
- arm-linux-g77
- arm-linux-readelf
- arm-linux-as
- arm-linux-gcc
- arm-linux-gcc-3.4.4
- arm-linux-c++
- arm-linux-size
- arm-linux-c++filt
- arm-linux-nm
- arm-linux-strings
- arm-linux-cpp
- arm-linux-objcopy
- arm-linux-strip
- arm-linux-objdump
复制代码
5.5.2.预编译库
我们需要库头文件和库本身。下面的目录结构是假设的。PRE_BUILT(预编译的库)通常包含两个子目录:
一个是include,里面是头文件,另外一个是lib目录,里面是静态的和动态的链接库文件。另外,Qt2
目录页会有各include和lib子目录。- ls $PRE_BUILT
- include
- lib
- qt2
复制代码 5.5.3.设置安装oe
这里我们将进行oe的设置。我们假定你的机器和发行版还不被oe所支持,所以就会在local.conf产生
相应的记录。你需要准备bitbake和oe的一个版本。
5.5.3.1创建环境变量脚本
为了简便起见,我们建议你创建一个可以加载的脚本,写上一些变量以便于使用。这里我们命名为
build_source,然后使用source命令加载它。- BITBAKE_PATH=/where/is/bitbake/bin
- TOOLCHAIN=/where/is/toolchain/bin
- HOST_TOOLS=/where/is/hosttools/bin
- export PRE_BUILT=/where/is/pre-built
- export PATH=$BITBAKE_PATH:$TOOLCHAIN:$HOST_TOOLS:$PATH
- export OEDIR=$PWD
- export LOCALDIR=$PWD/secret-isv
复制代码 使用source build_source 加载这个脚本,使用env命令检查你的设置是否正确。
5.5.3.2 创建local.conf文件
现在设置oe,跟上一步的操作类似。- DL_DIR = "${OEDIR}/sources"
- BBFILES := "${OEDIR}/openembedded/packages/*/*.bb ${LOCALDIR}/packages/*/*.bb"
- BBFILE_COLLECTIONS = "upstream local"
- BBFILE_PATTERN_upstream = "^${OEDIR}/openembedded/packages/"
- BBFILE_PATTERN_local = "^${LOCALDIR}/packages/"
- BBFILE_PRIORITY_upstream = "5"
- BBFILE_PRIORITY_local = "10"
- BBMASK = ""
复制代码 ${OEDIR}/openembedded将会是一个前卫的发布,以上我们设置它在当前的工作目录里。另外我们有
个变量${LOCALDIR},我们把这两各目录合并到BBFILE_COLLECTION。- #
- # machine stuff
- #
- MACHINE = "secret-killer"
- PACKAGE_EXTRA_ARCHS = "armv4 armv4t armv5te iwmmxt xscale""
- TARGET_CC_ARCH = "-mcpu=xscale -mtune=iwmmxt"
- TARGET_ARCH = "arm"
- PACKAGE_ARCH="xscale"
复制代码
以上我们告诉oe我们将为ARM平台构建,并且为xscale和iwmmxt作了优化。- INHERIT += " package_ipk debian"
- TARGET_OS = "linux"
- TARGET_FPU = "soft"
- DISTRO = "secret-disro"
- DISTRO_NAME = "secret-distro"
- DISTRO_VERSION = "x.y.z"
- DISTRO_TYPE = "release"
复制代码 创建一个发行版版本号。以上代码告诉oe我们将构建linux和glibc,使用软件的浮点数运算支持。如果
您的工具链是uclibc的,你还需要设置TARGET_OS为linux-uclibc- export CC="${CCACHE}arm-linux-gcc-3.4.4 ${HOST_CC_ARCH}"
- export CXX="${CCACHE}arm-linux-g++ ${HOST_CC_ARCH}"
- export CPP="arm-linux-gcc-3.4.4 -E"
- export LD="arm-linux-ld"
- export AR="arm-linux-ar"
- export AS="arm-linux-as"
- export RANLIB="arm-linux-ranlib"
- export STRIP="arm-linux-strip"
复制代码 上面这些设置覆盖了bitbake.conf里的设置,这就会让oe使用预编译的工具链。- #
- # point OE to the lib and include directory
- #
- TARGET_CPPFLAGS_append = " -I${PRE_BUILT}/include "
- TARGET_LDFLAGS_prepend = " -L${PRE_BUILT}/qt2/lib -L${PRE_BUILT}/lib \
- -Wl,-rpath-link,${PRE_BUILT}/lib -Wl,-rpath-link,${PRE_BUILT}/qt2/lib "
-
- # special to Qt/Qtopia
- QTDIR = "${PRE_BUILT}/qt2"
- QPEDIR = "${PRE_BUILT}"
- palmtopdir = "/opt/Qtopia"
- palmqtdir = "/opt/Qtopia"
复制代码 这个设置把PRE_BUILT预编译工具链的库和头文件添加了进来。Qt也一样。- ASSUME_PROVIDED += " virtual/${TARGET_PREFIX}gcc "
- ASSUME_PROVIDED += " virtual/libc "
- ASSUME_PROVIDED += " virtual/qte "
- ASSUME_PROVIDED += " virtual/libqpe "
- ASSUME_PROVIDED += " libqpe-opie "
复制代码 现在我们已经告诉了bitbake c库,编译器,Qtopia已经是准备好的了,oe不会再自己编译一份这些了。- source build_source
- bitbake your-killer-app
复制代码 哈哈,现在你应该可以成功用你的预编译工具链来构建系统了。
5.5.4.有用的提示
如果你有更多的预编译的库,你还可以添加进来,在local.conf里适当设置ASSUME_PROVIDED变量就
可以了。使用bitbake -vvv PACKAGE命令你可以很容易的查看你添加的预编译的库。
5.5.5.重点提醒- NOTE: Couldn't find shared library provider for libqtopia.so.1
- NOTE: Couldn't find shared library provider for libqtopia2.so.2
- NOTE: Couldn't find shared library provider for libqpe.so.1
- NOTE: Couldn't find shared library provider for libpthread.so.0
- NOTE: Couldn't find shared library provider for libstdc++.so.6
- NOTE: Couldn't find shared library provider for libqte.so.2
- NOTE: Couldn't find shared library provider for libgcc_s.so.1
- NOTE: Couldn't find shared library provider for libc.so.6
- NOTE: Couldn't find shared library provider for libm.so.6
复制代码 OE在构建包时会自动那些运行时依赖的包。oe使用shlibs来添加它们。照此推理,预编译的库将不会被
找到。这意味着,oe构建包的时候不会把预编译库添加到RDEPENDS(运行时依赖)。这会导致严重的错
误,这样oe创建的镜像里也会丢掉那些预编译的库,这肯定是行不通的。为了解决这个问题,你应该创建
一个metadata(配方)把这些库都安装上,然后使用${BOOTSTRAP_EXTRA_RDEPENDS}以确保这些库会
被在创建包的时候安装上。
但是,这里有个更好的方法: 设置 ASSUME_SHLIBS变量。例如上文提到的包就可以这样设置:- 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里设置的):- ~%> find tmp -maxdepth 2 -type d
- tmp
- tmp/stamps
- tmp/cross
- tmp/cross/bin
- tmp/cross/libexec
- tmp/cross/lib
- tmp/cross/share
- tmp/cross/sh4-linux
- tmp/cache
- tmp/cache/titan
- tmp/work
- tmp/work/busybox-1.2.1-r13
- tmp/work/libice-1_1.0.3-r0
- tmp/work/arpwatch-2.1a15-r2
- ...
- tmp/rootfs
- tmp/rootfs/bin
- tmp/rootfs/usr
- tmp/rootfs/media
- tmp/rootfs/dev
- tmp/rootfs/var
- tmp/rootfs/lib
- tmp/rootfs/sbin
- tmp/rootfs/mnt
- tmp/rootfs/boot
- tmp/rootfs/sys
- tmp/rootfs/proc
- tmp/rootfs/etc
- tmp/rootfs/home
- tmp/rootfs/tmp
- tmp/staging
- tmp/staging/man
- tmp/staging/x86_64-linux
- tmp/staging/pkgdata
- tmp/staging/pkgmaps
- tmp/staging/var
- tmp/staging/sh4-linux
- tmp/staging/local
- tmp/staging/etc
- tmp/deploy
- tmp/deploy/addons
- tmp/deploy/ipk
- tmp/deploy/sources
- 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目录以
便后面比对看看究竟问题出在哪里。给个例子:- %> rm -fr tmp.OLD
- $> mv tmp tmp.OLD
- %> bitbake bootstrap-image
复制代码
工作目录(temp/work)
就像上面说的,work目录才是包被解压,打补丁,编译和打包的地方。换句话说,这里才是所有事情发
生的地方。在这里,每个“配方“都会产生一个单独的子目录,里面包含了“配方“名,版本号,发布号等。
这里给个例子,仅仅列出了一些文件:- ~%> find tmp/work -maxdepth 1 -type d | head -4
- tmp/work
- tmp/work/busybox-1.2.1-r13
- tmp/work/libice-1_1.0.3-r0
- tmp/work/arpwatch-2.1a15-r2
复制代码 你看到的是几百个里的前三个,分别是busybox 1.2.1的第13个发布版,libice的1.1.0.3的0版和
arpwath的2.1a15的2版。你也可以把这里目录放在一个为你的机器和发行准备的特性目录里,就像下面
的这样:- ~%> find tmp/work -maxdepth 2 -type d | head -4
- tmp/work
- tmp/work/sh4-linux
- tmp/work/sh4-linux/busybox-1.2.1-r13
- tmp/work/sh4-linux/libice-1_1.0.3-r0
- tmp/work/sh4-linux/arpwatch-2.1a15-r2
复制代码
上面例子中的sh4-linux目录说明这个发行版是为sh4机器准备的linux系统。oe对这个特性的支持就
保证了它可以同时为多平台目标构建系统。这样做可以让拥有不同内核的构建版本在构建过程中共享一些
库和机器不相关的包以节省编译时间和空间。文中下面的内容会假设你并没有使用多平台编译这个功能。
如果你要使用请记得自己添加一个目录。
下面使用lzo 1.08作为例子,我们来看看一个典型的“配方“的工作目录的内容是怎样的:- ~%> find tmp/work/lzo-1.08-r14 -maxdepth 1
- tmp/work/lzo-1.08-r14
- tmp/work/lzo-1.08-r14/temp
- tmp/work/lzo-1.08-r14/lzo-1.08
- tmp/work/lzo-1.08-r14/install
- 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目录里的日志文件了:- ~%> less tmp/work/lzo-1.08-r14/temp/log.do_configure.*
- ...
- checking whether ccache sh4-linux-gcc -ml -m4 suffers the -fschedule-insns bug... unknown
- checking whether ccache sh4-linux-gcc -ml -m4 suffers the -fstrength-reduce bug... unknown
- checking whether ccache sh4-linux-gcc -ml -m4 accepts -fstrict-aliasing... yes
- checking the alignment of the assembler... 0
- checking whether to build assembler versions... no
- configure: creating ./config.status
- config.status: creating Makefile
- config.status: creating examples/Makefile
- config.status: creating include/Makefile
- config.status: creating ltest/Makefile
- config.status: creating minilzo/Makefile
- config.status: creating src/Makefile
- config.status: creating tests/Makefile
- config.status: creating config.h
- config.status: executing depfiles commands
复制代码
哦,或者你想想看看到底oe怎么从image镜像里的一对文件里找出这个包的文件然后放到一起打包的呢?
对了!看看install目录不就知道了么:- ~%> find tmp/work/lzo-1.08-r14/install
- tmp/work/lzo-1.08-r14/install
- tmp/work/lzo-1.08-r14/install/lzo-doc
- tmp/work/lzo-1.08-r14/install/lzo-dbg
- tmp/work/lzo-1.08-r14/install/lzo-dbg/usr
- tmp/work/lzo-1.08-r14/install/lzo-dbg/usr/lib
- tmp/work/lzo-1.08-r14/install/lzo-dbg/usr/lib/.debug
- tmp/work/lzo-1.08-r14/install/lzo-dbg/usr/lib/.debug/liblzo.so.1.0.0
- tmp/work/lzo-1.08-r14/install/lzo-dev
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo2a.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1y.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1b.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1f.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzoconf.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1x.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo16bit.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1a.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1z.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzoutil.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/include/lzo1c.h
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib/liblzo.a
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib/liblzo.so
- tmp/work/lzo-1.08-r14/install/lzo-dev/usr/lib/liblzo.la
- tmp/work/lzo-1.08-r14/install/lzo.shlibdeps
- tmp/work/lzo-1.08-r14/install/lzo-locale
- tmp/work/lzo-1.08-r14/install/lzo
- tmp/work/lzo-1.08-r14/install/lzo/usr
- tmp/work/lzo-1.08-r14/install/lzo/usr/lib
- tmp/work/lzo-1.08-r14/install/lzo/usr/lib/liblzo.so.1
- tmp/work/lzo-1.08-r14/install/lzo/usr/lib/liblzo.so.1.0.0
复制代码
7.4 "任务"
当你要编译安装一个软件包时,就会有很多任务要执行,并且对于绝大多数软件包来说都是这样的。你
可能会从下载源码包开始,然后解压源码包。或许你会因为一些原因打上一些补丁,然后,你会运行包
的configure脚本,或许你还会根据你的喜好给它传递一些参数,然后你会运行“make install”来
安装这个软件。如果实际上你是想构建二进制包,比如.deb或者.rpm的话你或许还会做一些事情。
你会发现实际上OpenEmbedded的工作与这个类似。这里将会有一大堆要执行的“任务“,顺序取决于
每个“配方“里定义和配置。这些任务里的许多都跟"下载源码"这样任务的都是类似的。实际上你都已
经见过这里的一些任务了--bitbake在运行任务的时候会显示它们的:- ~%> bitbake lzo
- NOTE: Psyco JIT Compiler (http://psyco.sf.net) not available. Install it to increase performance.
- NOTE: Handling BitBake files: \ (4541/4541) [100 %]
- NOTE: Parsing finished. 4325 cached, 0 parsed, 216 skipped, 0 masked.
- NOTE: build 200705041709: started
- OE Build Configuration:
- BB_VERSION = "1.8.2"
- OE_REVISION = "<unknown>"
- TARGET_ARCH = "sh4"
- TARGET_OS = "linux"
- MACHINE = "titan"
- DISTRO = "erouter"
- DISTRO_VERSION = "0.1-20070504"
- TARGET_FPU = ""
- NOTE: Resolving missing task queue dependencies
- NOTE: preferred version 2.5 of glibc not available (for item virtual/sh4-linux-libc-for-gcc)
- NOTE: Preparing Runqueue
- NOTE: Executing runqueue
- NOTE: Running task 208 of 226 (ID: 11, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_fetch)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_fetch: started
- NOTE: package lzo-1.08-r14: task do_fetch: completed
- NOTE: package lzo-1.08: completed
- NOTE: Running task 209 of 226 (ID: 2, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_unpack)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_unpack: started
- 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/
- NOTE: package lzo-1.08-r14: task do_unpack: completed
- NOTE: package lzo-1.08: completed
- NOTE: Running task 216 of 226 (ID: 3, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_patch)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_patch: started
- NOTE: package lzo-1.08-r14: task do_patch: completed
- NOTE: package lzo-1.08: completed
- NOTE: Running task 217 of 226 (ID: 4, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_configure)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_configure: started
- NOTE: package lzo-1.08-r14: task do_configure: completed
- NOTE: package lzo-1.08: completed
- 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)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_qa_configure: started
- NOTE: Checking sanity of the config.log file
- NOTE: package lzo-1.08-r14: task do_qa_configure: completed
- NOTE: package lzo-1.08: completed
- NOTE: Running task 219 of 226 (ID: 0, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_compile)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_compile: started
- NOTE: package lzo-1.08-r14: task do_compile: completed
- NOTE: package lzo-1.08: completed
- NOTE: Running task 220 of 226 (ID: 1, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_install)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_install: started
- NOTE: package lzo-1.08-r14: task do_install: completed
- NOTE: package lzo-1.08: completed
- NOTE: Running task 221 of 226 (ID: 5, /home/lenehan/devel/oe/build/titan-glibc-25/packages/lzo/lzo_1.08.bb, do_package)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_package: started
- NOTE: DO PACKAGE QA
- NOTE: Checking Package: lzo-dbg
- NOTE: Checking Package: lzo
- NOTE: Checking Package: lzo-doc
- NOTE: Checking Package: lzo-dev
- NOTE: Checking Package: lzo-locale
- NOTE: DONE with PACKAGE QA
- NOTE: package lzo-1.08-r14: task do_package: completed
- NOTE: package lzo-1.08: completed
- 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)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_package_write: started
- 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
- Packaged contents of lzo into /home/lenehan/devel/oe/build/titan-glibc-25/tmp/deploy/ipk/sh4/liblzo1_1.08-r14_sh4.ipk
- NOTE: Not creating empty archive for lzo-doc-1.08-r14
- 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
- NOTE: Not creating empty archive for lzo-locale-1.08-r14
- NOTE: package lzo-1.08-r14: task do_package_write: completed
- NOTE: package lzo-1.08: completed
- 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)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_populate_staging: started
- NOTE: package lzo-1.08-r14: task do_populate_staging: completed
- NOTE: package lzo-1.08: completed
- 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)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_qa_staging: started
- NOTE: QA checking staging
- NOTE: package lzo-1.08-r14: task do_qa_staging: completed
- NOTE: package lzo-1.08: completed
- 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)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_distribute_sources: started
- NOTE: package lzo-1.08-r14: task do_distribute_sources: completed
- NOTE: package lzo-1.08: completed
- NOTE: Running task 226 of 226 (ID: 10, /home/lenehan/devel/oe/build/titan- glibc-25/packages/lzo/lzo_1.08.bb, do_build)
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_build: started
- NOTE: package lzo-1.08-r14: task do_build: completed
- NOTE: package lzo-1.08: completed
- NOTE: Tasks Summary: Attempted 226 tasks of which 213 didn't need to be rerun and 0 failed.
- NOTE: build 200705041709: completed
复制代码- 注意:输出信息根据你的实际情况可能跟这个是不同的。重点是看看各种任务怎么被执行的,
- 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来完成,运行类似下面的命令:- ~%> bitbake -b packages/perl/perl_5.8.8.bb -c listtasks
- NOTE: package perl-5.8.8: started
- NOTE: package perl-5.8.8-r11: task do_listtasks: started
- do_fetchall
- do_listtasks
- do_rebuild
- do_compile
- do_build
- do_populate_staging
- do_mrproper
- do_fetch
- do_configure
- do_clean
- do_package
- do_unpack
- do_install
- do_package_write
- do_distribute_sources
- do_showdata
- do_qa_configure
- do_qa_staging
- do_patch
- NOTE: package perl-5.8.8-r11: task do_listtasks: completed
- NOTE: package perl-5.8.8: completed
- ~%>
复制代码
如果你是个细心的读者,你或许会注意到listtasks本身就是一个任务,-c选项让bitbake执行了listtasks
任务。在下一节中我们会用到这个。
7.5 单个“配方”相关的工作
在开发过程中,你会发现你大多数时间都在跟一个bitbake“配方“打交道,要么是修复什么,要么就是
添加一个新的版本,或者是写一个全新的配方。现在你已经有了所有关于“任务”的知识,这可以帮助加
速你的开发和调试过程。
Bitbake可以被指定直接的处理一个单个“配方”文件,使用-b参数就可以了,这个选项把“配方”作为
一个参数传递给bitbake,bitbake将只会处理这个名字的“配方”。注意,这种方式忽略了依赖关系,
所以你需要在这之前装好所有它依赖的包。
下面给出一个典型的例子,本例使用"清理"任务来清理包,然后打开bitbake的debug输出来重新构建:- ~%> bitbake -b <bb-file> -c clean
- ~%> 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)也将会执行获取源码,解压,打补丁,和配置动作。
通常情况下一个开发过程伴随这编辑文件和重新构建一直到它可以正常工作:-
- [... 测试 ...]
- ~%> bitbake -b packages/testapp/testapp_4.3.bb -c compile -D
-
- [... 复制一份 main.c 然后做些修改 ...]
- ~%> vi tmp/work/testapp-4.3-r0/main.c
- ~%> bitbake -b packages/testapp/testapp_4.3.bb -c compile -D -f
-
- [... 建了一个补丁文件,然后写到包“配方”里 ...]
- ~%> vi packages/testapp/testapp_4.3.bb
-
- [... 清理了重新测试 ...]
- ~%> bitbake -b packages/testapp/testapp_4.3.bb -c clean
- ~%> bitbake -b packages/testapp/testapp_4.3.bb
- [... 注意这里没有讨论怎么去生成一个补丁文件 ...]
复制代码 7.6 交互式bitbake
要做交互式测试使用:
这样会打开一个bitbake 命令行(bitbake shell),这里面有很多命令(使用help查看)。
你需要知道的第一件事情是解析“配方”文件(最新的bitbake版本可以自动的做这些,所以你不需要
手动来):
你可以构建指定的“配方“
如果这个失败了你可以清理它,然后重试:
如果你编辑了.bb文件修正了某些东西,你或许想清理包,重新解析“配方”,然后构建:- BB>> clean net-snmp
- BB>> reparse net-snmp
- BB>> build net-snmp
复制代码
注意在bitbake命令行里是可以使用通配符的:
7.7 Devshell
在oe里,有一个内容是设置各种环境变量(比如像CC,PATH等等)为合适的值以便进行交叉编译。如果你
希望在开发过程中手动运行configure脚本,编译文件,那么设置好这些变量会很有利。devshell提供
给你一个交互式的命令行来设置合适的变量以便后面的交叉编译工作。
7.7.1 继承devshell类
这是一种新的使用devshell的方式,也是推荐用户使用的方式。新的方式需要在配置文件里继承
devshell类,通常这是在你的local.conf或者你的发行版配置文件里设置的:
- INHERIT += "src_distribute_local insane multimachine devshell"
复制代码
包含这个类之后你会发现devshell已经被作为一个新的“任务”可以在配方中使用了:-
- ~%> bitbake -b packages/lzo/lzo_1.08.bb -c listtasks
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_listtasks: started
- do_devshell
- do_fetchall
- do_listtasks
- do_rebuild
- do_compile
- do_build
- do_mrproper
- do_fetch
- do_configure
- do_clean
- do_populate_staging
- do_package
- do_unpack
- do_install
- do_package_write
- do_distribute_sources
- do_showdata
- do_qa_staging
- do_qa_configure
- do_patch
- NOTE: package lzo-1.08-r14: task do_listtasks: completed
- NOTE: package lzo-1.08: completed
复制代码
要呼出devshell你可以在处理一个“配方“的时候给bitbake传递 -c devshell 参数:- ~%> ./bb -b packages/lzo/lzo_1.08.bb -c devshell
- NOTE: package lzo-1.08: started
- NOTE: package lzo-1.08-r14: task do_devshell: started
- [... devshell 将在这里显示 ...]
- NOTE: package lzo-1.08-r14: task do_devshell: completed
- 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被作为一个包来处理)。
然后,手动运行devshell。一旦在devshell里,你通常需要进入工作目录:- ~%> ./tmp/deploy/addons/sh4-linux-erouter-titan-devshell
- bash: alias: `./configure': invalid alias name
- [OE::sh4-linux-erouter-titan]:~$ cd tmp/work/lzo-1.08-r14/lzo-1.08
- [OE::sh4-linux-erouter-titan]:~tmp/work/lzo-1.08-r14/lzo-1.08$
复制代码
注意devshell是依赖于目标机器和系统的,所以你用的名字可能与此不同,看看以-devshell结尾
的名字。
7.7.3 使用devshell
((官方文章尚未完成!))
7.8 补丁和补丁管理
((官方文章尚未完成!)) |
|