如何解决:文件/目录已安装但未在任何包中发货:

1 linux embedded-linux bitbake yocto

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

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'
Run Code Online (Sandbox Code Playgroud)

Tal*_*LEM 16

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

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

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

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

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

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

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

现在,您将其安装到 rootfs 下,如下/usr/bin所示:

do_install() {
   install -d ${D}${bindir}
   cp ${WORKDIR}/hello ${D}${bindir}
}
Run Code Online (Sandbox Code Playgroud)

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

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

现在,问题就会出现。

打包过程只会采用FILES与配方相关的变量中的内容,更多信息请参见FILES 此处

如果发现${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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

FILES_${PN} = "/usr/bin/* /usr/include/helloLib/* /usr/share/*"
Run Code Online (Sandbox Code Playgroud)

或者:

FILES_${PN}-doc = "/usr/share/man/man1/*"
FILES_${PN}-dev = "/usr/inlcude/helloLib/*"
FILES_${PN}     = "/usr/bin/*"
Run Code Online (Sandbox Code Playgroud)

将所有指定项目收集FILESpackage文件夹中后,将根据您的PACKAGE_CLASSES变量启动包类型过程,该变量可以是package_rpmpackage_debpackage_tarpackage_ipk,更多信息请参见此处

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

执行该image配方do_rootfs将创建系统的最终 rootfs。

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


小智 5

如果您使用的是新版本的 Yocto,这将有所帮助:FILES:${PN} ="name"目录不发货”;在旧版本中,它是FILES_${PN}.

所以你的答案应该是: FILES:${PN}= "/dbus-1 /usr/share /lib/systemd/"