These are my notes to get useful cross-compilation, even with autotools, and GStreamer stuff.
toolchain
The convention is to have ‘arm-linux-gcc‘ and so on, so that you can compile with ‘make CROSS_COMPILE=arm-linux-‘, the kernel and many other projects assume this is the default.
First, you would need ‘~/bin‘ to be on your path, so make sure you have it on ‘~/.bash_profile‘ (export PATH="$HOME/bin:$PATH"
) or whatever your favorite shell uses.
I use CodeSourcery (GNU/Linux 2009q3), you can fetch it from here.
cd ~/bin
toolchain=/opt/arm-2009q3
for x in $toolchain/bin/arm-none-linux-gnueabi-*
do
ln -s $x arm-linux-${x#$toolchain/bin/arm-none-linux-gnueabi-}
done
QEMU
This is needed for sb2 in order to kind of emulate an ARM system.
git clone git://git.savannah.nongnu.org/qemu.git
cd qemu
git checkout -b stable v0.12.5
./configure --prefix=/opt/qemu --target-list=arm-linux-user
make install
sbox2
This is needed to avoid most of the pain caused by autotools (thank you GNU… not!).
git clone git://gitorious.org/scratchbox2/scratchbox2.git
cd scratchbox2
git checkout -b stable 2.1
./autogen.sh --prefix=/opt/sb2
make install
Add sb2 to the PATH:
export PATH=/opt/sb2/bin:$PATH
sb2 target
Now it’s time to configure a target.
cd /opt/arm-2009q3/arm-none-linux-gnueabi/libc/
sb2-init -c /opt/qemu/bin/qemu-arm armv7 /opt/arm-2009q3/bin/arm-none-linux-gnueabi-gcc
You can check that it works with:
sb2 gcc --version
GStreamer
We are going to install everything into ‘/opt/arm/gst‘, so:
export PKG_CONFIG_PATH=/opt/arm/gst/lib/pkgconfig
You can skip the steps here and go directly to deployment if you download and extract this tarball on your target.
zlib
This is needed by GLib’s gio (which cannot be configured out).
wget -c http://zlib.net/zlib-1.2.5.tar.gz
tar -xf zlib-1.2.5.tar.gz
cd zlib-1.2.5
sb2 ./configure --prefix=/opt/arm/gst
sb2 make install
glib
GLib has bugs (623473, 630910) detecting zlib (thank you Mattias… not!). So either apply my patches, or do the C_INCLUDE_PATH/LDFLAGS hacks below:
export C_INCLUDE_PATH='/opt/arm/gst/include' LDFLAGS='-L/opt/arm/gst/lib'
git clone git://git.gnome.org/glib
cd glib
git checkout -b stable 2.24.1
./autogen.sh --noconfigure
sb2 ./configure --prefix=/opt/arm/gst --disable-static --with-html-dir=/tmp/dump
sb2 make install
gstreamer
git clone git://anongit.freedesktop.org/gstreamer/gstreamer
cd gstreamer
git checkout -b stable RELEASE-0.10.29
./autogen.sh --noconfigure
sb2 ./configure --prefix=/opt/arm/gst --disable-nls --disable-static --disable-loadsave --with-html-dir=/tmp/dump
sb2 make install
liboil
Needed by many GStreamer components.
git clone git://anongit.freedesktop.org/liboil
cd liboil
git checkout -b stable liboil-0.3.17
./autogen.sh --noconfigure
sb2 ./configure --prefix=/opt/arm/gst --disable-static --with-html-dir=/tmp/dump
sb2 make install
gst-plugins-base
git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-base
cd gst-plugins-base
git checkout -b stable RELEASE-0.10.29
./autogen.sh --noconfigure
sb2 ./configure --prefix=/opt/arm/gst --disable-nls --disable-static --with-html-dir=/tmp/dump
sb2 make install
gst-plugins-good
git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-good
cd gst-plugins-good
git checkout -b stable RELEASE-0.10.23
./autogen.sh --noconfigure
sb2 ./configure --prefix=/opt/arm/gst --disable-nls --disable-static --with-html-dir=/tmp/dump
sb2 make install
Deployment
So now we have everything installed in ‘/opt/arm/gst‘, but how to run on the target? Just copy the exact same files into the target on the exact same location, and then:
export PATH=/opt/arm/gst/bin:$PATH
That’s it, you can run gst-launch, gst-inspect, and so on.
Development
Ok, it should be clear how to do development from the previous steps, but in case it wasn’t clear, here’s how to:
gst-dsp
Each time you want to cross-compile, you need to tell pkg-config where to find the packages:
export PKG_CONFIG_PATH=/opt/arm/gst/lib/pkgconfig
git clone git://github.com/felipec/gst-dsp.git
cd gst-dsp
git checkout -b stable v0.8.0
make
Note that gst-dsp doesn’t use autotools, so sb2 is not needed.
Now, once you have the plugin (libgstdsp.so), copy to ‘/opt/arm/gst/lib/gstreamer-0.10‘ on the target.
And finally, you can run real gst-launch pipelines:
gst-launch playbin2 uri=file://$PWD/file.avi
Note: If you are missing some elements, play around with flags (flags=65 for native video-only)
Do some more development, type make
, copy, repeat 🙂
Enjoy 😉
None of the GStreamer modules is still using liboil. Instead, everything is now using orc: http://code.entropywave.com/projects/orc/ . This should improve the performance of many elements on ARM with NEON.
LikeLike
@Sebastian My main purpose is to have a setup that cross-compiles, my target usually has GStreamer already, I just copy the plugins I’m developing; I don’t really run what I install on /opt/arm/gst.
Also, no pipeline in real use-cases exercises any elements that use orc/oil. I guess it’s good for testing, or certain very specific applications. But if somebody wants to use this in a production system, many things need to be changed, like disabling logging and extra checks.
Anyway, I picked GStreamer 0.10.29 because I know it works. Maybe next time I’ll pick something above 0.10.30, or I’ll update this post, not that it will make much of a difference for cross-compilation.
LikeLike
In case anybody wants to compile (and run) the latest upstream GStreamer with the official Fremantle SDK, after installing the needed compile-time dependencies they’ll need to modify autogen.sh and configure.ac in each package so that the dependency with automake is lowered to 1.8.
For instance, in gstreamer core the file autogen.sh, line 43, has to be changed from:
"ftp://ftp.gnu.org/pub/gnu/automake/" 1 10 || DIE=1
to:
"ftp://ftp.gnu.org/pub/gnu/automake/" 1 8 || DIE=1
configure.ac, line 12 must be changed from:
AM_INIT_AUTOMAKE([-Wno-portability 1.10])
to:
AM_INIT_AUTOMAKE([-Wno-portability 1.8])
after doing this and launching:
./autogen.sh –noconfigure
configuration and compilation should work like a charm (until some last-minute patches are breaking rules).
I wonder why, if the effective dependency is with automake 1.8 (or lower), the configuration scripts have so a conservative approach. Thanks autotools.. not.
LikeLike