Con questo tutorial si intende fornire una lista di semplici passi per compilare ed installare Qt 4.6.2 su target ARM, per la precisione sulla scheda Friendly ARM Mini 2440 dotata di sistema Linux "embedded" (kernel 2.6.29) fornito dal costruttore.
La scheda in questione è abbastanza parca nella dotazione hardware il che non ci consente di utilizzare un tool di sviluppo installato direttamente su di essa, per cui siamo costretti a utilizzare un sistema operativo host su cui ricompilare Qt e successivamente installare le librerie risultanti sul target..
L'installazione qui proposta è stata verificata sui seguenti ambienti host:
Sono stati rilevati alcuni problemi con queste distribuzioni :
- Ubuntu 9.04
- Ubuntu 9.10
- OpenSUSE 11.2
Per prima cosa occorre procurarsi la toolchain GCC
http://www.friendlyarm.net/dl.php?file=arm-linux-gcc-4.3.2.tgz
A questo punto scompattiamo il file scaricato
tar -xzf arm-linux-gcc-4.3.2.tgz
e poi copiamo l'albero di files così creato, sotto
/usr/local/
Ricordiamoci l'export di questa nuova directory nel nostro PATH, per chi usa bash sarà ad esempio:
export PATH=/usr/lcal/arm/4.3.2/bin:$PATH
Scarichiamo ora Qt:
http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.2.tar.gz
e analogamente scompattiamo il file tar.gz in una directory temporanea (ad es /home/utente/)
A questo punto occorre, prima di procedere con il configure, informare Qt della nostra toolchain gcc. Più precisamente dovremo modificare il contenuto del file qmake.conf relativo al sistema operativo per cui vogliamo cross-compilare. In altre parole, usando un target linux per CPU ARM, dovremo cambiare il file
file: mkspecs/qws/linux-arm-g++/qmake.conf
riportando le seguenti modifiche:
commentiamo le linee
#QMAKE_CC = arm-linux-gcc
#QMAKE_CXX = arm-linux-g++
#QMAKE_LINK = arm-linux-g++
#QMAKE_LINK_SHLIB = arm-linux-g++
e sostituiamole con
QMAKE_CC = arm-none-linux-gnueabi-gcc
QMAKE_CXX = arm-none-linux-gnueabi-g++
QMAKE_LINK = arm-none-linux-gnueabi -g++
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++
commentiamo anche
#QMAKE_AR = arm-linux-ar cqs
#QMAKE_OBJCOPY = arm-linux-objcopy
#QMAKE_STRIP = arm-linux-strip
e rimpiazziamole con
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_RANLIB = arm-none-linux-gnueabi –ranlib
Queste modifiche consentono appunto di informare Qt circa la toolchain GCC, per la cross-compilazione su target ARM, che intendiamo usare.
Il file qmake.conf che abbiamo selezionato si trova sotto qws (la directory di spec riservata alle distribuzioni linux embedded).
Opzionalmente è possibile cambiare i flags di ottimizzazione del codice, io consiglio di disattivare l'ottimizzazione avendo riscontrato alcuni errori di "illegal instuction".
Per inibire l'ottimizzazione applicate la seguente modifica:
file: /mkspecs/common/g++.conf
QMAKE_CFLAGS_RELEASE += -O2
in
QMAKE_CFLAGS_RELEASE += -O0
A questo punto siamo pronti per compilare e installare Qt.
Apriamo una shell e lanciamo il seguente comando:
./configure -embedded arm -xplatform qws/linux-arm-g++ -prefix \
/usr/local/Qt -qt-mouse-tslib -little-endian -no-webkit -no-qt3support \
-no-cups -no-largefile -optimized-qmake -no-openssl -nomake tools
poi diventiamo root e lanciamo il comando make.
Se tutto è andato per il verso giusto e non si sono verificati errori durante la compilazione, ora avrete sulla vostra Fedora, o CentOS, le librerie Qt compatibili con una CPU ARM; installiamole quindi con il comando
make install.
Volendo, possiamo compilare un esempio tra quelli messi a disposizione da Nokia.
L'esempio verrà compilato sul nostro sistema host, per eseguirlo andrà passato sulla FriendlyARM su cui avremo impostato le seguenti variabili di ambiente:
export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/usr/input/ts
export TSLIB_CALIBFILE=/usr/etc/pointercal
export TSLIB_CONFFILE=/usr/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export LD_LIBRARY_PATH=/usr/local/Qt/lib
export QTDIR=/usr/local/Qt
export QWS_MOUSE_PROTO=tslib:/usr/input/ts
export QWS_DISPLAY=LinuxFB:mmWidth=310:mmHeight=190
Se l'esempio lo abbiamo compilato includendo staticamente le librerie Qt dovremmo vederlo girare senza intoppi perché le librerie saranno incluse nell'eseguibile, altrimenti dovremo installare sulla FriendlyArm anche le libreire Qt precedentemente compilate. Le librerie andranno installate
nella dir su cui punta LD_LIBRARY_PATH o nel path standard delle librerie cui punta linux del FriendlyARM.
Ricordiamoci di lanciare da linea di comando il nostro applicativo con l'opzione -qws, questo per informare Qt del fatto che verrà eseguito su un sistema Linux embedded.
Paolo Sereno
