分类:
2010-02-09 21:02:23
很久之前帮别人解决OE问题的时候,大致写了一下解决dbus不能编译的思路。
一、
我使用bitbake -b dbus1_0.1.bb 编译你的bb文件,经过一段时间的编译后,在编译信息中找到了下面的这几句话,说明你的package已经生成了。只是没有找到生成路径而已。
NOTE: Running task 12 of 15 (ID: 12, /tmp/lenovo-yzj/dbus1_0.1.bb, do_package_write)
NOTE: package dbus1-0.1: started
NOTE: package dbus1-0.1-r0: task do_package_write: started
NOTE: package dbus1-0.1-r0: task do_package_write: completed
二、生成deb的依据
lenovo-yzj $ cd /home/xiewei/stuff/workspace/work/armv7a-xw-linux-gnueabi/dbus1-0.1-r0/
dbus1-0.1-r0 $ ls
dbus1 image install temp
dbus1-0.1-r0 $ cd install/
install $ ls
dbus1 dbus1-dbg dbus1-dev dbus1-doc dbus1-locale dbus1.shlibdeps
通过上面最后一行粗体,可以看出,你的这个bb文件应该可以至少生成5个deb包,其中dbus1-locale 包会根据系统所支持的语言生成多种。
install目录中的这些文件目录是生成deb的蓝本.
三、查找deb文件
temp $ pwd
/home/xiewei/stuff/workspace/work/armv7a-xw-linux-gnueabi/dbus1-0.1-r0/temp
temp $ vi log.do_package_write.3860
发现这个文件是空的,去看看生成package的脚本:
temp $ vi run.do_package_write.3860
这个文件的最后一行是执行了do_package_write 函数,找到本文件中的函数定义,是空的!
四、解决方法
看来你的bb文件写的有问题。和系统中原来的dbus.inc对照了一下,发现你的bb文件也没有太大的问题。
会不会是bitbake给系统做了保护呢?
把你的bb文件从移动到OE中去:
$ mv /tmp/lenovo-yzj/ /home/xiewei/stuff/openembedded/packages/
再次执行bitbake: bb -b dbus1_0.1.bb -c rebuild
这次的log记录中,有了你的deb包的名称了,在系统中看了一下,这些文件的确存在。
NOTE: package dbus1-0.1: started
NOTE: package dbus1-0.1-r0: task do_package_write_deb: started
dpkg-deb: building package `libtornado-dbus-dbg' in `/home/xiewei/stuff/workspace/deploy/glibc/deb/armv7a/libtornado-dbus-dbg_0.1-r0_arm.deb'.
dpkg-deb: building package `libtornado-dbus0' in `/home/xiewei/stuff/workspace/deploy/glibc/deb/armv7a/libtornado-dbus0_0.1-r0_arm.deb'.
NOTE: Not creating empty archive for dbus1-doc-0.1-r0
dpkg-deb: building package `libtornado-dbus-dev' in `/home/xiewei/stuff/workspace/deploy/glibc/deb/armv7a/libtornado-dbus-dev_0.1-r0_arm.deb'.
NOTE: Not creating empty archive for dbus1-locale-0.1-r0
NOTE: package dbus1-0.1-r0: task do_package_write_deb: completed
lenovo-yzj $ dpkg --contents /home/xiewei/stuff/workspace/deploy/glibc/deb/armv7a/libtornado-dbus0_0.1-r0_arm.deb
drwxr-xr-x root/root 0 2009-04-14 15:56 ./
drwxr-xr-x root/root 0 2009-04-14 15:56 ./usr/
drwxr-xr-x root/root 0 2009-04-14 15:56 ./usr/lib/
-rwxr-xr-x root/root 6524 2009-04-14 15:56 ./usr/lib/libtornado_dbus.so.0.0.0
lrwxrwxrwx root/root 0 2009-04-14 15:56 ./usr/lib/libtornado_dbus.so -> libtornado_dbus.so.0.0.0
lrwxrwxrwx root/root 0 2009-04-14 15:56 ./usr/lib/libtornado_dbus.so.0 -> libtornado_dbus.so.0.0.0
五、遗留问题:
你的bb文件名称是dbus1_0.1.bb,可是生成的deb包为什么会以libtornado开头呢?
/home/xiewei/stuff/workspace/work/armv7a-xw-linux-gnueabi/dbus1-0.1-r0/temp 目录里每一个可执行文件中都定义了do_package_write 函数,
但是只有run.do_package_write被调用了。将bb文件放入OE目录后,该文件中的do_package_write函数仍然是空的。
没有办法,得看一下bitbake的class文件了,找找是怎么定义的。
主要在目录~/stuff/openembedded/classes 和 ~/stuff/bitbake/lib/bb 中进行查找。
$ cd ~/stuff/bitbake/lib/bb
$ grep deb -r .
这里grep到的都是debug相关的行,看来不能在~/stuff/bitbake/lib/bb 中得到答案了。
$ cd ~/stuff/openembedded/classes
$ ls *deb*
debian.bbclass insane.bbclass.debug package_deb.bbclass rootfs_deb.bbclass
看了一下debian.bbclass,感觉这个文件主要是负责为RDEPENDS 安装相关的包的。
而package_deb.bbclass则是真正调用dpkg-deb可执行文件来生成deb包的。但是在这个包里面并没有找到任何给deb文件起名字的代码,deb 文件的名称是通过python语句 packages = bb.data.getVar('PACKAGES', d, True) 获取到的。
想到这个libtornado-dbus-dev_0.1-r0_arm.deb 中仅仅有1个so文件,会不会系统为每一个这种lib库都生成这么一个专门的deb包呢?
查看这个libtornado-dbus0 deb包的信息:
packages $ dpkg -I /home/xiewei/stuff/workspace/deploy/glibc/deb/armv7a/libtornado-dbus0_0.1-r0_arm.deb
new debian package, version 2.0.
size 6202 bytes: control archive= 443 bytes.
263 bytes, 10 lines control
128 bytes, 7 lines * postinst #!/bin/sh
Package: libtornado-dbus0
Version: 0.1-r0
Description: Dbus Application
Section: base
Priority: optional
Maintainer: Angstrom Developers <angstrom-distro-devel@linuxtogo.org>
Architecture: arm
OE: dbus1
Homepage: unknown
Depends: libc6 (>= 2.8+csl-arm-2008q3-72)
OE后面那个dbus1,说明这个包是由dbus1 编译出来的。这就没有错了。
六、使用FILES-${PN} 来解决问题
FILES-${PN} 是用来在bb中定义和bb文件名相同的deb包中到底包含哪些文件。
在dbus1_0.1.bb中添加一行:
FILES-${PN} = "/usr/lib/"
双引号中的是文件夹名称或者文件路径,这些文件都在${D}目录中,即/home/xiewei/stuff/workspace/work/armv7a-xw-linux-gnueabi/dbus1-0.1-r0/image 。
OE中执行make install的时候,就把该install的文件都安装到这个目录里来了。
rebuild之后,发现生成的deb包名称依然是以libtornado开头的,这次文件中还多了两个/usr/lib中的文件:
/usr/lib/libtornado_dbus.a
/usr/lib/libtornado_dbus.la
看来使用FILES-${PN}的方法是不行了。
七、找到lib包中文件的来源:lib_package
由于正常情况下,这个lib包中只有1个lib文件,那么在classes目录中,使用下面的方式grep再次:
$ grep PACKAGES -r . | grep lib
找到了这个文件:lib_package.bbclass ,使用它的地方是bb中: inherit lib_package
classes $ cat lib_package.bbclass
PACKAGES += "${PN}-bin"
FILES_${PN} = "${libexecdir} ${libdir}/lib*.so.* ${sysconfdir} ${sharedstatedir} ${localstatedir} /lib/*.so* ${datadir}/${PN} ${libdir}/${PN}"
FILES_${PN}-dev = "${includedir} ${libdir}/lib*.so ${libdir}/*.la ${libdir}/*.a ${libdir}/pkgconfig /lib/*.a /lib/*.o ${datadir}/aclocal ${bindir}/*-config"
FILES_${PN}-bin = "${bindir}/* ${sbindir}/* /bin/* /sbin/*"
原来inherit是这样的啊,相当于把这些定义inclulde到当前的bb中了。
但是仔细看了一下dbus1_0.1.bb ,里面并没有任何和lib_package相关的定义。
很奇怪,继续分析原因。
八、看看和这个包相关的环境变量吧
执行了一下下面的命令,出来了好多函数定义,感觉好像有戏了。
$ bb -b dbus1_0.1.bb -e
。。。
待续