Writing BitBake Recipes

In order to package your application and include it in the root filesystem image, you must write a BitBake recipe for it.

When starting from scratch, it is easiest to learn by example from existing recipes.

Example HelloWorld recipe using autotools

For software that uses autotools (./configure; make; make install), writing recipes can be very simple:

DESCRIPTION = "Hello World Recipe using autotools"
HOMEPAGE = "http://www.multitech.net/"
SECTION = "console/utils"
PRIORITY = "optional"
PR = "r0"

SRC_URI = "git://git.multitech.net/helloworld-autotools.git;protocol=git;tag=1.0.0"
S = "${WORKDIR}/git"

inherit autotools

SRC_URI specifies the location to download the source from. It can take the form of any standard URL using http://, ftp://, etc. It can also fetch from SCM systems, such as git in the example above.

PR is the package revision variable. Any time a recipe is updated that should require the package to be rebuilt, this variable should be incremented.

inherit autotools brings in support for the package to be built using autotools, and thus no other instructions on how to compile and install the software are needed unless something needs to be customized.

S is the source directory variable. This specifies where the source code will exist after it is fetched from SRC_URI and unpacked. The default value is ${WORKDIR}/${PN}-${PV}, where PN is the package name and PV is the package version. Both PN and PV are set by default using the filename of the recipe, where the filename has the format PN_PV.bb.

Example HelloWorld recipe using a single source file

This example shows a simple case of building a helloworld.c file directly using the default compiler (gcc). Since it isn’t using autotools or make, we have to tell BitBake how to build it explicitly.

DESCRIPTION = "HelloWorld"
SECTION = "examples"

SRC_URI = "file://helloworld.c"

S = "${WORKDIR}"

do_compile() {
	${CC} ${CFLAGS} ${LDFLAGS} helloworld.c -o helloworld

do_install() {
	install -d ${D}${bindir}
	install -m 0755 helloworld ${D}${bindir}

In this case, SRC_URI specifies a file that must exist locally with the recipe. Since there is no code to download and unpack, we set S to WORKDIR since that is where helloworld.c will be copied to before it is built.

WORKDIR is located at ${OETREE}/build/tmp/work/armv5te-corecdp-linux-gnueabi/<package name and version> for most packages. If the package is machine-specific (rather than generic for the armv5te architecture), it may be located in the mtcdp-corecdp-linux-gnueabi or mt100eocg-corecdp-linux-gnueabi subdirectory depending on your hardware (this applies to kernel packages, images, etc).

do_compile defines how to compile the source. In this case, we just call gcc directly. If it isn’t defined, do_compile runs make in the source directory by default.

do_install defines how to install the application. This example runs install to create a bin directory where the application will be copied to and then copies the application there with permissions set to 755.

D is the destination directory where the application is installed to before it is packaged.

${bindir} is the directory where most binary applications are installed, typically /usr/bin.

For more examples, see the Multi-Tech recipes in ${OETREE}/openembedded/recipes/multitech and the many OpenEmbedded recipes in ${OETREE}/openembedded/recipes.

For a more in-depth explanation of BitBake recipes, syntax, and variables, see the Writing a New RecipeĀ at www.yactoproject.org.

Also see OpenEmbedded documentation and related links.