Building Qt for i.MX5x

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Building Qt for i.MX5x

32,221 Views
mdc
Contributor V
Hi,

I recently had the need to build Qt for the i.MX53 platform so thought I'd document the steps I had to go through here as had to jump through a few hoops to get it to build. If anyone has had similar experiences please share as I know some of the cross compilation difficulties can be somewhat host dependent.

This example has OpenGL ES support and runs under X11 via Xfbdev. Examples for building for OpenGL ES2.0 as well as OpenGL ES1.0 are given.

I borrowed heavily from the http://www.imxdev.org/wiki/index.php?title=All_Boards_Qt site, but I have fully documented the steps required here.

These instructions are based on the 11.03 Linux BSP, and the 4.7.2 release of Qt. 

HOST SETUP

My build system was an up to date ubuntu 10.10 (64-bit) machine. It is assumed the reader is familiar with how to use LTIB. Reference the "ltib_build_host_setup.pdf" file in the linuxdocs package in the latest BSP release for details on how to setup a host to build ltib, but the below shell script may be used to install required packages for an Ubuntu host.

# ---------------
#!/bin/bash
# Install packages needed by LTIB
sudo apt-get -y install gettext libgtk2.0-dev rpm bison m4 libfreetype6-dev
sudo apt-get -y install libdbus-glib-1-dev liborbit2-dev intltool
sudo apt-get -y install ccache ncurses-dev zlib1g zlib1g-dev gcc g++ libtool
sudo apt-get -y install uuid-dev liblzo2-dev
sudo apt-get -y install tcl dpkg
# Packages required for 64-bit Ubuntu
# Do "uname -a" and see if the word "x86_64" shows up.
if uname -a|grep -sq 'x86_64'; then
sudo apt-get -y install ia32-libs libc6-dev-i386 lib32z1
fi
# ---------------

For the host setup to build Qt, start by making sure all of the following packages are installed.

libx11-dev
libpng-dev
libjpeg-dev
libxext-dev
x11proto-xext-dev
qt3-dev-tools-embedded
libxtst-dev

I also installed the following packages mentioned at the bottom of http://trac.webkit.org/wiki/BuildingQtOnLinux when trying to fix various problems. Not sure if any of them are actually required, but shouldn't hurt.

$ sudo apt-get install bison flex libqt4-dev libqt4-opengl-dev libphonon-dev libicu-dev libsqlite3-dev libxext-dev libxrender-dev gperf libfontconfig1-dev libphonon-dev g++

Below is a dump of everything qt related I have installed on my host:

$ dpkg --get-selections | grep qt
libqt3-compat-headers            install
libqt3-headers                install
libqt3-mt                    install
libqt3-mt-dev                install
libqt4-dbus                    install
libqt4-declarative            install
libqt4-designer                install
libqt4-dev                    install
libqt4-help                    install
libqt4-network                install
libqt4-opengl                install
libqt4-opengl-dev                install
libqt4-qt3support                install
libqt4-script                install
libqt4-scripttools            install
libqt4-sql                    install
libqt4-sql-mysql                install
libqt4-svg                    install
libqt4-test                    install
libqt4-webkit                install
libqt4-xml                    install
libqt4-xmlpatterns            install
libqtcore4                    install
libqtgui4                    install
libqtwebkit-dev                install
libqtwebkit4                install
qt3-dev-tools                install
qt3-dev-tools-embedded            install
qt4-qmake                    install

BUILD LTIB

At the time of this writing, the latest BSP for the i.MX53 is 11.03.

This can be downloaded from Freescale's website here:

http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=i.MX535&fpsp=1&tab=Design_Tools_Tab

You'll want both the BSP source and the Multimedia codecs.

Build LTIB with the following packages included (just pick Min profile when initially running ltib config). Make sure to download and copy the multimedia codecs to /opt/freescale/pkgs, and check the patch that is also required for gst-fsl-plugin-1.9.8 in the 11.03 BSP release.

    * amd-gpu-x11-bin-mx51
    * libz160-bin
    * Freescale Multimedia Plugins/Codecs - fsl-mm-codec-libs & gstreamer-fsl-plugins
    * fontconfig
    * freetype
    * glib2
    * gstreamer
    * gstreamer-plugins-base
    * gstreamer-plugins-good
    * gstreamer-plugins-bad
    * gstreamer-plugins-ugly
    * Liberation fonts
    * libjpeg
    * libpng
    * liboil
    * libxml2
    * mysql
    * tslib
    * X11 (X.Org 7.5)
    * X11/libICE
    * X11/libSM
    * zlib

