分类: LINUX
2010-01-06 14:29:24
一、为什么使用OpenEmbedded
1. OpenEmbedded,简称OE,它用来构建和管理嵌入式开发系统(交叉编译、安装、打包)
2. 它可以解决以下问题:
1) 指定编译工具链
2) 程序和库之间的依赖关系
3) 创建镜像
4) 建立目标板上的安装包
5) 建立本地安装包
3. 分为两部分.
2004年10月7日Chris Larson把OE分成了两个项目。一个是bitbake(构建任务的执行者),一个是openembedded(实际上是为bitbake提供元数据)。
1) bitbake:构建任务的执行者,它是一组工具集,通过读取扩展名为.bb的文件设置来进行工具,之后简称bb
2) openembedded:元数据,从网上下载得到,这后简称oe
二、如何得到OE
1. 安装依赖包
$ apt-get install patch cvs texlive texlive-extra-utils git git-core libgmp3-dev libmpfr-dev dpkg-dev liborbit2-dev libnotify-dev comerr-dev
sudo apt-get install subversion build-essential help2man diffstat texi2html texinfo cvs gawk zip unzip \
cogito bzip2 libncurses5-dev zlib1g-dev libssl-dev libgtk2.0-dev ca-certificates python-pysqlite2 \
sqlite3 sqlite3-doc python-pysqlite2-dbg quilt python-psyco ccache gcc-3.4 g++ libsdl1.2-dev lynx \
git-core libxtst-dev
Pysvn
To build pysvn you will require:
Some distributions will split python and subversion into more the one package.
You will need to find all the packages that give you the options listed above.
tar xzf pycxx-5.5.0.tar.gz
into extdir/Import if not using a source kit
tar xzf pycxx-6.0.0.tar.gz
into extdir/Import if not using a source kit
cd Source
python setup.py backport
python setup.py configure
make
cd Tests
make
Install pysvn by copying the following from Extension/Source to python site-specific directory.
mkdir python-libdir/site-packages/pysvn
cp pysvn/__init__.py python-libdir/site-packages/pysvn
cp pysvn/_pysvn*.so python-libdir/site-packages/pysvn
2. 安装GIT
$ mkdir stuff
$ git clone
大小1G左右, 此链接速度不快,下载完成大概需要7小时左右
$ cd openembedded/
$ git pull release
OE的.dev分支(开发分支)更新速度是很快的,通常情况下几小时就会更新一次。发行版的更新也是很快的,所以最好你应该至少每天更新一次OE树。使用下面的命令更新你的oe树:
$ git pull --rebase
$ cp conf/local.conf.sample conf/local.conf
改其中的TMPDIR和DISTRO
编译bootstrap-image从昨天直到今天,遇到几个小问题,均逐一解决,记录如下:
1、gconf-dbus
其bb文件为:
org.openembedded.dev/packages/gnome/gconf-dbus_svn.bb
中需要使用svn来checkout代码,最新版的gconf-dbus和OE中老版本的glib有些不兼容,所以强制指定使用某个适用版本。另外,原来的写法会让svn默认取出r1版本,太老了也是不行的。
修改了一下,解决。
#SRC_URI = "svn://developer.imendio.com/svn/gconf-dbus;module=trunk;proto=http
SRC_URI = "svn://developer.imendio.com/svn/gconf-dbus;module=trunk;rev=423;proto=http
另外一个问题,是install的时候,.bb文件中显式的指定要安装gconf-2.m4,但是源码中是没有的,源码的Makefile里,安装了 gconf.m4到gconf-2.m4,所以这里需要将.bb文件中显式指定安装gconf-2.m4的一句去掉。这句在函数do_stage()中, 行头加#将其注释掉即可。
do_stage() {
autotools_stage_all
#install -m 0644 gconf-2.m4 ${STAGING_DATADIR}/aclocal/gconf-2.m4
}
2、popt
其bb文件为:
org.openembedded.dev/packages/popt/popt_1.7.bb
文件中写的源码包下载地址已经无法访问,至少在我这里无法访问,所以Google了一下找到一个镜像,修改bb文件:
#SRC_URI = "ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.1.x/popt-${PV}.tar.gz
SRC_URI = "http://devil-linux.linjection.org/devel/sources/1.3/popt-1.7.tar.gz
即可。
3、清除/重做指定的task
可能由于一些原因导致你在编译的一组task中的某一个出现错误,你希望修改它的.bb文件后重做它,而不希望影响到其他的task,可以这样做(我们以gconf-dbus为例)
首先指定.bb文件来clean:
$ bitbake -b org.openembedded.dev/packages/gnome/gconf-dbus_svn.bb -c clean
再指定.bb文件来重做:
$ bitbake -b org.openembedded.dev/packages/gnome/gconf-dbus_svn.bb
上面的命令会完全重做一个task,如果你只是想重做部分的话,可以在后面加上"-c CMD",CMD就是你希望执行的命令,比如:fetch, compile, install。假如你不确定执行结果可以先加上"-n"来模拟运行一下。
4、其他
观察编译过程,常常会从国外站点下载一些很大的包,比如kernel,perl等等,这个时候不但耗时而且可能由于网络原因中断整个编译过程。我采用的方法主要有两种
a) ctrl+c中断(要按2~3下),然后用prozilla开多线程下载。存放到你定义的sources目录,同时删除原来OE自己下载时候建立的xxxxxx.lock文件。
b) 修改org.openembedded.dev/packages/下对应的.bb文件,直接替换SRC_URI的值。这里需要注意的是,有些 SRC_URI是引用的org.openembedded.dev/conf/bitbake.conf中的站点定义。