Search code examples
imageyoctoyocto-recipe

Files are not installed from recipe


I'm trying to create a custom recipe to sign a u-boot image generated from u-boot.bb.

I have 2 custom recipes:

1. u-boot.bb - clones, compiles and deploys u-boot resulting u-boot.elf.
2. u-boot-sign.bb - depends on u-boot.bb. Gets u-boot.elf, passes it through
                    custom signing procedure and deploys the result.

For signing I am forced to use a custom procedure which is in a form of python scripts located in external repository.

The part which causes a problem is accessing a deployed u-boot.elf binary file from u-boot.bb recipe. I cannot find a way to expose u-boot.elf binary file to a u-boot-sign.bb recipe.

What should be the correct way of exposing an image binary file from one recipe, to be accessed, signed and deployed in another recipe?


Solution

  • For the purpose of sharing the files between recipes and between cross-compilation scope, I used ${datadir} when installing the binaries (via do_install). This allowed me to access all files described by FILES:${PN} via recipe-sysroot.

    u-boot.bb - exporting recipe:

    …
    do_install() {
        install -d ${D}${datadir}/u-boot-2016/
        install -m 0644 ${B}/${UBOOT_ELF_BINARY} ${D}${datadir}/u-boot-2016
    }
    
    FILES:${PN} = "${datadir}/u-boot-2016"
    …
    

    u-boot-sign.bb - depending recipe

    …
    DEPENDS += " u-boot python3-native"
    
    do_sign() {
        ${STAGING_BINDIR_NATIVE}/python3-native/python3 sign.py \
                    -i ${RECIPE_SYSROOT}${datadir}/u-boot-2016/${UBOOT_ELF_BINARY}
    
    }
    …
    

    Inspiration from Here

    Edit

    I was advised not to transfer files like this using ${datadir}. For intermediate files the better approach would be to use to use /firmware as it is done in meta-arm.

    u-boot.bb - exporting recipe:

    …
    do_install() {
        install -D -p -m 0644 ${B}/${UBOOT_ELF_BINARY} ${D}/firmware/${UBOOT_ELF_BINARY}
    }
    
    FILES:${PN} = "/firmware"
    SYSROOT_DIRS += "/firmware"
    …
    

    u-boot-sign.bb - depending recipe

    …
    DEPENDS += " u-boot python3-native"
    
    do_sign() {
        ${STAGING_BINDIR_NATIVE}/python3-native/python3 sign.py \
                    -i ${RECIPE_SYSROOT}/firmware/u-boot-2016/${UBOOT_ELF_BINARY}
    }
    …
    

    It also requires to add /firmware to SYSROOT_DIRS.