My ltib directory was at /home/matt/imx/mx53/11.03/ltib - make sure to modify the succeeding instructions accordingly based on where you install ltib on your system.

After you build ltib, cd to your ltib/rootfs/usr/lib directory and do the following:

sudo ln -s libgsl-fsl.so libgsl.so

After building ltib, make a symbolic link /tftpboot/ltib pointing to your rootfs folder. This is needed to make the i.MX libs and incs available to qmake.

$ ln -s <rootfs folder dir> /tftpboot/ltib

For my example:

$ ln -s /home/matt/imx/mx53/11.03/ltib/rootfs /tftpboot/ltib

The instructions at the imxdev site also recommend restarting the nfs server (below command). This is only needed if you're mounting your rootfs via NFS. This step has no impact on the Qt build. I typically copy my rootfs to an SD card, so I skip this step.

$ sudo /etc/init.d/nfs-kernel-server restart

RUN QMAKE AND BUILD QT

Download the latest qt-everywhere-opensource release from http://get.qt.nokia.com/qt/source

As of this writing the latest release is 4.7.2:

http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.2.tar.gz

Download and copy the qt-everywhere-opensource-src-4.7.2.tar.gz tar file to the directory where you'll build qt, and untar:

$ tar zxvf qt-everywhere-opensource-src-4.7.2.tar.gz

For the cross compiler path, after installing the 11.03 BSP release and running ltib, you should have this installed at /opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin. I put the full cross compile path in my qmake.conf as I would sometimes have problems during the Qt build without this. Hence you shouldn't need to export the cross compiler path.

Copy the attached mkspecs.mx5x.tar.gz to qt-everywhere-opensource-src-4.7.2
$ tar zxvf mkspecs.mx5x.tar.gz

This will put the qmake.conf at mkspecs/linux-g++-mx5x. Assuming you have the cross compiler installed in the default location noted above you shouldn't need to change anything in qmake.conf.

To build Qt with OpenGL ES2.0 support

$ ./configure -arch arm -xplatform linux-g++-mx5x -release -prefix /tftpboot/ltib/usr/local/Trolltech/Qt-4.7.2-mx5x-x11 -multimedia -phonon -phonon-backend -qt-gfx-linuxfb -qt-kbd-tty -little-endian -host-little-endian -fontconfig -sm -opengl es2

$ make

On my system, I had 3 spots where the build crashed. Not sure if this was specific to something on my system, or if something everyone will see. Bonus points for anyone who's able to figure these out.

Below are the signatures of the failures and how to get around them.

First crash:

make[1]: *** No rule to make target `../JavaScriptCore/release/libjscore.a', needed by `../../../../lib/libQtWebKit.so.4.7.2'.  Stop.
make[1]: Leaving directory `/home/matt/qt/target_builds/mx53/11.03/qt-everywhere-opensource-src-4.7.2/src/3rdparty/webkit/WebCore'
make: *** [sub-webkit-make_default-ordered] Error 2

To fix:

$ cd src/3rdparty/webkit/JavaScriptCore/release/
$ cp jscore. libjscore.a
$ cd -
$ make

Second crash:

/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/../lib/gcc/arm-fsl-linux-gnueabi/4.4.4/../../../../arm-fsl-linux-gnueabi/bin/ld: cannot find -lpnp_basictools
collect2: ld returned 1 exit status
make[3]: *** [plugandpaint] Error 1
make[3]: Leaving directory `/home/matt/qt/target_builds/mx53/11.03/qt-everywhere-opensource-src-4.7.2/examples/tools/plugandpaint'
make[2]: *** [sub-plugandpaint-make_default-ordered] Error 2
make[2]: Leaving directory `/home/matt/qt/target_builds/mx53/11.03/qt-everywhere-opensource-src-4.7.2/examples/tools'
make[1]: *** [sub-tools-make_default] Error 2
make[1]: Leaving directory `/home/matt/qt/target_builds/mx53/11.03/qt-everywhere-opensource-src-4.7.2/examples'
make: *** [sub-examples-make_default-ordered] Error 2

