Part1 : Environment setup and initial build
Part2 : Build u-boot using Yocto
Part3 : Build Kernel using Yocto
Part4 : Package Development using Yocto     <-- You are here
Part5 : Application Development using ADT


In my last blog we walk through the steps involved in kernel build on yocto platform.


In this blog we will create a small package and add to yocto  using simple steps.


In previous blogs we have used bitbake commands to build uboot and kernel images.

you must be aware by now that something call recipe (config files) are required to build yocto packages.


We will create a package. lets say “helloworld”. (i can't find a better package name )


The recipe for helloworld must be present in  a directory which bitbake can locate by parsing  predefined recipe directories in bblayers.conf.


As usual :

Setting up yocto environment for Riotboard:

~$ cd fsl-arm-yocto-bsp

~/fsl-arm-yocto-bsp$  MACHINE=riotboard source -b build -e fb



All the recipe paths are  set in "build/conf/bblayers.conf"

we can add our recipe to any of the paths mentioned by  BBLAYERS.

I am selecting the meta-oe directory for my recipe.






BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}"




  ${BSPDIR}/sources/poky/meta \

  ${BSPDIR}/sources/poky/meta-yocto \


${BSPDIR}/sources/meta-openembedded/meta-oe \


  ${BSPDIR}/sources/meta-fsl-arm \

  ${BSPDIR}/sources/meta-fsl-arm-extra \

  ${BSPDIR}/sources/meta-fsl-demos \


##Freescale Yocto Release layer

BBLAYERS += " ${BSPDIR}/sources/meta-fsl-bsp-release/imx/meta-fsl-arm "

BBLAYERS += " ${BSPDIR}/sources/meta-fsl-bsp-release/imx/meta-fsl-demos "

BBLAYERS += " ${BSPDIR}/sources/meta-browser "

BBLAYERS += " ${BSPDIR}/sources/meta-openembedded/meta-gnome "

BBLAYERS += " ${BSPDIR}/sources/meta-openembedded/meta-networking "


Creating Recipe:

~/fsl-arm-yocto-bsp/build$ cd ../sources/meta-openembedded/meta-oe/recipes-support

~/fsl-arm-yocto-bsp/sources/meta-openembedded/meta-oe/recipes-support$ mkdir helloworld && mkdir helloworld/files

It will create a helloworld directory with a files directory in it.


Now create a recipe (a file) called “” in helloworld directory with appropriate  contents.

DESCRIPTION = "helloworld test"

PR = "r0"

SRC_URI = "file://helloworld.c"


LIC_FILES_CHKSUM = "file://helloworld.c;md5=d8a749d19bf44c377936cfc80333c27e"

S = "${WORKDIR}"


do_compile() {

             ${CC} ${CFLAGS} ${LDFLAGS} -o helloworld helloworld.c



do_install() {

             install -d ${D}${bindir}/

             install -m 0755 ${S}/helloworld ${D}${bindir}/



FILES_${PN} = "${bindir}/helloworld"


Next create a file “helloworld.c” in helloworld/files directory with below contents:

#include <stdio.h>


int main()


    printf("hello world\n");

    return 0;



checking the directory structure:

~/fsl-arm-yocto-bsp/sources/meta-openembedded/meta-oe/recipes-support$ tree helloworld



|-- files

|   `-- helloworld.c



1 directory, 2 files




we need to have the correct md5sum  of  helloworld.c  in  for the recipe to build sucessfully.


~/fsl-arm-yocto-bsp/sources/meta-openembedded/meta-oe/recipes-support$ md5sum helloworld/files/helloworld.c

d8a749d19bf44c377936cfc80333c27e  helloworld/files/helloworld.c


Now check if the above md5 value matches with the one in recipe.

~/fsl-arm-yocto-bsp/sources/meta-openembedded/meta-oe/recipes-support$ cat helloworld/ | grep md5

LIC_FILES_CHKSUM = "file://helloworld.c;md5=d8a749d19bf44c377936cfc80333c27e"


If the md5 values on above cases match we are ready for build, else update the md5 value in


from the yocto build directory build the recipe.

~/fsl-arm-yocto-bsp/sources/meta-openembedded/meta-oe/recipes-support$ cd -

~/fsl-arm-yocto-bsp/build$ bitbake helloworld

You will get the below output




NOTE: Preparing runqueue

NOTE: Executing SetScene Tasks

NOTE: Executing RunQueue Tasks

NOTE: Tasks Summary: Attempted 538 tasks of which 530 didn't need to be rerun and all succeeded.


Summary: There was 1 WARNING message shown.



If you will get below error, certainly you have a md5sum mismatch.



The image binary can be found here.




Now copy and execute the binary in Riotboard:

root@riotboard:/opt# ./helloworld

hello world



It will output a nice helloworld display.


Okay that was cool.


Now there are two things :

1. you can share your application binary as a standalone executable.

2. distribute your app with the BSP and make it available by default in rootfs in sdcard image .


To bundle our helloworld app with bsp:


Inside fsl-arm-yocto-bsp directory.


add below line in

echo "IMAGE_INSTALL_append = \" helloword \"" >> $BUILD_DIR/conf/local.conf


echo "BBLAYERS += \" \${BSPDIR}/sources/meta-browser \"" >> $BUILD_DIR/conf/bblayers.conf

echo "BBLAYERS += \" \${BSPDIR}/sources/meta-openembedded/meta-gnome \"" >> $BUILD_DIR/conf/bblayers.conf

echo "BBLAYERS += \" \${BSPDIR}/sources/meta-openembedded/meta-networking \"" >> $BUILD_DIR/conf/bblayers.conf


echo >> $BUILD_DIR/conf/local.conf

#trp add

echo "IMAGE_INSTALL_append = \" helloworld \"" >> $BUILD_DIR/conf/local.conf



if [ "$BACKEND" = "fb" ] || [ "$BACKEND" = "wayland" ] || [ "$BACKEND" = "dfb" ]  ; then


Inside "/sources/meta-fsl-bsp-release/imx/meta-fsl-demos/recipes-fsl/images" directory.


add  helloworld  to  IMAGE_INSTALL  in



    cpufrequtils \

    nano \

    packagegroup-fsl-gstreamer \

    packagegroup-fsl-tools-testapps \

    packagegroup-fsl-tools-benchmark \

    helloworld \



export IMAGE_BASENAME = "fsl-image-fb"


now “helloworld” package will be available as built-in binary.


Henceforth when you are building image using fsl-image-fb, the helloworld package gets automatically added to the image.


You can find more information on recipe creation here.