26 January 2012 ~ 3 Comments

Qt para Beagleboard

Al incio no tenia idea de que cosa era un toolchain o para qué servía. Ahora entiendo que es el conjunto de herramientas para compilar para plataformas que no son la misma en la que estas desarrollando. Obvio nadie va a usar una Beagleboard como su workstation, desarrollar y compilar ahi mismo, eso seria simple, pero tremendamente lento (peor si fuera una Raspberry Pi). Lo mejor es usar tu compu (x86) y compilar usando un toolchain para la Beagle (ARM). Por eso es importante el toolchain.

Lo más facil es crearte una imágen de Beagle a la medida usando Narcissus. No te fijes en que la página de Angstrom esta fea, ni en que la actualizan 1 vez cada año, el software sirve muy bien y no esta obsoleto ni abandonado pues los paquetes de opkg se actualizan con frecuencia. Baja tu Angstrom, instálalo en tu Beagle y haz que corra, hay tutoriales para eso. Tambien hay tutoriales para hacer red via usb con g_ether.

Instala el toolchain de Angstrom

Es fácil, se descomprime y ya. Yo usé la versión angstrom-2011.03-i686-linux-armv5te-linux-gnueabi-toolchain.tar.bz2 que no trae Qt, obvio pq yo instalaré una versión más nueva, mide como 40 o 50 megas.

# cd /
# tar -jxvf /tmp/angstrom-2011.03-i686-linux-armv5te-linux-gnueabi-toolchain.tar.bz2

No temas, no ensuciará el sistema, solo instalará algunas cosas en /usr/local/angstrom y otras en /var/lib/opkg/, puedes usar mc para indagar si es que tienes curiosidad.

Hay que bajar Qt, yo usé la version estable mas nueva (4.8.0) pero las instrucciones sirven para cualquier versión y pronto saldrá Qt 5 y entonces todos querran rehacer este turorial para Raspberry Pi, que es casi igual que para Beagle.

Cuidado, esta compilación no usará OpenGL ES 2.0 (porque aun no se como hacerlo bien, jeje).

Compilando Qt

Detalles de Qt:

  • No documentación ni ejemplos ni traducciones, etc. Eso lo tienes en tu versión de escritorio.
  • Quitamos muchas otras cosas inútiles como cups, gtk, y soporte Qt3.
  • Soporte para ratón incluído pues esta versión ejecutará sin X11/Xorg
  • QWS y soporte para linux framebuffer
  • Servidor integrado de pantalla remota VNC para que puedas ver lo que sale en la beagle desde tu PC.
    /opt/miApp/bin/miApp -qws -display VNC:0
  • ¡Multimedia!
  • Scripting ¡y QML!
  • No WebKit para acelerar la compilación, aunque puedes incluirlo si lo  necesitas.
  • PNG, JPG, TIFF y MNG directo dentro de Qt

Compilar Qt para ARM

Se necesita un mkspec especial. Esto es simplemente una receta que le dice al compilador la manera correcta de compilar Qt para ARM. El source (.tar.gz) o tu clon de Qt trae una carpeta llamada mkspecs, ahi estan organizados muchos. Crearemos uno nuevo dentro de la subcarpeta qws.

Crear un makespec para la Beagle

Crear el directorio [qt-source]/mkspecs/qws/linux-DM3730-g++  el nombre lo copié de otro tutorial (por eso dice DM3730), es irrelevante así que déjalo tal cual para que puedas hacer copy/paste de todo lo que sigue.

# cd mkspecs/qws
# mkdir linux-DM3730-g++ 
# cd linux-DM3730-g++

Y ahi crear 2 archivos con el siguiente contenido:

Archivo mkspecs/qws/linux-DM3730-g++/qmake.conf, 21 líneas efectivas (contando comentarios e ignorando lineas vacías). Ignora los comentarios de “modifications to xxx”, no hay que modificar nada, nomas copia y pega las siguientes líneas en el archivo qmake.conf nuevo:

# -------------- qmake.conf --------------
# qmake configuration for building with arm-linux-g++
#
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