To fix:

$ cd examples/tools/plugandpaint/plugins/
$ cp pnp_basictools. libpnp_basictools.a
$ cd -
$ make

Third crash:

/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/../lib/gcc/arm-fsl-linux-gnueabi/4.4.4/../../../../arm-fsl-linux-gnueabi/bin/ld: cannot find -ldemo_shared
collect2: ld returned 1 exit status
make[2]: *** [deform] Error 1
make[2]: Leaving directory `/home/matt/qt/target_builds/mx53/11.03/qt-everywhere-opensource-src-4.7.2/demos/deform'
make[1]: *** [sub-deform-make_default] Error 2
make[1]: Leaving directory `/home/matt/qt/target_builds/mx53/11.03/qt-everywhere-opensource-src-4.7.2/demos'
make: *** [sub-demos-make_default-ordered] Error 2

To fix:

$ cd demos/shared/
$ cp demo_shared. libdemo_shared.a
$ cd -
$ make

After the make completes successfully, do the following to install Qt to your rootfs:

$ sudo make install

This will install to the directory you have defined in the -prefix switch when you ran configure. In my example this is /tftpboot/ltib/usr/local/Trolltech/Qt-4.7.2-mx5x-x11.

If you want the fluidlauncher demo (referenced later), you'll need to build and copy this manually to the rootfs. The following will do this as well as everything at demos/embedded:

$ cd qt-everywhere-opensource-src-4.7.2/demos/embedded
$ make
$ sudo make install
$ cd fluidlauncher
$ make
$ cd ..
$ sudo cp -r fluidlauncher /tftpboot/ltib/usr/local/Trolltech/Qt-4.7.2-mx5x-x11/demos/embedded

Not sure why make install doesn't work in the fluidlauncher demo, but copying the executable directly works fine.

Copy the libs from usr/local/Trolltech/Qt-target-version/lib/ to usr/lib/:

