【发布时间】:2020-04-18 16:20:53
【问题描述】:
我正在尝试在 fstab 中添加一个简单的行 Yocto 构建的最终 rootfs。
我的第一种方法是在我的层 meta-mylayer/recipes-core/base-files/base-files/fstab 中添加我自己的 fstab 和适当的 meta-mylayer/recipes-core/base-files/base-files/base-files_%.bbappend 只有以下行:
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
它有效,但正如我的问题的标题所说,我想根据我想要构建的配方图像修改 fstab 即 dev-image & 产品图片。
经过一番调查,我认为我有两个选择
- 在配方图像中修改 fstab,扩展 do_install 任务...
dev-image.bb
--------------
DESCRIPTION = "Development Image"
[...]
inherit core-image
do_install_append () {
echo "======= Modifying fstab ========"
cat >> ${D}${sysconfdir}/fstab <<EOF
# The line i want to Add
EOF
}
[...]
--------------
问题是我实际上没有在我的最终 /etc/fstab 中看到我修改过的行,并且 bitbake 没有显示任何构建错误或警告,实际上,我什至无法查看我放置的回声跟踪。
- 我的第二次尝试是使用包处理这些修改,根据配方图像,我将能够为 *-dev 或 *-prod 添加包。这个想法来自this answer中的Oleksandr Poznyak,他总结了以下建议:
1) 在您的层中创建 *.bbappend recipe base-files_%s.bbappend。它 附加到狡猾的“基本文件”配方。
2) 在应该的地方创建自己的“python do_package_prepend”函数 让你的食谱产生两种不同的包装
3) 将它们添加到图像配方中的 DEPENDS
根据他的example,我制作了自己的食谱:
base-files_%.bbappend
-------------------------
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://fstab-dev \
file://fstab-prod \
"
PACKAGES += " ${PN}-dev ${PN}-prod"
CONFFILES_${PN}-dev = "${CONFFILES_${PN}}"
CONFFILES_${PN}-prod = "${CONFFILES_${PN}}"
pkg_preinst_${PN}-dev = "${pkg_preinst_${PN}}"
pkg_preinst_${PN}-prod = "${pkg_preinst_${PN}}"
RREPLACES_${PN}-dev = "${PN}"
RPROVIDES_${PN}-dev = "${PN}"
RCONFLICTS_${PN}-dev = "${PN}"
RREPLACES_${PN}-prod = "${PN}"
RPROVIDES_${PN}-prod = "${PN}"
RCONFLICTS_${PN}-prod = "${PN}"
python populate_packages_prepend() {
import shutil
packages = ("${PN}-dev", "${PN}-prod")
for package in packages:
# copy ${PN} content to packages
shutil.copytree("${PKGD}", "${PKGDEST}/%s" % package, symlinks=True)
# replace fstab
if package == "${PN}-dev":
shutil.copy("${WORKDIR}/fstab-dev", "${PKGDEST}/${PN}-dev/etc/fstab")
else:
shutil.copy("${WORKDIR}/fstab-prod", "${PKGDEST}/${PN}-prod/etc/fstab")
}
-------------------------
在我的 recipe-image(dev-image.bb) 我添加了 base-files-dev 数据包
dev-image.bb
--------------
DESCRIPTION = "Development Image"
[...]
inherit core-image
IMAGE_INSTALL = " \
${MY_PACKETS} \
base-files-dev \
"
[...]
--------------
这个问题,是我不熟悉 phyton 压痕所以可能是我搞砸了,错误日志显示如下。
DEBUG: Executing python function populate_packages
ERROR: Error executing a python function in exec_python_func() autogenerated:
The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_python_func() autogenerated', lineno: 2, function: <module>
0001:
*** 0002:populate_packages(d)
0003:
File: '/home/build/share/build_2/../sources/poky/meta/classes/package.bbclass', lineno: 1138, function: populate_packages
1134:
1135: workdir = d.getVar('WORKDIR')
1136: outdir = d.getVar('DEPLOY_DIR')
1137: dvar = d.getVar('PKGD')
*** 1138: packages = d.getVar('PACKAGES').split()
1139: pn = d.getVar('PN')
1140:
1141: bb.utils.mkdirhier(outdir)
1142: os.chdir(dvar)
File: '/usr/lib/python3.6/shutil.py', lineno: 315, function: copytree
0311: destination path as arguments. By default, copy2() is used, but any
0312: function that supports the same signature (like copy()) can be used.
0313:
0314: """
*** 0315: names = os.listdir(src)
0316: if ignore is not None:
0317: ignored_names = ignore(src, names)
0318: else:
0319: ignored_names = set()
Exception: FileNotFoundError: [Errno 2] No such file or directory: '${PKGD}'
DEBUG: Python function populate_packages finished
DEBUG: Python function do_package finished
我真的很感激任何线索或方向,我不是 Yocto 专家,所以我建议的选项可能不是最优雅的,可能有更好的方法,所以请随意给我任何建议。
非常感谢。
更新:
与往常一样,我不是唯一一个尝试这个的人,我让它工作的方式是感谢answer,唯一的不便是你需要通过 .bbappend 来 rm 你想要安装的东西,但是现在对我来说很好。
我也尝试对 bbclasses 做同样的事情,对我来说,这是一个更多的elegant way,但我失败了......我收到以下错误
错误:base-files-dev-3.0.14-r89 do_packagedata:配方 base-files-dev 正在尝试将文件安装到共享区域,而这些文件已经存在。这些文件及其清单位置是:
我尝试在 .bbappend 中 rm fstab,但显示相同的错误
也许有人会分享我做错了什么......
如果您觉得这篇文章没有价值,请删除...
【问题讨论】:
标签: embedded-linux yocto