# modifications to g++.conf
# Angstrom toolchain
QMAKE_CFLAGS_RELEASE = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
QMAKE_CXXFLAGS_RELEASE = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
QMAKE_CC = /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/gcc
QMAKE_CXX = /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/g++
QMAKE_LINK = /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/g++
QMAKE_LINK_SHLIB = /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/g++

# modifications to linux.conf
QMAKE_AR = /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/ar cqs
QMAKE_OBJCOPY = /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/objcopy
QMAKE_STRIP = /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/strip

load(qt_config)
# -------------- FIN: qmake-conf --------------

Nota que las rutas indican /usr/local/angstrom, tal cual debería ocurrir si no modificaste nada de

Archivo mkspecs/qws/linux-DM3730-g++/qplatformdefs.h,   solo tendrá una línea:

#include "../../linux-g++/qplatformdefs.h"

Ahora configura Qt con los módulos necesarios y sin los módulos irrelevantes:

# ./configure -opensource -confirm-license -prefix /opt/Qt-4.8.0_ARM -no-qt3support -embedded arm -little-endian -xplatform qws/linux-DM3730-g++ -nomake examples -nomake demos -nomake docs -nomake translations -depths 16,24,32 -no-mmx -no-3dnow -no-sse -no-sse2 -no-qt3support -no-glib -no-cups -no-largefile -no-accessibility -no-openssl -no-gtkstyle -qt-mouse-pc -qt-mouse-linuxtp -qt-mouse-linuxinput -plugin-mouse-linuxtp -plugin-mouse-pc -fast -no-javascript-jit -script -scripttools -declarative -declarative-debug -no-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -no-nis -no-iconv -no-pch -no-opengl -no-openvg -no-sm -no-xshape -no-xvideo -no-xsync -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-mitshm -no-xinput -no-xkb -no-xmlpatterns -no-webkit -no-sql-sqlite -no-sql-sqlite2 -multimedia -audio-backend -qt-gfx-vnc -qt-gfx-linuxfb

Ver en las notas finales parte de la salida del ./configure… Luego compilar e instalar.

# make && make install

Eso instalará todo en tu PC en /opt/Qt-4.8.0_ARM. Ahora crea un .tar y mandalo a la Beagle. En la Beagle crea la carpeta /opt si no existe y ahi mismo coloca lo de tu PC que esta en /opt/Qt-4.8.0_ARM.  Tendras lo mismo em ambos lados.

¡Qt está instalado en tu Beagle! Ahora configura algunos detalles necesarios para evitar dolores de cabeza.

Note: If filesystem was created using the narcissus progam, libstdc++.so.6 will be missing within the “/lib” directory of the target filesystem. This *.so file is needed to run Qt:

# opkg update
# opkg install libstdc++6

Configurar lo necesario en la Beagle

Edita en la Beagle: /etc/profile y coloca al final:

# Qt for ARM
export LD_LIBRARY_PATH=/opt/Qt-4.8.0_ARM/lib

Crea un usuario para tu Beagle, por comodidad yo usé “beagle”:

# adduser beagle

Cambia permisos y grupo de /opt (para deployment via Qt Creator):

# chown root:beagle /opt
# chmod g+rwx /opt

Para ejecutar aplicaciones sin X/Xorg con el parámetro -qws en el framebuffer con el usuario beagle, se necesita que esté en el grupo ‘video’. Edita directamente /etc/group para que la linea quede:

video:*:44:beagle

A lo mejor no es un 44, con cuidado en tu Beagle, ponle el que tenga. Aún así marcará error en la tty (el teclado) y en el audio y en otras cosas, habrá que editar las reglas de udev y poner todo como grupo beagle, eso es mas efectivo.

Una alternativa más fácil es hacer deploy como root, con eso todo funciona bien y no hay problemas de permisos ni grupos.

Notas

Pos si hace falta, entre lo que arrojó el ./configure salió:

