La compilación cruzada o o cross-compiling consiste, en generar binarios para una arquitectura distinta a la que estamos utilizando para compilar. Por ejemplo, generar un ejecutable para un procesador ARM desde una arquitectura IA-32 o AMD64. Para el caso de una raspberry pi nos va a permitir ahorrarnos muchas horas ya que nuestro PC es varias veces más potente que la raspberry pi.

QT5 es un framework C++ de código abierto y multiplataforma desarrollado por Digia, con multitud de documentación y con lo que podemos hacer prácticamente de todo.

En esta entrada de blog, vamos a ver cómo a partir de una imagen de raspbian (el debian de raspberry pi), y de nuestro PC vamos a ser capaces de compilar QT5 e ‘incrustarlo’ dentro de la imagen, para que una vez acabado el proceso, podamos grabar dicha imagen en una SD y trabajar con QT desde la raspberry out of the box.

prerequisistos

Hace falta tener instalados algunos paquetes previa compilación de los mismos:

sudo apt-get install build-essential libgl1-mesa-dev git ia32-libs

compilación

Para la compilación vamos a trabajar en un direcotrio opt de nuestra carpeta home y tendremos que obtener la ultima imagen de raspbian, la cual una vez descargada, nombraremos a raspbian.img:

mkdir ~/opt
cd ~/opt
wget http://downloads.raspberrypi.org/raspbian_latest -O raspbian_latest.zip
unzip raspbian_latest.zip
mv 2014-01-07-wheezy-raspbian.img raspbian.img

montamos la imagen de raspbian como un dispositivo:

sudo mkdir /mnt/rasp-pi-rootfs
sudo mount -o loop,offset=62914560 raspbian.img /mnt/rasp-pi-rootfs

nota: raspbian jessie: sudo mount -o loop,offset=67108864 raspbian.img /mnt/rasp-pi-rootfs

clonamos el código fuente de QT5 desde git:

git clone git://gitorious.org/qt/qt5.git

accedemos al directorio creado e inicializamos el repositorio:

cd qt5
./init-repository

Descargamos las librerías de Linaro para la compilación cruzada:

cd ..
wget http://swap.tsmt.eu/gcc-4.7-linaro-rpi-gnueabihf.tbz
tar xvf gcc-4.7-linaro-rpi-gnueabihf.tbz
git clone git://gitorious.org/cross-compile-tools/cross-compile-tools.git
cd cross-compile-tools
sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/ ~/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc

compilamos QT5 con los parámetros adecuados:

cd ../qt5
./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=~/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt5pi -no-pch
make -j 4
sudo make install

y por último, desmontamos la imagen de la rpi:

sudo umount /mnt/rasp-pi-rootfs/

Después de acabar todo el proceso, nuestra imagen raspbian.img contendrá QT5 compilado dentro, sólo queda grabarlo a una tarjeta SD.