linux 如何解决:已安装文件/目录,但未在任何软件包中提供:

klh5stk1  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(202)

使用我的存储库修改配方后,我在重建后遇到了这个错误。如何解决这一问题?记录:

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'

字符串

dw1jzc5e

dw1jzc5e1#

了解问题及其原因是很好的。
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的更多信息。
如果它发现一些内容存在于${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/您好
  • /usr/include/helloLib/hello_lib.h(或许多其他文件)
  • /用户/共享/人/人1/您好.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)启动一个包类型进程,更多信息请参见此处。
最后,让我们了解如何收集最终图像。
image配方执行do_rootfs,这将创建系统的最终rootfs。
它经历了所有的食谱,是在IMAGE_INSTALLIMAGE_FEATURES,。等等,并为每个文件输入${WORKDIR}目录,收集所有创建的软件包,并将它们安装到最终的rootfs中。

oipij1gg

oipij1gg2#

如果您正在使用新版本的Yocto,这将有助于:FILES:${PN} ="name"的dirs不发货”;在旧版本中,它是FILES_${PN}
所以你的答案应该是:FILES:${PN}= "/dbus-1 /usr/share /lib/systemd/"

相关问题