Building on: qws/linux-x86-g++
Building for: qws/linux-DM3730-g++
Architecture: arm
Host architecture: i386
Build .................. libs
Configuration .......... cross_compile release shared dll embedded stl neon exceptions_off minimal-config small-config medium-config large-config full-config no-pkg-config embedded reduce_exports ipv6 clock-gettime clock-monotonic mremap getaddrinfo ipv6ifname getifaddrs inotify png no-gif freetype zlib multimedia audio-backend svg script scripttools declarative release
Debug .................. no
Qt 3 compatibility ..... no
QtDBus module .......... no
QtConcurrent code ...... yes
QtGui module ........... yes
QtScript module ........ yes
QtScriptTools module ... yes
QtXmlPatterns module ... no
Phonon module .......... no
Multimedia module ...... yes
SVG module ............. yes
WebKit module .......... no
JavaScriptCore JIT ..... no
Declarative module ..... yes
Declarative debugging ...yes
Support for S60 ........ no
Symbian DEF files ...... no
STL support ............ yes
PCH support ............ no
MMX/3DNOW/SSE/SSE2/SSE3. no/no/no/no/no
SSSE3/SSE4.1/SSE4.2..... no/no/no
AVX..................... no
iWMMXt support ......... no
NEON support ........... yes
IPv6 support ........... yes
IPv6 ifname support .... yes
getaddrinfo support .... yes
getifaddrs support ..... yes
Accessibility .......... no
NIS support ............ no
CUPS support ........... no
Iconv support .......... no
Glib support ........... no
GStreamer support ...... no
PulseAudio support ..... no
Large File support ..... no
GIF support ............ no
TIFF support ........... plugin (qt)
JPEG support ........... plugin (qt)
PNG support ............ yes (qt)
MNG support ............ plugin (qt)
zlib support ........... yes
Session management ..... no
Embedded support ....... arm
Freetype2 support ...... auto (yes)
Graphics (qt) .......... linuxfb multiscreen vnc linuxfb
Graphics (plugin) ......
Decorations (qt) ....... styled windows default
Decorations (plugin) ...
Keyboard driver (qt) ... tty
Keyboard driver (plugin) ..
Mouse driver (qt) ...... linuxinput
Mouse driver (plugin) .. linuxtp pc
OpenGL support ......... no
OpenVG support ......... no
OpenSSL support ........ no
Alsa support ........... no
ICD support ............ no
libICU support ......... no
Finding project files. Please wait...

3 Responses to “Qt para Beagleboard”

  1. Cristopher 9 February 2012 at 3:52 pm Permalink

    Excelente informacion, es muy excasa la informacion acerca de beagleboard en español.

    Tengo una pequeña incomidad, no se como puedo ver el escritorio de mi beagleboard (Angstrom) en mi pc. Lo he logrado antes con el escritorio remoto pero este solo funciona cuando la beagle esta conectada a mi pantalla (HDMI/DVI) pero cuando desconecto el monitor la conexion se pierde.

    Espero puedas ayudarme pero de antemano Gracias.

  2. Kiko 25 July 2012 at 7:24 am Permalink

    Hola, muchas gracias por el aporte, todo perfecto excepto que me sale un error al hacer “make” sobre el gettime.

    En realidad me he fijado que al hacer ./configure, en el apartado de configurations no me salen las siguientes cosas:

    ipv6 clock-gettime clock-monotonic mremap getaddrinfo ipv6ifname getifaddrs inotify

    Me recomiendas alguna cosa para hacer??? Un saludo y de nuevo, gracias

  3. Awaxisnei 1 October 2012 at 1:14 pm Permalink

    Hola muy buenas,

    quiero desarrollar una aplicación en mi PC (x86 con Ubuntu en un máquina virtual) para luego correrlo sobre una Beagleboard-xM.

    He configurado (./Configure … ) , compilado (make) e instalado (make install) mi qmake para ARM. QT Creator me lo detecta, por lo que creo que está todo bien.

    Luego creo una aplicación de prueba en C++ y construyo el proyecto con Buil desde QtCreator del PC.

    Con un pen drive copio el proyecto del PC a la Beagleboard, ejecuto y me dice lo siguiente:

    - bash: ./Prueba Not such file or directory

    ¿Alguien sabe por qué me ocurre ésto?

    ¿Hay que instalar algo en la Beagleboard para ejecutar ese “ejecutable”?

    Graciass


Leave a Reply