Recently an OpenEmbedded class name srctree became usable. The srctree.bbclass enables operation inside of an existing source tree for a project, rather than using the fetch/unpack/patch idiom. The srctree.bbclass in combination with the OpenEmbedded gitver.bbclass and git submodules provides a very interesting way to build custom software with OpenEmbedded.
One of the classic problems with OpenEmbedded is how do application and kernel developers use it. While OpenEmbedded excels at automating image builds, it is less friendly when used as a a cross development tool. Historically there are several options for iterative development:
- develop in the working directory: cd <tmp>/work/arm…/<my recipe>; ../temp/run.do_compile …
- a variation of #1: bitbake -c devshell <my recipe>
- manually set up an environment that uses the toolchain generated by OE. As example see this script in the BEC OE template.
- a variation of #3: export a SDK that includes a toolchain and libs
While the above solutions work OK, the process can be a little cumbersome. Unless your OE recipe pulls software directly from the TIP of a SVN repository, you may have to manually update the recipe after you make changes, create patch files, etc. There is also the problem that if your recipe fetches the latest from SVN, it drastically slows down the recipe parsing as it has to check the repository for a new version every time the recipe is processed.
The optimal solution would to be to simply check a software component out of a version control system, and build it directly using OpenEmbedded. Icing on the cake would be if the package generated would automatically extract version information from the version control system. This would facilitate iterative development for software components that need to be cross compiled.
Although srctree can be used with any directory of source code, it really works best with a git repository. The gitver.bbclass provides a GITVER variable which is a (fairly) sane version, for use in ${PV}, extracted from the ${S} git checkout, assuming it is one (text from recipe). gitver uses the ‘git describe’ command to extract the last tag and uses that for the version.
The best way to illustrate the use of these tools is an example:
The easiest way to try this is clone the above project in your openembedded/recipes directory:
$ cd openembedded/recipes $ git clone https://github.com/cbrake/autotools-demo.git $ cd autotools-demo $ git describe 1.1 $ git tag -l 1.0 1.1
Notice that git describe simple returns the latest tag. The recipe can be located in the same directory as the source code and has the following contents:
# recipe to build the autotools-demo in the working tree inherit srctree autotools gitver PV = "${GITVER}"
Can’t get much easier than that! If you build the recipe, you end up with a package:
$ bitbake autotools-demo $ ls tmp/deploy/glibc/ipk/armv5te/autotools-demo_1.1-r0.6_armv5te.ipk
Now, what happens if you make changes and commit them?
$ cd .../autotools-demo $ (make a change and commit) $ git describe 1.1-1-gfbc1ecc (notice the count and hash automatically appended) $ (make another change and commit) $ git describe 1.1-2-g7ad3715 (notice the count is now 2)
If we bitbake the recipe now, we end up with a packaged named:
tmp/deploy/glibc/ipk/armv5te/autotools-demo_1.1-2-g7ad3715-r0.6_armv5te.ipk
The gitver class in OpenEmbedded automatically takes care of creating a usable PV (package version) that always increments.
So in summary, srctree and gitver give developers a convenient way to handle custom components that change often in an Embedded Linux build without increasing parse times, requiring manual tweaks to version numbers, or creating a separate workspace for each version of the application that is built. As practices such as continuous integration become more common, OpenEmbedded features like this are increasingly needed. An added benefit is that the OpenEmbedded recipe can now be stored in the same location as the source code. Perhaps in the future, most applications will include an OpenEmbedded recipe as part of their source code and git submodules could be used to simple populate the components you want to use.
2017-11-08 update: A tool named devtool is now the preferred way to do much of the above.
s/can not be stored/can be stored/ 😉
Hello.
Nice artcile to show people how to use srctree and gitver.
There is a small typo at the end: “An added benefit is that the OpenEmbedded recipe can not be stored in the same location as the source code” I think you did mean: “An added benefit is that the OpenEmbedded recipe can now be stored in the same location as the source code”
regards
Stefan Schmidt
Thanks for the feedback–article corrected.
You can also override S in local.conf if you want to keep the program source separate from the recipe. Something like:
S_pn-gnuradio-srctree = “/home/balister/src/git/gnuradio”
Hi,
I am bit new to open embedded and I was just trying to integrate an open source package but it always fails me at do_rootfs stage with error as Matched Keyword : Cannot find the package.
Any inputs regarding this will really helpful to me.
Thanks,
Dileep.
Comments are closed.