-
Update for Qt 5.3.2: https://blog.idv-tech.com/2014/10/15/building-and-configuring-qt5-tslib-and-evtest-for-arm-xilinx-zynq/.
- Download and extract Qt everywhere sources to your home/Download directory:
wget http://download.qt-project.org/official_releases/qt/5.2/5.2.1/single/qt-everywhere-opensource-src-5.2.1.tar.gz
tar -zxvf qt-everywhere-opensource-src-5.2.1.tar.gz - Qt5 don't yet support Zynq device, so we need to add it. You can download and extract prepared files(linux-arm-xilinx-zynq-g++.tar.gz) to 'qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/devices/linux-arm-xilinx-zynq-g++' folder. Or you create files yourself:
- In a 'qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/devices' create new folder named 'linux-arm-xilinx-zynq-g++'.
- In a 'linux-arm-xilinx-zynq-g++' create 'qmake.conf' file:
# # qmake configuration for linux-g++ using arm-xilinx-g++ compiler # MAKEFILE_GENERATOR = UNIX CONFIG += incremental gdb_dwarf_index 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 = linuxfb # 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 QMAKE_CFLAGS += -I$$[QT_SYSROOT]/include -DZYNQ QMAKE_CXXFLAGS += -Wno-psabi -I$$[QT_SYSROOT]/include -DZYNQ QMAKE_LFLAGS += -L$$[QT_SYSROOT]/lib QMAKE_CFLAGS += -march=armv7-a -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon -pipe -fomit-frame-pointer QMAKE_CXXFLAGS += $$QMAKE_CFLAGS deviceSanityCheckCompiler() load(qt_config)
- And also 'qplatformdefs.h' file:
- QT_QPA_DEFAULT_PLATFORM variable set to Linux Framebuffer and if your hardware design supports something else you may want to change it. Or you can always control it thru QT_QPA_PLATFORM env. variable and leave default to simplest 'linuxfb'. You may also want to modify CFLAGS and CXXFLAGS here.
- Set CROSS_COMPILE variable and source Xilinx tools settings:
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
source /opt/Xilinx/Vivado/2013.4/settings64.sh - Now we can run Qt 'configure' utility, Below, configuration from my building script. Notice I disabled OpenGL ES support since my hardware don't have it yet, but your might, so you may want to include egl support.
- Configure will build 'qmake' first and generate 'Makefiles' for all the components. Check your output in details and verify it match your configuration. Below output in my case:
- Build and install Qt. It will be installed in a directory you set as a prefix during configuration.
cd qt-everywhere-opensource-src-5.2.1/qtbase/
gmake & gmake install - Now, lets add Qt libraries and couple of Qt example binaries to PetaLinux project. Go to your PetaLinux project directory and create Qt component using 'libs' template.
petalinux-create -t libs -n qt-5.2.1 --enable
- We don't need template created files, so delete them.
cd components/libs/qt-5.2.1/
rm libqt* - Copy prebuilt Qt library files to 'lib' subdirectory, qt fonts and plugin directories also to 'lib' and a couple of Qt examples to 'bin' subdirectory:
cp -Pr /opt/Qt/5.2.1/lib .
cp -Pr /opt/Qt/5.2.1/plugins/ ./lib/
mkdir bin
cp /opt/Qt/5.2.1/examples/widgets/painting/pathstroke/pathstroke bin/pathstroke
cp /opt/Qt/5.2.1/examples/widgets/mainwindows/mainwindow/mainwindow bin/mainwindow - We also have to set a few enviromental variables on a target rootfs, so lets create 'profile.qt-5.2.1' file. Last one is for 'tslib', so if you don't use it you may delete it. Also, depending on your setup - you may need to change this or add other variables here.
- Now we have to modify our PetaLinux component Makefile. We got nothing to build, but need to install our Qt5 library files to target rootfs.
- Last configuration step is to include 'libstdc++6' to target rootfs, since Qt is a C++ library and depends on it.
petalinux-config -c rootfs
Then go to 'Filesystem Packages' -> 'Base' -> 'External-xilinx-toolchain' -> Enable 'libstdc++6'.
- Thats it. Rebuild PetaLinux project, transfer image.ub file to SD card. Qt5 library will add about 20M to image size, so it may not fit into reserved space and you may need to adjust appropriate u-boot variable (loadaddr, netstart...). After boot you we can run 'pathstroke' and 'mainwindow' Qt example apps.
This is a small how-to build latest Qt 5.2.1 for Zynq and use it with PetaLinux 2013.10 projects. I'm using 64 bit Ubuntu 13.10 as a host, with Xilinx Vivado 2013.4 and ZedBoard
'Rev. D' as a target. If this howto works for you, especially if you using it on other boards please let me know, so I can push to Qt Zynq support changes.
/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the qmake spec of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "../../linux-g++/qplatformdefs.h"
./configure -prefix /opt/Qt/5.2.1 \ -device linux-arm-xilinx-zynq-g++ \ -device-option CROSS_COMPILE=arm-xilinx-linux-gnueabi- \ -release \ -no-qml-debug \ -reduce-relocations \ -qt-zlib \ -qt-libpng \ -qt-libjpeg \ -qt-freetype \ -qt-harfbuzz \ -qt-pcre \ -no-xcb \ -qt-xkbcommon \ -no-opengl \ -no-eglfs \ -no-kms \ -confirm-license \ -opensource \ -no-icu \ -no-pch \ -verbose
Configure summary Building on: linux-g++ (x86_64, CPU features: mmx sse sse2) Building for: devices/linux-arm-xilinx-zynq-g++ (arm, CPU features: neon) Platform notes: - Also available for Linux: linux-kcc linux-icc linux-cxx qmake vars .......... styles += mac fusion windows DEFINES += QT_NO_MTDEV DEFINES += QT_NO_LIBUDEV DEFINES += QT_NO_XCB sql-drivers = sql-plugins = sqlite qmake switches ......... Build options: Configuration .......... accessibility audio-backend c++11 clock-gettime clock-monotonic compile_examples concurrent cross_compile evdev eventfd freetype full-config getaddrinfo getifaddrs harfbuzz iconv inotify ipv6ifname large-config largefile linuxfb medium-config minimal-config mremap neon nis no-pkg-config pcre png posix_fallocate qpa qpa reduce_exports reduce_relocations release rpath shared small-config xkbcommon-qt zlib Build parts ............ libs examples Mode ................... release Using C++11 ............ yes Using PCH .............. no Target compiler supports: iWMMXt/Neon .......... no/yes Qt modules and options: Qt D-Bus ............... no Qt Concurrent .......... yes Qt GUI ................. yes Qt Widgets ............. yes JavaScriptCore JIT ..... yes (To be decided by JavaScriptCore) QML debugging .......... no Use system proxies ..... no Support enabled for: Accessibility .......... yes ALSA ................... no CUPS ................... no FontConfig ............. no FreeType ............... qt HarfBuzz ............... qt Iconv .................. yes ICU .................... no Image formats: GIF .................. yes (plugin, using bundled copy) JPEG ................. yes (plugin, using bundled copy) PNG .................. yes (in QtGui, using bundled copy) Glib ................... no GTK theme .............. no Large File ............. yes mtdev .................. no Networking: getaddrinfo .......... yes getifaddrs ........... yes IPv6 ifname .......... yes OpenSSL .............. no NIS .................... yes OpenGL ................. no OpenVG ................. no PCRE ................... yes (bundled copy) pkg-config ............. no PulseAudio ............. no QPA backends: DirectFB ............. no EGLFS ................ no KMS .................. no LinuxFB .............. yes XCB .................. no Session management ..... yes SQL drivers: DB2 .................. no InterBase ............ no MySQL ................ no OCI .................. no ODBC ................. no PostgreSQL ........... no SQLite 2 ............. no SQLite ............... yes (plugin, using bundled copy) TDS .................. no udev ................... no xkbcommon .............. yes (bundled copy) zlib ................... yes (bundled copy) NOTE: Qt is using double for qreal on this system. This is binary incompatible against Qt 5.1. Configure with '-qreal float' to create a build that is binary compatible with 5.1. Info: creating cache file /home/d9/Projects/qt5_build_test/qt-everywhere-opensource-src-5.2.1/qtbase/.qmake.cache Qt is now configured for building. Just run 'gmake'. Once everything is built, you must run 'gmake install'. Qt will be installed into /opt/Qt/5.2.1 Prior to reconfiguration, make sure you remove any leftovers from the previous build.
export QT_PLUGIN_PATH=/usr/lib/plugins export QT_QPA_FONTDIR=/usr/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/plugins/platforms export QT_QPA_PLATFORM=linuxfb export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0
ifndef PETALINUX $(error "Error: PETALINUX environment variable not set. Try to source the settings.sh file") endif include libs.common.mk LIB=libqt_5_2_1 all: build install .PHONY: build build: install: #Install libraries and fonts to the rootfs. mkdir -p $(TARGETDIR)/usr/lib USER=your_user_name GROUP=your_user_group rsync -rav ./bin/* $(TARGETDIR)/usr/bin/ rsync -rav ./lib/* $(TARGETDIR)/usr/lib/ #Install the script to ensure the font directory is properly specified. mkdir -p $(TARGETDIR)/etc/profile.d cp profile.qt-5.2.1 $(TARGETDIR)/etc/profile.d/profile.qt-5.2.1 clean: