Chinaunix首页 | 论坛 | 博客
  • 博客访问: 714213
  • 博文数量: 260
  • 博客积分: 7033
  • 博客等级: 少将
  • 技术积分: 2633
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-13 23:15
文章分类

全部博文(260)

文章存档

2012年(2)

2011年(41)

2010年(78)

2009年(139)

我的朋友

分类:

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
 
。。。
待续

阅读(1402) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~