【问题标题】:HOW To resolve : Files/directories were installed but not shipped in any package:如何解决:文件/目录已安装但未在任何软件包中提供:
【发布时间】:2021-10-03 03:27:38
【问题描述】:

使用我的 repo 修改配方后,我在重建后出现此错误。 如何解决这个问题? 日志:

ERROR: phosphor-user-manager-1.0+gitAUTOINC+5a6e836a71-r1  do_package: QA Issue: phosphor-user-manager: Files/directories were installed but not shipped in any package:

  /dbus-1

  /usr/share

  /usr/share/phosphor-certificate-manager

  /usr/share/phosphor-certificate-manager/nslcd

  /dbus-1/system.d

  /dbus-1/system.d/phosphor-nslcd-cert-config.conf

  /lib/systemd/system/multi-user.target.wants

  /lib/systemd/system/multi-user.target.wants/phosphor-certificate-manager@nslcd.service

Please set FILES such that these items are packaged. Alternatively if they are unneeded, avoid installing them or delete them within do_install.

phosphor-user-manager: 8 installed and not shipped files. [installed-vs-shipped]

ERROR: phosphor-user-manager-1.0+gitAUTOINC+5a6e836a71-r1 do_package: Fatal QA errors found, failing task.

ERROR: Logfile of failure stored in: /home/openbmc/build/tmp/work/arm1176jzs-openbmc-linux-gnueabi/phosphor-user-manager/1.0+gitAUTOINC+5a6e836a71-r1/temp/log.do_package.224136

ERROR: Task (/home/openbmc/meta-phosphor/recipes-phosphor/users/phosphor-user-manager_git.bb:do_package) failed with exit code '1'

【问题讨论】:

    标签: linux embedded-linux yocto bitbake


    【解决方案1】:

    了解问题及其原因是很好的。

    Yocto 中的每个配方都有自己的${WORKDIR} 路径。

    在该路径下,Bitbake 在开始执行下一个任务(如配置、编译等)之前解压缩配方的所有 SRC_URI 条目。

    现在,在获得输出后,您需要将其安装到最终的 rootfs 中。

    安装过程在do_install 任务中使用${D} 变量完成。

    ${D} 指向${WORKDIR}/image

    假设您的配方编译了一个C 程序,其输出为hello 二进制。

    现在,你将它安装到/usr/bin 下的 rootfs 中,例如:

    do_install() {
       install -d ${D}${bindir}
       cp ${WORKDIR}/hello ${D}${bindir}
    }
    

    现在,在执行do_install 之后,${D}${bindir} 将包含hello

    之后,包进程do_package 将获取${D}/usr/bin 中的内容并将其添加到最终配方包中,即${WORKDIR} 中的package 目录。

    现在,问题将出现。

    打包过程将只获取与配方相关的FILES 变量中的内容,有关FILES here 的更多信息。

    如果它发现${D} 文件夹中存在FILES_${PN} 中未指定的某些内容,则会给出该错误。

    所以,为了解决这个问题,您只需将${D} 的所有内容添加到FILES_${PN} 变量即可。

    此外,您还可以指定包的类型(dbgdocdevptest、...)。

    示例:如果您的配方提供了一个二进制文件、一个man 文档和一个库文件,您可以这样组织它:

    do_install(){
       install -d ${D}${bindir}
       install -d ${D}/usr/include/helloLib
       install -d ${D}/usr/share/man/man1/
    
       cp ${WORKDIR}/build/hello ${D}${bindir}
       cp ${WORKDIR}/build/lib_files ${D}/usr/include/helloLib
       cp ${WORKDIR}/doc/hello.1 ${D}/usr/share/man/man1
    }
    

    对于${bindir} 和其他适当的路径变量,请检查this

    现在,我们的image 文件夹${D} 包含:

    • /usr/bin/hello
    • /usr/include/helloLib/hello_lib.h(或许多其他)
    • /usr/share/man/man1/hello.1

    您可以像这样将它们全部指定给FILES_${PN}

    FILES_${PN} = "/usr/bin/* /usr/include/helloLib/* /usr/share/*"
    

    或:

    FILES_${PN}-doc = "/usr/share/man/man1/*"
    FILES_${PN}-dev = "/usr/inlcude/helloLib/*"
    FILES_${PN}     = "/usr/bin/*"
    

    FILES中的所有指定项目收集到package文件夹后,将根据您的PACKAGE_CLASSES变量启动包类型过程,该变量可以是package_rpmpackage_debpackage_tarpackage_ipk , 更多信息here.

    最后,我们来了解一下最终的图像是如何采集的。

    图像配方执行do_rootfs,这将创建您系统的最终rootfs。

    它会遍历IMAGE_INSTALLIMAGE_FEATURES、..等中的所有recipe,并为每个recipe进入${WORKDIR}目录,并收集所有创建的包,并将它们安装到最终的rootfs中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多