Compilation de Qt 5.4 pour le BBB sur Mac Osx

Pour pouvoir utiliser QtQuick et autres gadgets, j’avais besoin de Qt 5 sur le BBB, avec le support d’OpenGL Es 2.
J’ai déjà compilé Qt5 sur linux, mais allons-y pour la même chose sous OSx.

Sur un des BBB, j’ai un écran tactile de 7″ qui vient de chez 4D Systems. Il fonctionne bien, mais comme la plupart des écrans tactiles pour le Beagle Bone, la partie tactile utilise les convertisseurs AD du BeagleBone. La partie tactile est utilisable, mais pas de manière optimale. Dans un exemple de Qt, Calculator, souvent il faut s’y reprendre à plusieurs fois pour qu’une touche soit détectée. J’ai cherché, et je ne suis pas le seul à avoir remarqué ça. Donc, j’utilise un module à part pour l’écran tactile:un Egalax en USB acheté en Chine à pas cher avec une dalle tactile supplémentaire.

Tout ça pour en venir à une constatation: avec ce module, bien que sous Qt 4.8 en QWS tout fonctionne, lorsque qu’on lance un programme compilé sous Qt5, l’axe des Y est renversé. Apparemment cela vient de la librairie TSLib.
La solution est donc de recompiler cette librairie et de l’inclure dans la compilation de Qt5 en partant du repo sur github.

 

Prérequis: automake, autoconf et libtool avec

sudo port install automake autoconf libtool

Bien entendu la toolchain de cross-compilation qui va bien ( ici la 4.8 ) de chez Knut: ici

Il peut aussi manquer le GCC.
Dans ce cas là:

sudo port install gcc48

Puis pour sélectionner la version de gcc à utiliser:

port select --list gcc
Available versions for gcc:
   mp-gcc48
   none (active)
sudo port select --set gcc mp-gcc48

Pour compiler TSlib:

export CC=/usr/local/linaro/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
export CXX=/usr/local/linaro/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
export CONFIG_SITE=arm-linux.autogen
./autogen.sh
./configure --host=arm-linux-gnueabihf --prefix /usr/local/opt/qt5.4/tslib -enable-static=yes -enable-shared=yes
make
make install
cd /usr/local/opt/qt5.4/tslib/
tar czvf tslib.tar.gz bin include lib
scp tslib.tar.gz root@192.168.10.85:/usr/

Et sur le BBB:

cd /usr/
tar zxvf tslib.tar.gz
rm tslib.tar.gz

On se retrouve donc avec la TSlib fraichement compilée.

Pour ce qui est de OpenGL, j’ai pris un raccourci.
Sous ma machine virtuelle debian, sur laquelle je génère des images pour le BBB,  j’ai copié le répertoire du SDK pour la partie graphique sgx.
Rendons à César ce qui lui appartient, j’ai suivi les préceptes de Robert Nelson qui sont ici: https://eewiki.net/display/linuxonarm/BeagleBone+Black pour pouvoir obtenir une image avec un kernel 3.15, justement à cause de l’openGL ( tout du moins à l’époque où je me suis embarqué là dedans ).
Robert est très sympa et on a eu quelques échanges pour pouvoir intégrer la cape 4D Systems pour l’écran tactile.
Je ne vais pas développer ici, car ça a été un peu tordu à faire au début quand on est béotien comme moi en ce qui concerne les Device Trees, et qu’il faut intégrer le LCD et le pinmux des ports dont j’ai besoin.

Revenons à la partie OpenGL.
Donc après avoir téléchargé le dépot de Robert, il suffit de placer le répertoire SDK_BIN à un endroit qui vous convient. Je l’ai mis dans /Users/cedric/Development/BeagleBone dans mon cas.

La configuration pour pouvoir compiler Qt5

J’ai copié /Users/cedric/Qt/5.4/Src/qtbase/mkspecs/linux-arm-gnueabi-g++
vers : /Users/cedric/Qt/5.4/Src/qtbase/mkspecs/linux-arm-gnueabihf-g++

Le qmake.conf se retrouve être:

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabi-gcc
QMAKE_CXX               = arm-linux-gnueabi-g++
QMAKE_LINK              = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabi-objcopy
QMAKE_NM                = arm-linux-gnueabi-nm -P
QMAKE_STRIP             = arm-linux-gnueabi-strip
load(qt_config)

Ensuite, il faut créer un répertoire linux-beaglebone-g++ sous /Users/cedric/Qt/5.4/Src/qtbase/mkspecs/devices.

Le fichier qmake.conf contient:

#
# qmake configuration for the BeagleBoard and BeagleBoard xM boards
# http://beagleboard.org/

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)

load(device_config)

QT_QPA_DEFAULT_PLATFORM = eglfs

# cross compiler
CROSS_COMPILE		= /usr/local/linaro/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

SGX_SDK_ROOT	        = /Users/cedric/Development/BeagleBone/SDK_BIN/Graphics_SDK_setuplinux_5_01_01_01

# modifications to g++.conf
QMAKE_CC                = $${CROSS_COMPILE}gcc
QMAKE_CXX               = $${CROSS_COMPILE}g++
QMAKE_LINK              = $${QMAKE_CXX}
QMAKE_LINK_SHLIB        = $${QMAKE_CXX}

