The Mer Wiki now uses your Mer user account and password (create account on


From Mer Wiki
Revision as of 13:07, 21 December 2011 by Stskeeps (Talk | contribs)

Jump to: navigation, search



In Mer, we're currently experimenting with integrating SB2 into OBS to provide a better and more flexible cross compilation method. This is instructions to help you get started testing/developing this project.

WARNING: this is in-development code and may cause damage

What does SB2-OBS do differently than current approach

When a SB2flags: configuration item is encountered, 'build' switches behaviour. When it is preinstalling packages, it will install packages listed in SB2install: to BUILD_ROOT and rest to BUILD_TARGET (typically /target). The packages in SB2install are typically a X86 tools/bootstrap, which includes SB2, QEMU and cross compilers.

Upon booting the VM, it will set up an abuild user and chown -R abuild /target. It will then set up a SB2 target in /target and begin to install RPM packages utilizing RPM.


The setup can currently build 308 out of 320 packages in Mer Core


It is assumed you already have a functioning osc+build install on your computer.

Trying it out

In a KVM

  • You need to set up so you can do KVM builds
  • osc build --clean --no-verify --vm-type=kvm Core_armv7l armv7el

OBS project configuration settings

In the fork of 'build' and Carsten Munk's OBS fork, it is now possible to do the following configuration settings

 %ifarch armv7el
 SB2install: packages-to-be-installed-in-root
 SB2flags: --toolchain /opt/cross/bin/armv7l-meego-linux-gnueabi-gcc --qemu /usr/bin/qemu-arm --debug

The sb2flags available:

 --toolchain /path/to/your/crosscompiler-gcc/in/tools
 --qemu /path/to/your/dynamic/qemu
 --installmode name-of-sb2-mode-used-for-buildsystem-setup
 --defaultmode name-of-sb2-mode-used-for-rpmbuild
 --debug, will enable SB2 debugging/logs

As an example, current home:Admin:sb2:noaccel project configuration is:

 %ifarch armv7el
 sb2install: sb2-tools-arm
 sb2flags: --toolchain /opt/cross/bin/armv7l-meego-linux-gnueabi-gcc --qemu /usr/bin/qemu-arm --debug

SB2 enablement details of Mer Core

OBS server and clients

First off, deploy the SB2-OBS patches for obs-build, opensuse-build-service patches to OBS and osc and obs-build for developer's clients from

It is important to deploy obs-build -and- opensuse-build-service to your OBS backend as these are interconnected and the OBS is what publishes 'build' code to the OBS workers.

For opensuse-build-service, it might be easier simply to grab the patch from and patch it directly to your installed setup, in /usr/lib/obs/server.


You must have a repository that contains the built RPMs from a project you intend to enable with SB2 cross compilation, both X86 and ARM packages.

In , we have those in Core:i586 and Core:armv7l. But the ARM port currently is utilizing our old cross compilation approach. So we need to somehow remove that. For non-Mer projects this is probably not needed.

To do this, we have created Core:armv7l:noaccel project, with this meta configuration:

 <project name="Core:armv7l:noaccel">
   <person role="maintainer" userid="Admin"/>
   <person role="bugowner" userid="Admin"/>
   <repository name="Core_armv7l">

The reader may notice that we don't have any <path> directories in this repository. This is because we will be utilizing aggregatepac ( ) to transfer the binaries as-is from our Core:armv7l without having to drag in the project configurations from there.

For aggregatepac to work, you need to have similar <repository> as the origin project in the target project.

What I then did was:

  osc -A ls Core:armv7l | xargs -L1 -Ixxx osc -A aggregatepac Core:armv7l xxx Core:armv7l:noaccel

Which will cause all the built RPMs from Core:armv7l to be represented in Core:armv7l:noaccel.

Then I created our Core:armv7l:sb2 repository with the following meta prj:

 <project name="Core:armv7l:sb2">
   <person role="maintainer" userid="Admin"/>
   <person role="bugowner" userid="Admin"/>
   <repository name="Core_armv7l">
     <path repository="Core_i586" project="Core:i586"/>
     <path repository="Core_armv7l" project="Core:armv7l:noaccel"/>

This means, that when searching for RPMs for building, it will first look in Core_i586 repository of Core:i586 and then in Core_armv7l repository of Core:armv7l:noaccel.

scratchbox2 package

Naturally we need a scratchbox2 package in the repository and it was uploaded with OBS (create package, upload sources), see it at


Compared to typical OBS setups where a static qemu-arm/etc binary is utilized, we are utilizing a dynamically linked qemu. This package can be seen at

cross compiler

We need a cross compiler built, in Mer, this is done by the gcc source package, but has a cross-armv7l-gcc.spec. For other non-Mer projects this may be done differently, but you need to have a working cross compiler.

For this to work, you need to have the glibc and kernel headers from the ARM side exported into X86. In Mer, this is handled by these packages:

The magic happens in baselibs.conf.

In Mer, we had to drop some bad dependencies in the cross-armv7l-gcc that linked to a certain version/release of libgcc/libmudflap, making it uninstallable.


Scratchbox2 relies on fakeroot, so this package should be installed into the tree, see

It is very very very important that you use the -sysv variant, as this is much much faster.


We have one package that is exported from X86 to ARM, containing the X86 tools, QEMU, SB2, cross compiler, etc.

This package can be seen at

This package is then, for ARM/targets, installed into / through the use of the SB2install: package project configuration statement, whereas rest of packages are installed into /target

A possible evolution could be SB2install: being able to install packages from other architectures than the target, making the need for the sb2-tools package disappear.


SB2 requires some patches to glibc in order to function well, for X86 side.

For glibc 2.13/Mer, the patches are available at

Personal tools