Bitbake 没有在 rootfs 映像中安装我的文件

Bitbake not installing my file in the rootfs image


我创建了一个 bitbake 配方,它将我的 2 个文件(VPU 的固件二进制文件)复制到目标根文件系统上的 /lib/firmware/ 目录中。

我尝试了很多选择,所以我现在不确定我的食谱中有什么 unnecessary/redundant 以及需要什么。 我认为 FILESEXTRAPATHS..、SRC_URI.. 和 do_install.. 应该足够了,但它不能只使用它,也不能使用所有其他东西。

DESCRIPTION = "VPU libraries provided by fsl"

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690"

PACKAGE_ARCH = "all"
ALLOW_EMPTY_${PN} = "1"

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += " \
    file://vpu_fw_imx6d.bin \
    file://vpu_fw_imx6q.bin \
"

INSANE_SKIP_${PN} += "installed-vs-shipped"

do_install () {
    install -d ${D}${base_libdir}/firmware/
    cp ${WORKDIR}/vpu_fw_imx6d.bin ${D}${base_libdir}/firmware/
    cp ${WORKDIR}/vpu_fw_imx6q.bin ${D}${base_libdir}/firmware/
    chmod 755 ${D}${base_libdir}/firmware/vpu_fw_imx6d.bin
    chmod 755 ${D}${base_libdir}/firmware/vpu_fw_imx6q.bin
}
PACKAGES = "${PN}"
FILES_${PN} += " \
        ${D}${base_libdir}/firmware/vpu_fw_imx6d.bin \
        ${D}${base_libdir}/firmware/vpu_fw_imx6q.bin \
"

你能指出我做错了什么吗?

编辑:
安德斯的回答确实帮助解决了问题。

我正在发布 "fixed" 食谱以防有人觉得它有用。

DESCRIPTION = "VPU libraries provided by fsl"

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690"

PACKAGE_ARCH = "all"

SRC_URI += " \
    file://vpu_fw_imx6d.bin \
    file://vpu_fw_imx6q.bin \
"

do_install () {
    install -d ${D}${base_libdir}/firmware/
    install -m 755 ${WORKDIR}/vpu_fw_imx6d.bin ${D}${base_libdir}/firmware/
    install -m 755 ${WORKDIR}/vpu_fw_imx6q.bin ${D}${base_libdir}/firmware/
}

FILES_${PN} += " \
        ${base_libdir}/firmware/vpu_fw_imx6d.bin \
        ${base_libdir}/firmware/vpu_fw_imx6q.bin \
"

为了安全起见,删除所有不必要的行。

FILESEXTRAPATHS 没有必要;它仅在您编写 .bbappend 文件以修改另一层中的配方时使用。

ALLOW_EMPT_${PN} 也不需要。它用于允许 PN 为空,这仅在您创建其他包时才有用。在您的情况下,您需要 PN 中的固件文件,因此如果无法安装文件,最好在构建软件包时排除 bitbake 错误。

INSANE_SKIP_${PN} += "installed-vs-shipped" 也不需要。仅当您在 do_install 中安装您未放入包中的文件时才需要。通常,建议您不要安装它们或删除文件。

您的 do_install() 应该可以正常工作;尽管我建议使用 install 而不是 cpchmod。这样你也可以确保所有者和组是正确的。 (此检查已添加为 Jethro 中的新 QA 检查)。

PACKAGES = "${PN}" 不需要。

从您的 FILES_${PN} 定义中删除 ${D}FILES 中的路径应该是目标上的路径(即不包括 D 目录)。

这应该会让你兴奋起来运行。

谢谢,很好的起点。我终于这样安装了两个.sh脚本。

我创建了这个文件结构(文件夹名称 "files" 被 Yocto 自动识别,最好保持原样):

    > bitbake-layers create-layer meta-mylayer
    > cp -r meta-mylayer ../sources/yocto/meta-layers/
    > cat >> conf/bblayers.conf << EOF
    > ${BSPDIR}/sources/meta-mynetworklayer \
    > EOF
    > pwd
    /yocto/meta-layers/meta-mylayer/recipes-tools/somename
    > tree .
    .
    ├── files
    │   ├── somescript1.sh
    │   └── somescript2.sh
    └── somename.bb

我将 "somename" 的引用添加到 local.conf:

IMAGE_INSTALL_append = " somename"

somename.bb 文件看起来是这样的:

DESCRIPTION = "Some description"

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI += " file://somescript1.sh \
             file://somescript2.sh \
           "

inherit allarch
do_compile[noexec] = "1"

do_install() {
    install -d ${D}${bindir}
    install -m 0770 ${WORKDIR}/somescript*.sh ${D}/${bindir}
}

Yocto 会自动在文件夹 "files" 中找到文件,它会将它们复制到临时 ${WORKDIR} 并且第二行 "install" 确保这两个文件稍后都会在目标上出现在文件夹 /usr/bin 中。因为 ${bindir}(例如 /usr/bin)被用作复制目标,所以在这种情况下不需要 FILES_${PN}。