Building Qt for i.MX5x

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

Building Qt for i.MX5x

35,865 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

679 Views
G_rio
Contributor III

Hi,

 

I tried to install QT 4.7.3 but i got this warning

 

The OpenGL ES 2.0 functionality test failed!
 You might need to modify the include and library search paths by editing
 QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in
 /home/gorio/Downloads/QT/Embedded/qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-mxc-g++

 

Could someone help me to fix it ?

Thank you

0 Kudos
Reply

679 Views
mdc
Contributor V
Just FYI - I tested the Qt cross compilation flow I originally posted on an Ubuntu 10.10 32-bit install and got the exact same errors as on my 64-bit machine. Now building Qt in ltib with the patches Vladan posted to see if any difference.
0 Kudos
Reply

679 Views
mdc
Contributor V

Hi Vladan,

 

Good question. I've got a 32-bit 10.10 host as well at home that I'll trying building on and see if I get the same errors.

 

Thanks for posting your ltib patches as well. I'll give that a try and see how it goes.

0 Kudos
Reply

679 Views
VladanJovanovic
NXP Employee
NXP Employee

I'm surprised with all the error messages you got when cross-compiling.I wonder if it's due to using 64-bit machine?

 

I posted patches I use when building Qt 4.7.2 release, would be interesting to hear how building goes with those...

0 Kudos
Reply

679 Views
mdc
Contributor V

And for the ambitious, it is also possible to build Qt natively on an i.MX5x board running the Ubuntu image. I started out trying to cross compile against the lucid rootfs that I copied to my host, but ran into either compiler or library mismatches that I wasn't able to solve, so decided to try building on the board itself.

 

I was able to build using the below steps on an MX53evk, using the 11.01 kernel and associated .debs, and the lucid rootfs. Again, no reason this shouldn't work on an MX53 quick start board or MX51evk (and with the latest 11.03 BSP).

 

A couple things to keep in mind if anyone tries this:

  • You'll need at least an 8Gig SD card (you'll run out of space with only 4Gig).
  • It will take forever to build. A typical cross-compiled Qt build from scratch running on my 2.8GHz Core i7 Host (native linux, not vmware) takes between 2-3 hours. On an 800MHz mx53evk, it took about 2 days to get through everything. For those of you that have gotten a SATA drive working with the MX53 QSB, this will likely speed things up considerably.

Started by bringing the lucid rootfs up to date:

 

sudo apt-get install update

sudo apt-get install -u upgrade

 

Install necessary packages:

 

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

 

sudo apt-get install libmysqlclient-dev

sudo apt-get install libgstreamer0.10-plugins-good sudo apt-get install libgstreamer0.10-plugins-bad sudo apt-get install libgstreamer0.10-plugins-ugly sudo apt-get install libts-dev

 

In qmake.conf, remove -lxcb-xlib from QMAKE_LIBS as it appears to be depracated in lucid. See the attached mkspecs.mx5x.native.tar.gz which has this taken care of and has the toolchain paths adjusted. Again, there are versions of qmake.conf for both OpenGL ES1 and ES2.

 

cd /usr/lib

ln -s libgsl-fsl.so libgsl.so

 

When building on the board, I think I still got the 3 static lib errors described in the post above, but can't recall for sure (still need to re-verify this with the MX53 QSB and 11.03). In any event, if you get these, just use the same workarounds described above to get around them.

 

If building with OpenGL ES1 support, you'll definitely still get the qpaintengine_opengl_p.h problem, and you'll want to apply the patch in the above post.

 

You'll also run into one additional problem, the signature will be something along the lines of:

 

    Error about "selected processor does not support `swp r1,r2,[r3]`

 

This is due to a known bug, see:

 

https://bugs.launchpad.net/ubuntu/+source/qt4-x11/+bug/490371

 

To work around this, apply the attached patch (armv7-thumb.patch) from the top level qt-everywhere-opensource-src-4.7.2 directory:


patch -p1 <armv7-thumb.patch

cd src/corelib/arch

cp qatomic_armv6.h qatomic_arm.h

cd ../../..


Apply the patches before running configure as described in the above post. When running configure you'll want to make sure the -prefix switch is modified to account for the native path. See below for the example from my run:

 

$ ./configure -arch arm -xplatform linux-g++-mx5x -release -prefix /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

 

After running make and make install as described above, you'll also need to copy the Qt libs to /usr/lib - example below:

 

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

 

After this you should be able to run any of the demos or examples you built in a similar fashion to that described in the above post.

0 Kudos
Reply