即使在阅读了手册之后,我也很难理解
FILES_${PN}
。例如,我正在研究制作启动脚本的这个示例。在我写了类似的内容后,我收到了这些错误消息。
ERROR: initscriptd-1.0-r0 do_package: QA Issue: initscriptd: Files/directories were installed but not shipped in any package:
/usr
/usr/sbin
Please set FILES such that these items are packaged. Alternatively if they are unneeded, avoid installing them or delete them within do_install.
initscriptd: 2 installed and not shipped files. [installed-vs-shipped]
ERROR: initscriptd-1.0-r0 do_package: Fatal QA errors found, failing task.
ERROR: initscriptd-1.0-r0 do_package: Function failed: do_package
ERROR: Logfile of failure stored in: /home/yahia/Desktop/elinux_dev/bake_factory/poky-pyro-17.0.1/build/tmp/work/core2-64-poky-linux/initscriptd/1.0-r0/temp/log.do_package.5252
ERROR: Task (/home/yahia/Desktop/elinux_dev/bake_factory/poky-pyro-17.0.1/meta-mylayer/recipes-core/mylayer-initscript/initscriptd.bb:do_package) failed with exit code '1'
据我了解,我提供的要安装在映像上的配方文件没有打包在某个包中,因此 Yocto 不知道在哪里解压它们,我是对的吗?
所以,我添加了
FILES_${PN} += " with all directory paths "
,我安装了配方文件,然后它工作得很好。
那么,你能向我解释一下为什么我需要这样做吗?什么时候?如果提供一个连贯的例子将会很有帮助。
一个配方可以(并且通常)生产多个包装。该系统并不完全愚蠢,因此例如所有标头都会自动进入
-dev
包,所有文档都会进入 -doc
,但配方编写者通常需要决定特定文件属于哪个包。这是通过 FILES_<packagename> += "/path/to/file"
格式完成的。
FILES_* 的默认值可以在
meta/conf/bitbake.conf
中找到,但请注意,您的配方继承的类也可能会修改这些值:使用 bitbake -e <recipe>|grep ^FILES_
检查最终值
在您的情况下,您的项目构建系统似乎创建了一些目录,但没有在其中放置任何内容?如果是这种情况,您可以修改构建系统以不这样做,或者添加一个
do_install_append()
函数,在安装后删除空目录。
通常
<package name>
已在 Yocto 中使用 ${PN}
变量定义,因此文件分配会很简单。如果您想添加整个子树,星号*
也可以正常工作。也许可以考虑使用一些预定义的变量来决定将你的东西存放在最终图像树上的位置:
FILES_${PN} += "${nonarch_base_libdir}/<your package folder>/*"