# modifications to linux.conf
QMAKE_AR                = $${CROSS_COMPILE}ar cqs
QMAKE_OBJCOPY           = $${CROSS_COMPILE}objcopy
QMAKE_NM                = $${CROSS_COMPILE}nm -P
QMAKE_STRIP             = $${CROSS_COMPILE}strip

COMPILER_FLAGS          = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard

#modifications to gcc-base.conf
QMAKE_CFLAGS           += $${COMPILER_FLAGS}
QMAKE_CXXFLAGS         += $${COMPILER_FLAGS}
QMAKE_CXXFLAGS_RELEASE += -O3

QMAKE_LIBS             += -lrt -lpthread -ldl

# Extra stuff (OpenGL, DirectFB, ...)
#QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/usr/include
#QMAKE_LIBDIR_EGL        = $$[QT_SYSROOT]/usr/lib

QMAKE_INCDIR_EGL = $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES2/SDKPackage/Builds/OGLES2/Include/
QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES2/SDKPackage/Builds/OGLES2/LinuxARMV7/Include/
QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/include/
QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/include/OGLES2/
QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/include/pvr2d/
QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES/SDKPackage/Builds/OGLES/Include/
QMAKE_LIBDIR_EGL = $$SGX_SDK_ROOT/gfx_dbg_es8.x/ 


QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}
QMAKE_LIBDIR_OPENVG     = $${QMAKE_LIBDIR_EGL}

QMAKE_LIBS_EGL          = -lEGL -lIMGegl -lsrv_um
QMAKE_LIBS_OPENGL_ES2   = -lGLESv2 $${QMAKE_LIBS_EGL}
QMAKE_LIBS_OPENVG       = -lOpenVG $${QMAKE_LIBS_EGL}

# Pour Tslib
QMAKE_INCDIR        += /usr/local/opt/qt5.4/tslib/include
QMAKE_LIBDIR        += /usr/local/opt/qt5.4/tslib/lib
QMAKE_LFLAGS        += -Wl,-rpath-link=/usr/local/opt/qt5.4/tslib/lib



# Sanity check
deviceSanityCheckCompiler()

load(qt_config)

et le fichier qplatformdefs.h contient uniquement:

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

Tout est prêt pour lancer la compilation de Qt5.

Voici le configure que j’ai utilisé:

./configure \
-opensource \
-confirm-license \
-prefix /usr/local/opt/qt5.4 \
-no-largefile \
-no-accessibility \
-qt-zlib \
-no-gif \
-qt-libpng \
-qt-libjpeg \
-no-nis \
-no-cups \
-xplatform linux-arm-gnueabihf-g++ \
-device linux-beaglebone-g++ \
-opengl es2 \
-no-xcb \
-no-wayland \
-nomake examples \
-nomake tests \
-release \
-make libs \
-skip qtwebkit \
-tslib \
-no-use-gold-linker

Si tout est correct, on peut y aller avec un make suivi d’un make install.

J’ai eu quelques déboires pour compiler ça correctement du premier coup, car il me sortait des erreurs plutot étranges sur le lQtDesigner5: « /usr/local/linaro/arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.1/../../../../arm-linux-gnueabihf/bin/ld.gold: error: cannot find -lQt5Designer »
La réponse se trouve en partie dans le -no-use-gold-linker, le gold linker étant apparu après le gcc 4.7, il me semble, et Qt veut absolument l’inclure même si il n’est pas supporté par la plateforme.
Et si vous tombez sur la même erreur, il faut modifier le Makefile dans ~/Qt/5.4/Src/qtquick1/src/declarative en supprimant tout lien avec Qt5Designer.

Pour l’envoyer sur le BBB:

cd /usr/local/opt/qt5.4/
tar czvf qt5.4.tar.gz lib plugins qml
scp qt5.4.tar.gz root@192.168.10.85:/usr/local/opt/qt5.4/

Sur le BBB:

cd /usr/local/opt/qt5.4/
tar zxvf qt5.4.tar.gz

Nous voilà avec Qt5.4 sur le BBB.

Une dernière chose pour la route.

Voici ce que j’ai sur mon BBB de test pour pouvoir utiliser l’écran tactile.
Fichier /etc/profile.d/TS_QT.sh:

export TSLIB_TSDEVICE=/dev/input/event2 # Choisir la bonne interface
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none

export QT_QPA_EGLFS_HIDECURSOR=1
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event2
#export QT_QPA_EGLFS_DISABLE_INPUT=1 #pour utiliser tslib avec program -plugin tslib

echo 0 > /sys/class/graphics/fbcon/cursor_blink

Note sur export QT_QPA_EGLFS_DISABLE_INPUT=1.
Cette ligne sert à désactiver le support interne de l’écran tactile et en lançant le programme suivi de -plugin tslib, on peut utiliser l’écran tactile en passant par la bibliothèque Tslib.
Cette variable va aussi désactiver la souris. Suivant ce que je veux faire, j’active cette variable ou pas.

 

, , , , , , , , , , ,

This article was written by Cédric

Menu