$ sudo cp -a /tftpboot/ltib/usr/local/Trolltech/Qt-target-version/lib/* /tftpboot/ltib/usr/lib/

In my example:

$ sudo cp -a /tftpboot/ltib/usr/local/Trolltech/Qt-4.7.2-mx5x-x11/lib/* /tftpboot/ltib/usr/lib/

Now the rootfs should be ready to either NFS mount, or copy to an SD card. See the instructions at the end of the setup for details on copying the bootloader, kernel, and rootfs to an SD card.

Starting QT Demos and Examples

Boot the i.MX53 board, then from the console, start X11 using the command:

export DISPLAY=:0.0
Xfbdev -mouse mouse,,device=/dev/input/mice -keybd keyboard,,/dev/input/event2 &

This will start X11 with USB mouse and keyboard support and return the command prompt.

There are several demos and examples on folder /usr/local/Trolltech/Qt-target-version. The demo below shows OpenGLES 2.0 functionality:

cd /usr/local/Trolltech/Qt-target-version/demos/pathstroke
./pathstroke

Another good one is the fluidlauncher demo at /usr/local/Trolltech/Qt-target-version/demos/embedded/fluidlauncher
./fluidlauncher

In some of the fluidlauncher demos (i.e., the Pathstroke and Qt magnifying glass), if you click on the window, you'll see an OpenGL button that enables/disables OpenGL. Note I was seeing some color issues with the below message in the console when I enabled OpenGL in the fluidlauncher demo. Need to try to figure this one out.

     Warning: EGL suggested using X Visual ID 33 (ARGB0565) for EGL config 15 (ARGB1555), but this is incompatable


To build Qt with OpenGL ES1.0 support

If you need OpenGL ES1.0 support (i.e. - if you have existing Qt OpenGL 1.0 apps that you want to test), everything is the same as what's described above, with a couple exceptions as described below.

The first thing you'll need to change is go to the qt-everywhere-opensource-src-4.7.2/mkspecs/linux-g++-mx5x directory, and you'll note there are separate qmake.conf files for OpenGL ES1 and ES2. The primary difference between these files is modifying QMAKE_LIBS to include either -lGLESv2, or -lGLESv1_CM (I had trouble getting OpenGL to work if both were included).

Also, when you run configure you'll set the -opengl switch to "es1" instead of "es2":

$ ./configure -arch arm -xplatform linux-g++-mx5x -release -prefix /tftpboot/ltib/usr/local/Trolltech/Qt-4.7.2-mx5x-x11 -multimedia -phonon -phonon-backend -qt-gfx-linuxfb -qt-kbd-tty -little-endian -host-little-endian -fontconfig -sm -opengl es1

$ make

You'll hit the same 3 build errors as when building for OpenGL ES2.0 that you'll work around the same way as described above.

Note there is one additional problem you'll hit when building with the "es1" switch you'll need to work around. The signature of this crash is as follows:

In file included from ../../include/QtOpenGL/private/qpaintengine_opengl_p.h:1,
                 from qpixmapdata_x11gl_egl.cpp:54:
../../include/QtOpenGL/private/../../../src/opengl/qpaintengine_opengl_p.h:150: error: 'GLenum' has not been declared
make[1]: *** [.obj/release-shared/qpixmapdata_x11gl_egl.o] Error 1
make[1]: Leaving directory `/home/matt/qt/target_builds/mx53/11.03/es1/qt-everywhere-opensource-src-4.7.2/src/opengl'
make: *** [sub-opengl-make_default-ordered] Error 2

To work around this, copy the attached qt_qpaintengine_gles1.patch to qt-everywhere-opensource-src-4.7.2 and apply:

$ patch -p1 <qt_qpaintengine_gles1.patch
patching file src/opengl/qpaintengine_opengl_p.h

This can be done before you run configure.

Prepping an SD card

This info is available in the linux BSP user's guide, but is included here for completeness. In the below example, /dev/sdx should be replaced by whatever the device note is for your SD card reader (do "dmesg" after you insert your SD card and that should tell you).

$ sudo umount /dev/sdx*
$ cd /tftpboot/ltib/boot/
$ sudo dd if=u-boot.bin of=/dev/sdx bs=512 && sync && sync
$ sudo dd if=uImage of=/dev/sdx bs=512 seek=2048 && sync && sync
$ sudo fdisk /dev/sdx
    Command (m for help): u
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First sector (62-7744511, default 62): 8192
    Last sector, +sectors or +size{K,M,G} (8192-7744511, default 7744511): (Just hit return, your ending sector may be different)
    Command (m for help): w
$ sudo mkfs.ext3 /dev/sdx1
$ sudo mkdir /media/sd_mount
$ sudo mount /dev/sdx1 /media/sd_mount
$ cd /tftpboot/ltib
$ sudo cp -rpa [A-z]* /media/sd_mount
$ sync
$ sync
$ sudo umount /dev/sdx*

The SD card should now be ready to boot.

Note you'll need to setup the u-boot environment variables the first time you boot so the kernel command line and various variables to set the display, etc... are set. This is going to be specific to the board you're using. Consult the BSP user's guide and release notes for your board for the specifics here. This procedure was tested on an MX53EVK (an early eval board), but no reason it shouldn't work with the MX53 Quick Start Board, MX53 Sabre Tablet, MX51EVK, or other MX5x platforms (assuming you build and setup u-boot properly for your board).

Original Attachment has been moved to: 802-mkspecs.mx5x.tar.gz

Original Attachment has been moved to: 803-qt_qpaintengine_gles1.patch

Tags (2)
88 Replies

2,646 Views
santiagoperez
Contributor I

Thansk Matthew. Old post but still very helpfull!

Just a question: is it necessary to install all the mentioned packages for the rootfs (e.g. mysql) to have OpenGL working on my GPU?. I'm trying to test the effect of the GPU on some QtDemos and own software with qcustomplot graphs.

Thanks in advance!

0 Kudos

2,646 Views
robertjohnson
Contributor I

I don't believe that's necessary

0 Kudos

2,646 Views
OtavioSalvador
Senior Contributor II

If LTIB is not required you can use Yocto for it. There are 4.7.4 and 4.8.1 Qt versions available on it.

Please check: Freescale/fsl-community-bsp-platform · GitHub

0 Kudos

2,646 Views
FranciscoCarril
Contributor V

Any plans to have QT5 up and running on yocto for i.mx6?

2,646 Views
OtavioSalvador
Senior Contributor II

Yes; we're working at Qt5 integration in Yocto and next step is integration in the meta-fsl-arm.  Any specific need? Our customers (of O.S. Systems) are still using Qt4 so we still do not have urgency for it.

2,646 Views
FranciscoCarril
Contributor V

Some customers have already started do migrate to qt5, and started asking about a guide to use it on iMX6,  it is possible to cross compile it manually, but using yocto is much easier I think.

2,646 Views
OtavioSalvador
Senior Contributor II

Yes; I agree that Yocto will make it easier; we will work on that as time permits. We already have a base work for Qt5 but we need to finish it for proper integration.

2,646 Views
kesavamoorthy
Contributor II

Is it possible to tell us when the meta-fsl-arm is going to be released with Qt5 support ?

0 Kudos

2,646 Views
OtavioSalvador
Senior Contributor II

No. We're working at Qt5 integration on Yocto itself. The integration to meta-fsl-arm should be trivial as soon as all is working in Yocto in general.

I couldn't invest much time on this yet as I am involved in other projects but when I have some free time I will look into it.

2,646 Views
kesavamoorthy
Contributor II

We already migrated to Qt5, manually did everything , works very well in iMX6. Just waiting for the Qt5 integration on yocto release

0 Kudos

2,646 Views
FranciscoCarril
Contributor V

Did you have any problems when running the hellogl2_demo  ?     In my case the openGL widget is overtaking all the screen and the qt native widget is hidden, I cannot see the buttons and the sliders.

The same happens with 2dpaint demo.

Can you run these demos successfully with openGL and native Widgets visible?

Error messages are:

This plugin does not support propagateSizeHints()

QOpenGLContext::swapBuffers() called with non-opengl surface

QOpenGLContext::swapBuffers() called with non-opengl surface

QOpenGLContext::swapBuffers() called with non-opengl surface

QOpenGLContext::swapBuffers() called with non-opengl surface

Francisco

0 Kudos

2,646 Views
rans
Senior Contributor I

Hello,

If I may please ask about this steps:

How is it that we build Qt using several libraries in host, while these same libraries are not installed in target( such as libsql etc)

It make me confused a bit. Not only that, but this libraries are intended for dynamic loading, not static.

Is there anyone who can shed some light on this ?

Regards,

Ran

0 Kudos

2,646 Views
OtavioSalvador
Senior Contributor II

Good; I am willing to work on that once I have a free time slot. Currently I am finishing some customer BSPs and demos, so I won't be able to work on that next days.

0 Kudos

2,646 Views
kesavamoorthy
Contributor II

Thanks for your reply . I am using this toolchain gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12 for manual cross compilation. I couldnt use this toolchain in yocto. Is there any specific configuration needed for this ? Could you share your points here?

0 Kudos

2,646 Views
OtavioSalvador
Senior Contributor II

You could use meta-toolchain-qt so you have a toolchain capable of building Qt apps as a start.

0 Kudos

2,646 Views
kesavamoorthy
Contributor II

Ok . How to replace the existing code sourcery toolchain available in yocto by our gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12 toolchain? How to tell to yocto? Actually i want to build some other packages like bluez , busybox ,etc by using our toolchain . Could you give some tips?

0 Kudos

2,646 Views
OtavioSalvador
Senior Contributor II

Yocto does build its own toolchain by default and does not use Linaro or Code Sourcery by default.

You can check poky - Poky Build Tool and Metadata it has a documentation about the variable to set; if your toolchain has no ready to use support you'll need to cook the configurations for it.    

0 Kudos

2,646 Views
kesavamoorthy
Contributor II

Yes you are right .. Yocto is building its own toolchain. But when we have prebuilt toolchain , then we can directly replace it right? I have tried to replace my toolchain gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12 ,but not succedded.

0 Kudos

2,646 Views
OtavioSalvador
Senior Contributor II

Yes you can. Check my previous answer in the link. It has some basic documentation how it can be done.

0 Kudos

2,646 Views
kesavamoorthy
Contributor II

Hi,

1. I have added my toolchain in yocto and the package external-toolchain-sourcery compiled successfully. I could able to compile the packages successfully by using my toolchain. Thank you

2. Now i need to compile Qt5 by using yocto . I tried with meta-qt5 which is released by meta-oe. But not succedded. Could you please share some more points ? Can i add meta data for Qt5 for meta-fsl-arm on my own?

0 Kudos