Difference between revisions of "HowtoQt"
m |
|||
Line 45: | Line 45: | ||
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit. | The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit. | ||
− | There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. Without this file, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3. | + | There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. Without this file, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3. |
+ | |||
+ | Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain. | ||
+ | |||
+ | # Download the arm toolchain "Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux" from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 | ||
+ | # Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2''' | ||
+ | # Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include''' | ||
+ | |||
− | |||
* Need to check name | * Need to check name |
Revision as of 21:48, 7 February 2012
This document is not yet complete - stay tuned
Qt and QML on WebOS devices
This document explains how to set-up Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework) on WebOS devices, and then how to cross-compile Qt or QML apps.
This guide assumes:
- a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)
- Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)
- OpenSSH running on the webos device to scp files to it
The steps include:
- Getting and setting-up the Palm PDK
- Optionally: completing the PDK with some missing includes
- Getting Qt 4.8, setting it up for cross-compilation
- Cross-compilation of Qt 4.8
- Updated webos port of Qt
- Application tweaks to look for libs in the right places
1. Getting and setting up the Palm PDK
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.
Note that I haven't "fully" installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.
- Read about the Palm SDK 3.05 and the installation procedure. Follow the instructions on there. But essentially this boils down to:
- Download novacom from that page
- Download the SDK from that page
- Install novacom and the SDK following the instructions. I.e.:
- sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb
- sudo dpkg -i palm-novacom_1.0.80_i386.deb
- The SDK is now in /opt/PalmPDK
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):
- You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. /opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello
- You can copy this file to the usb drive on the device: scp hello root@ip.address.of.device:/media/internal
- You can go log on the device with novaterm: novaterm
- You can run your test program: /media/internal/hello
If that works then on to the next steps.
2. Optional: completing the PDK with some missing includes
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - /opt/PalmPDK/include/asm/hwcap.h (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. Without this file, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.
- Download the arm toolchain "Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux" from Mentor Graphics' website. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
- Untar this file: tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
- Copy the entire include/asm directory to the PalmPDK: cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include
* Need to check name * code sourcery's toolchain * which file where
3. Getting Qt 4.8, setting it up for cross-compilation
This step gets the Qt 4.8 sources.
- Cd to your home directory: cd ~
- Get the Qt 4.8 sources: http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz
- Untar: tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):
- Cd to the qws mkspecs: cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws
- The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: cp -r linux-arm-gnueabi-g++ linux-webos
- Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. vi ~/~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf
# # qmake configuration for building with arm-linux-g++ # #for 4.7.4: #include(../../common/g++.conf) #include(../../common/linux.conf) #include(../../common/qws.conf) # for 4.8 include(../../common/linux.conf) include(../../common/gcc-base-unix.conf) include(../../common/g++-unix.conf) include(../../common/qws.conf) # modifications to g++.conf #Toolchain #Base directory of gcc toolchain #GCCBASE = /opt/PalmPDK.441/arm-gcc/bin GCCBASE = /opt/PalmPDK.palm/arm-gcc/bin TSLIB_INCDIR = /opt/PalmPDK.palm/include TSLIB_LIBDIR = /opt/PalmPDK.palm/device/lib #TSLIB_INCDIR += $$GCCBASE #TSLIB_INCDIR += /opt/PalmPDK.palm/arm-gcc/sysroot/usr/include #Compiler Flags to take advantage of the ARM architecture #QMAKE_CFLAGS_RELEASE = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp #QMAKE_CFLAGS_RELEASE = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp #QMAKE_CFLAGS_RELEASE = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize -ffast-math -fsingle-precision-constant # ok below QMAKE_CFLAGS_RELEASE = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize QMAKE_CFLAGS_DEBUG = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp # Not ok on 4.3.3: mix of vfp and hard #QMAKE_CFLAGS_RELEASE = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard -ftree-vectorize #QMAKE_CFLAGS_RELEASE = -O0 -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_CXXFLAGS_RELEASE = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp #QMAKE_CXXFLAGS_RELEASE = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize -ffast-math -fsingle-precision-constant # ok below QMAKE_CXXFLAGS_RELEASE = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize QMAKE_CXXFLAGS_DEBUG = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp # Not ok on 4.3.3: mix of vfp and hard #QMAKE_CXXFLAGS_RELEASE = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard -ftree-vectorize #QMAKE_CXXFLAGS_RELEASE = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp # For official pdk QMAKE_CC = $$GCCBASE/arm-none-linux-gnueabi-gcc QMAKE_CXX = $$GCCBASE/arm-none-linux-gnueabi-g++ QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_SHLIB = $$QMAKE_CXX QMAKE_RANLIB = $$GCCBASE/arm-none-linux-gnueabi-ranlib #QMAKE_LINK = /opt/PalmPDK.palm/arm-gcc/bin/arm-none-linux-gnueabi-g++ #QMAKE_LINK_SHLIB = /opt/PalmPDK.palm/arm-gcc/bin/arm-none-linux-gnueabi-g++ #QMAKE_RANLIB = /opt/PalmPDK.palm/arm-gcc/bin/arm-none-linux-gnueabi-ranlib # modifications to linux.conf QMAKE_AR = $$GCCBASE/arm-none-linux-gnueabi-ar cqs QMAKE_OBJCOPY = $$GCCBASE/arm-none-linux-gnueabi-objcopy QMAKE_STRIP = $$GCCBASE/arm-none-linux-gnueabi-strip #QMAKE_AR = /opt/PalmPDK.palm/arm-gcc/bin/arm-none-linux-gnueabi-ar cqs #QMAKE_OBJCOPY = /opt/PalmPDK.palm/arm-gcc/bin/arm-none-linux-gnueabi-objcopy #QMAKE_STRIP = /opt/PalmPDK.palm/arm-gcc/bin/arm-none-linux-gnueabi-strip #QMAKE_CFLAGS_RELEASE += --sysroot=/opt/PalmPDK.palm/arm-gcc/sysroot #QMAKE_CXXFLAGS_RELEASE += --sysroot=/opt/PalmPDK.palm/arm-gcc/sysroot #QMAKE_CFLAGS_DEBUG += --sysroot=/opt/PalmPDK.palm/arm-gcc/sysroot #QMAKE_CXXFLAGS_DEBUG += --sysroot=/opt/PalmPDK.palm/arm-gcc/sysroot QMAKE_INCDIR = $$TSLIB_INCDIR QMAKE_LIBDIR = $$TSLIB_LIBDIR QMAKE_LIBS += -lrt -lz #QMAKE_LFLAGS += -Wl,--allow-shlib-undefined --sysroot=/opt/PalmPDK.palm/arm-gcc/sysroot QMAKE_LFLAGS += -Wl,--allow-shlib-undefined load(qt_config)
To do:
- V Get and untar the source
- Set-up the mkspecs
- Get the webos plugins/gfxdrivers -> credit original author -> link to the updated version
- modify the build stuff
- patch the transformed driver (?)
- ./configure command line
- make make install
- something on what's the outcome
3.x WebOS gfxdrivers
This step gets the WebOS Qt gfxdrivers plugin. The initial plugin version was written by Darron Black [1,2]. With the changes in WebOS 2.x an extended version is required that handles keyboard input for "non-root" users. That version is available from Qt gfxdrivers plugin for WebOS on Google Code.
- Cd to the gfxdrivers directory: cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers
- Get the WebOS gfxdrivers plugin: svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos
- Add to ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro the line: contains(gfx-plugins, webos) :SUBDIRS += webos
- ---------------------- patch transformed driver
4. apps
5. deploy
A. Links
[1] Qt on the Palm Pre [2] Qt port to webOS by Darron Black on gitorious