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}
变量即可。
此外,您还可以指定包的类型(dbg
、doc
、dev
、ptest
...)。
示例:如果您的配方提供了一个二进制文件、一个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}
包含:
您可以将它们全部指定为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)
将所有指定项目收集FILES
到package
文件夹中后,将根据您的PACKAGE_CLASSES
变量启动包类型过程,该变量可以是package_rpm
、package_deb
、package_tar
或package_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/"
归档时间: |
|
查看次数: |
6525 次 |
最近记录: |