在升级qmmp的过程中,遇到了下面的错误:

WARNING: For recipe qmmp, the following files were installed but not shipped in any package:
| WARNING:   /usr/lib/qmmp/FileDialogs/libqmmpfiledialog.so
| WARNING:   /usr/lib/qmmp/FileDialogs/.debug/libqmmpfiledialog.so
| WARNING:   /usr/lib/qmmp/Engines/libmplayer.so
| WARNING:   /usr/lib/qmmp/Engines/.debug/libmplayer.so
| WARNING:   /usr/lib/qmmp/Effect/libstereo.so
| WARNING:   /usr/lib/qmmp/Effect/libladspa.so
....
| ERROR: QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so: qmmp path '/work/i586-poky-linux/qmmp-0.5.1-r0/packages-split/qmmp/usr/lib/libqmmpui.so'
| ERROR: QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so: qmmp path '/work/i586-poky-linux/qmmp-0.5.1-r0/packages-split/qmmp/usr/lib/libqmmp.so'

上面的WARNING错误是说:这些文件已经在image 的里面了,但是打包(打成rpm包的格式),的时候,却没有这些文件。

ERROR:意思是,在非dev,dbg,nativesdk的包的形式中,有了链接。比如:

在qmmp-0.5.2-r0.rpm这就是非qmmp-dev-0.5.2.r0.rpm qmmp-dbg-0.5.2.r0.rpm,qmmp-nativesdk-r0.0.5.2.rpm等等。它是把/usr/bin以及/usr/lib/*的资源打到这个包里面。

在原来的bb文件是这样的。

FILES_${PN} = "${bindir}/qmmp ${libdir}/*.so* \
               ${libdir}/qmmp/PlaylistFormats/*.so \
               ${libdir}/qmmp/Output/libalsa.so \
               ${libdir}/qmmp/Transports/libhttp.so \
               ${libdir}/qmmp/Visual/libanalyzer.so \
               ${datadir}/icons/* \
               ${datadir}/qmmp/images/* \
               ${datadir}/applications/qmmp.desktop \

这个在过来的版本是没有问题的,但是在最新的版本中,不允许这样做了。因为${bindir}和${libdir}是工具本身会去做的。不用在重新做。在do_package_qa中,会有一个函数来判断,是不是在收包的目录里有,链接库*.so,如果有就产生了ERROR,具体为什么这么做,还不知道,以后待研究。

如果想要放置带链接库,那么用lib*${SOLIBS}的形式。

QAPATHTEST[dev-so] = "package_qa_check_dev"
def package_qa_check_dev(path, name, d, elf, messages):
    """
    Check for ".so" library symlinks in non-dev packages
    """

if not name.endswith("-dev") and not name.endswith("-dbg") and not name.endswith("-nativesdk") and path.endswith(".so") and os.path.islink(path):
        messages.append("non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \
                 (name, package_qa_clean_path(path,d)))

所以,正确的写法如下:

FILES_${PN} =+ "\
               ${libdir}/qmmp/*/*.so \
               ${datadir}/icons/* \
               ${datadir}/qmmp/images/* \
               ${datadir}/applications/qmmp.desktop "

如果是,${bindir},${libdir}/* 以外的我们需要手工的加入,比如${libdir}/qmmp/*/*.so,因为,qmmp/*/*.so 不是${libdir}下的资源。

FILES_${PN}-dbg += "\
                ${libdir}/qmmp/*/.debug/* \

还有一个问题就是如何将/usr/lib/qmmp下的库文件,打成每个文件都拥有自己的一个包。

用do_split_packge  函数

用法:

PACKAGES_DYNAMIC += "qmmp-plugin-*"

python populate_packages_prepend () {
        qmmp_libdir = bb.data.expand('${libdir}/qmmp', d)
        do_split_packages(d, qmmp_libdir, '^lib(.*)\.so$', 'qmmp-plugin-%s', 'Qmmp %s Plugin for', recursive=True,extra_depends='')
}

I find .debug can't be packaged to rpm package because it is invisible directory. In current OE-core .debug was shipped to FILES_${PN}-dbg, for example , gtk+ ,qt4-x11-free
If we want to split up .debug/* to single package, we can rename .debug to debug to make this directory visible, then debug directory can be split up to single package.
Please review the following two mode.

Mode 1: Ship  .debug to   FILES_${PN}-dbg

PACKAGES_DYNAMIC = "qmmp-plugin-* "

python populate_packages_prepend () {
        import os
        qmmp_libdir = bb.data.expand('${libdir}/qmmp', d)
        gd = bb.data.expand('${D}/${libdir}/qmmp', d)
        plug_dirs = os.listdir(gd)
# for makeing  do_split_package for each grouping and name them correctly
# qmmp-plugin-<group>-<library>  with the Description: Qmmp <Group> plugin for %s"
# I use the following method.

        for plug_dir in plug_dirs:
                g_plug_dir = os.path.join(qmmp_libdir,plug_dir)
                do_split_packages(d, g_plug_dir, '^lib(.*)\.so$', 'qmmp-plugin-' + plug_dir + '-%s', 'Qmmp' + plug_dir  + 'plugin for %s')

}

# if I don't point files to ship file to ${PN}, then FILE_${PN} will get files in usr/lib/qmmp and qmmp-plug-* will not get files.
FILES_${PN} = "\
                ${bindir}/qmmp \
                ${libdir}/lib*${SOLIBS} \
                ${datadir}/icons/* \
                ${datadir}/qmmp/images/* \
                ${datadir}/applications/* \
                "

FILES_${PN}-dbg += "\
                ${libdir}/qmmp/*/.debug/* \
               "
=================================================================================
Mode 2: Split up  .debug to sub-packages

PACKAGES_DYNAMIC = "qmmp-plugin-* qmmp-debug-plugin-*"

python populate_packages_prepend () {
        import os
        qmmp_libdir = bb.data.expand('${libdir}/qmmp', d)
        qmmp_pkgd = bb.data.expand('${WORKDIR}/package/${libdir}/qmmp', d)
        gd = bb.data.expand('${D}/${libdir}/qmmp', d)
        plug_dirs = os.listdir(gd)

for plug_dir in plug_dirs:
                #rename .debug to debug
                if os.path.exists( qmmp_pkgd + '/'  + plug_dir + '/.debug'):
                        os.rename(qmmp_pkgd + '/' + plug_dir + '/.debug',qmmp_pkgd + '/' + plug_dir + '/debug')
                g_plug_dir = os.path.join(qmmp_libdir,plug_dir)
                do_split_packages(d, g_plug_dir, '^lib(.*)\.so$', 'qmmp-plugin-' + plug_dir + '-%s', 'Qmmp' + plug_dir  + 'plugin for %s')
                #split up .debug to sub-packages
                g_plug_debug_dir = os.path.join(g_plug_dir,'debug')
                do_split_packages(d, g_plug_debug_dir, '^lib(.*)\.so$', 'qmmp-debug-plugin-' + plug_dir + '-%s', 'Qmmp' + plug_dir  + 'plugin debug for %s')
}

# if I don't point files to ship file to ${PN}, then FILE_${PN} will get files in usr/lib/qmmp and qmmp-plug-* will not get files.   I check gtk+ and qt4-x11-free and find that they adopt the following method without using default mode.

FILES_${PN} = "\
                ${bindir}/qmmp \
                ${libdir}/lib*${SOLIBS} \
                ${datadir}/icons/* \
                ${datadir}/qmmp/images/* \
                ${datadir}/applications/* \

poky: qmmp_0.5.2.bb的问题以及修改方法。相关推荐

  1. yocto 编译流程分析

    yocto 编译流程分析 2015年04月15日 10:55:13 日月星辰007 阅读数:4955 git clone 一份poky 的工程到本地. source poky/oe-init-buil ...

  2. yocto bsp-开发人员指南

    1. yocto bsp-开发人员指南 板级支持包 (BSP) 是定义如何支持特定硬件设备.设备集或硬件平台的信息集合. BSP 包括有关设备上存在的硬件功能的信息和内核配置信息以及所需的任何其他硬件 ...

  3. 基于高通sdx12平台,简单介绍编译(bitbake)

    高通sdx12平台:bitbake 编译介绍 Audio machine.platform.dai等单独编译介绍 新添加bb文件 编译介绍 1.编译环境配置脚本 Audio machine.platf ...

  4. Yocto开发讲解系列 - 总目录

    Yocto开发讲解系列总纲 Yocto开发专栏前言 Yocto开发专栏总目录 快速上手 Yocto理论篇 Metadata Layer BitBake工具 Toolchain或交叉编译器 Linux内 ...

  5. MT8516源码编译问题mDNSResponder-320.10.80 fetcher failure

    出于兴趣,最近空暇时间摸摸MT8516--一款智能语音开发平台,网上相关资料比较少,遇到点问题只能自己摸索,将遇到的第一个问题记录下来,并对接下来的问题提出,希望有这方面爱好的嵌友一起探讨. 按照官网 ...

  6. 如图两道面试题,顺便深入线程池,并连环17问

    这两面试题是基友朋友最近去面滴滴遇到的,今天就借着这两面试真题来深入一波线程池吧,这篇文章力求把线程池核心点和常问的面试点一网打尽,当然个人能力有限,可能会有遗漏,欢迎留言补充! 先把问题列出来,如果 ...

  7. 实践教程|YOLOX目标检测ncnn实现

    作者 | 唐超@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/391788686 编辑丨极市平台 导读 本文将YOLOX训练的模型转到ncnn进行推理加速. YOLO ...

  8. [转]用 jQuery 实现页面滚动(Scroll)效果的完美方法

    转自: http://zww.me/archives/25144 很多博主都写过/转载过用 jQuery 实现页面滚动(Scroll)效果的方法,但目前搜来的方法大都在 Opera 下有个小 Bug: ...

  9. 基于ESP32的竞赛裁判系统功能调试-与微机通讯

    简 介: 通过调试测试了基于ESP32设计的智能车竞赛的比赛系统方案与比赛软件联系的功能. 关键词: 智能车竞赛,比赛系统,ESP32 §01 比赛系统与微机通讯 在 基于ESP32智能车竞赛比赛系统 ...

最新文章

  1. JS栈结构的简单封装
  2. windows下primer3-py安装
  3. lora模块在牛联网和智慧农业中的应用案列
  4. strace监视系统调用
  5. 滴滴升级“极速拼车”:未拼成可享折扣 拼成更便宜
  6. HTML5的设计目的是为了在移动设备上支持多媒体
  7. Table边框使用总结
  8. Git分支简介与使用——Git的学习与使用(五)
  9. MapGuide应用开发系列(三)----MapGuide 数据包管理及Maestro亮点功能介绍
  10. padding属性的用法和作用
  11. 硬件设计之一——电源设计02:DCDC设计
  12. 内容创业洗稿,知识付费拆书
  13. VS Code —— 介绍如何配置快捷代码片段和一些自用插件
  14. Android数据持久化存储(一)
  15. python输入一个正整数、将其按逆序输出_Python实现按照指定要求逆序输出一个数字的方法...
  16. 岁月划过生命线(2016 年终总结 -季度之星)
  17. 用凯撒密码对喜欢的人表白
  18. 解决chrome下textarea控件滚动条不好使情况
  19. 2019 微信公开课 Pro 开幕:干货依旧满满,但张小龙去哪儿了?
  20. AS中码云的使用入门

热门文章

  1. CSP 202206-1 归一化处理
  2. SwiftUI Mapkit 导航基础教程大全之 MKMapView地图显示并实现导航线路(教程含源码)
  3. 基于知识图谱的问答系统v1.0
  4. intel parallel studio xe 2020 Update 4
  5. 开源的微信个人号接口 itchat 使用
  6. 15000个常用的英语单词
  7. 深信服2022届校招——安全服务工程师笔试
  8. 使用CSS实现首行缩进效果
  9. 让eclipse有像vs2005一样的智能感知能力
  10. [2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors