From a5f997a9c99b293a9c4b96a5f19e42154120fbc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volker=20Fr=C3=B6hlich?= Date: Fri, 28 Mar 2014 19:48:28 +0100 Subject: [PATCH] Fix ARM build --- qgis-2.2.0-arm-build.patch | 227 +++++++++++++++++++++++++++++++++++++ qgis.spec | 12 +- 2 files changed, 235 insertions(+), 4 deletions(-) create mode 100644 qgis-2.2.0-arm-build.patch diff --git a/qgis-2.2.0-arm-build.patch b/qgis-2.2.0-arm-build.patch new file mode 100644 index 0000000..11c2c73 --- /dev/null +++ b/qgis-2.2.0-arm-build.patch @@ -0,0 +1,227 @@ +From 03b028dbf7c66949a1365cb6a927874c1318840e Mon Sep 17 00:00:00 2001 +From: Bas Couwenberg +Date: Fri, 28 Mar 2014 10:37:13 +0100 +Subject: [PATCH 1/3] On armel/armhf qreal is typedef'ed to float not double. + +This patch adds qreal versions of some functions on arm. It was originally +writen by Konstantinos Margaritis and later fixed by Peter Michael Green. + +Bug-Debian: http://bugs.debian.org/691333 +--- + src/core/qgscoordinatetransform.cpp | 11 +++++++++++ + src/core/qgscoordinatetransform.h | 3 +++ + src/core/qgsmaptopixel.cpp | 9 +++++++++ + src/core/qgsmaptopixel.h | 3 +++ + 4 files changed, 26 insertions(+) + +diff --git a/src/core/qgscoordinatetransform.cpp b/src/core/qgscoordinatetransform.cpp +index 42427f9..58fb557 100644 +--- a/src/core/qgscoordinatetransform.cpp ++++ b/src/core/qgscoordinatetransform.cpp +@@ -434,6 +434,17 @@ void QgsCoordinateTransform::transformInPlace( + } + } + ++#ifdef QT_ARCH_ARM ++void QgsCoordinateTransform::transformInPlace( qreal& x, qreal& y, double& z, ++ TransformDirection direction ) const ++{ ++ double xd = (double) x, yd = (double) y; ++ transformInPlace(xd, yd, z, direction); ++ x=xd; ++ y=yd; ++} ++#endif ++ + #ifdef ANDROID + void QgsCoordinateTransform::transformInPlace( float& x, float& y, float& z, + TransformDirection direction ) const +diff --git a/src/core/qgscoordinatetransform.h b/src/core/qgscoordinatetransform.h +index df9c314..20bb04a 100644 +--- a/src/core/qgscoordinatetransform.h ++++ b/src/core/qgscoordinatetransform.h +@@ -156,6 +156,9 @@ class CORE_EXPORT QgsCoordinateTransform : public QObject + // and y variables in place. The second one works with good old-fashioned + // C style arrays. + void transformInPlace( double& x, double& y, double &z, TransformDirection direction = ForwardTransform ) const; ++#ifdef QT_ARCH_ARM ++ void transformInPlace( qreal& x, qreal& y, double &z, TransformDirection direction = ForwardTransform ) const; ++#endif + + //! @note not available in python bindings + void transformInPlace( QVector& x, QVector& y, QVector& z, +diff --git a/src/core/qgsmaptopixel.cpp b/src/core/qgsmaptopixel.cpp +index 6dff6f1..fab4848 100644 +--- a/src/core/qgsmaptopixel.cpp ++++ b/src/core/qgsmaptopixel.cpp +@@ -138,6 +138,14 @@ void QgsMapToPixel::transformInPlace( double& x, double& y ) const + y = yMax - ( y - yMin ) / mMapUnitsPerPixel; + } + ++#ifdef QT_ARCH_ARM ++void QgsMapToPixel::transformInPlace( qreal& x, qreal& y ) const ++{ ++ x = ( x - xMin ) / mMapUnitsPerPixel; ++ y = yMax - ( y - yMin ) / mMapUnitsPerPixel; ++} ++#endif ++ + void QgsMapToPixel::transformInPlace( QVector& x, + QVector& y ) const + { +@@ -161,3 +169,4 @@ void QgsMapToPixel::transformInPlace( QVector& x, + transformInPlace( x[i], y[i] ); + } + #endif ++ +diff --git a/src/core/qgsmaptopixel.h b/src/core/qgsmaptopixel.h +index fb3c317..8377282 100644 +--- a/src/core/qgsmaptopixel.h ++++ b/src/core/qgsmaptopixel.h +@@ -66,6 +66,9 @@ class CORE_EXPORT QgsMapToPixel + given coordinates in place. Intended as a fast way to do the + transform. */ + void transformInPlace( double& x, double& y ) const; ++#ifdef QT_ARCH_ARM ++ void transformInPlace( qreal& x, qreal& y ) const; ++#endif + + /* Transform device coordinates to map coordinates. Modifies the + given coordinates in place. Intended as a fast way to do the +-- +1.8.5.5 + + +From 7db6ae54124a2f2213c0609490904653c6c798af Mon Sep 17 00:00:00 2001 +From: Bas Couwenberg +Date: Fri, 28 Mar 2014 10:39:35 +0100 +Subject: [PATCH 2/3] Fix qreal vs double. + +In qt4 on arm architectures qreal is defined as float while on other +architectures it is defined as double. This can cause problems if qreal +and double are carelessly mixed. + +In this particular case the problem is that qMin/qMax are templates defined +to take two parameters of the same type. If two different types are passed +in then C++ can't resolve what type the template parameter should be and +bails out. The fix is simple, typecast one of the parameters so they +match. + +Author: Peter Michael Green +Bug-Debian: http://bugs.debian.org/737814 +--- + src/app/gps/qwtpolar-1.0/qwt_polar_curve.cpp | 2 +- + src/app/gps/qwtpolar-1.0/qwt_polar_layout.cpp | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/app/gps/qwtpolar-1.0/qwt_polar_curve.cpp b/src/app/gps/qwtpolar-1.0/qwt_polar_curve.cpp +index d63206a..7c18777 100644 +--- a/src/app/gps/qwtpolar-1.0/qwt_polar_curve.cpp ++++ b/src/app/gps/qwtpolar-1.0/qwt_polar_curve.cpp +@@ -433,7 +433,7 @@ void QwtPolarCurve::drawLines( QPainter *painter, + + if ( !clipRect.isEmpty() ) + { +- double off = qCeil( qMax( 1.0, painter->pen().widthF() ) ); ++ double off = qCeil( qMax((qreal)1.0,painter->pen().widthF() ) ); + clipRect = clipRect.toRect().adjusted( -off, -off, off, off ); + polyline = QwtClipper::clipPolygonF( clipRect, polyline ); + } +diff --git a/src/app/gps/qwtpolar-1.0/qwt_polar_layout.cpp b/src/app/gps/qwtpolar-1.0/qwt_polar_layout.cpp +index 1db2379..b4a43b0 100644 +--- a/src/app/gps/qwtpolar-1.0/qwt_polar_layout.cpp ++++ b/src/app/gps/qwtpolar-1.0/qwt_polar_layout.cpp +@@ -278,7 +278,7 @@ QRectF QwtPolarLayout::layoutLegend( Options options, QRectF &rect ) const + // We don't allow vertical legends to take more than + // half of the available space. + +- dim = qMin( hint.width(), rect.width() * d_data->legendRatio ); ++ dim = qMin( hint.width(), (qreal)(rect.width() * d_data->legendRatio) ); + + if ( !( options & IgnoreScrollbars ) ) + { +@@ -293,7 +293,7 @@ QRectF QwtPolarLayout::layoutLegend( Options options, QRectF &rect ) const + } + else + { +- dim = qMin( hint.height(), rect.height() * d_data->legendRatio ); ++ dim = qMin( hint.height(), (qreal)(rect.height() * d_data->legendRatio) ); + dim = qMax( dim, d_data->layoutData.legend.hScrollBarHeight ); + } + +-- +1.8.5.5 + + +From 3d44c5934aba0c4a1e0919549f50f1650140de57 Mon Sep 17 00:00:00 2001 +From: Bas Couwenberg +Date: Fri, 28 Mar 2014 10:41:22 +0100 +Subject: [PATCH 3/3] Disable features on ARM. + +Building QGIS on ARM produces the error: + +sip: qgis/python/core/qgsclipper.sip:44: \ +QgsClipper::trimFeature() unsupported function argument type - provide %MethodCode and a C++ signature + +For the Android builds this was fixed in commit 2cc684793ceb29d8600d71564fb38f92c998f588. + +This patch adapts the Android fix, by disabling the SIP features on all ARM systems. + +Bug-Debian: http://bugs.debian.org/737814 +--- + python/CMakeLists.txt | 5 +++++ + python/core/composer/qgscomposerscalebar.sip | 2 +- + python/core/qgsclipper.sip | 4 +++- + 3 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt +index 044f65e..158e4fa 100644 +--- a/python/CMakeLists.txt ++++ b/python/CMakeLists.txt +@@ -55,6 +55,11 @@ IF(NOT ANDROID) + SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} ANDROID) + ENDIF(NOT ANDROID) + ++IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") ++ELSE(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") ++ SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} ARM) ++ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") ++ + IF(NOT WITH_TOUCH) + SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} HAVE_TOUCH) + ENDIF(NOT WITH_TOUCH) +diff --git a/python/core/composer/qgscomposerscalebar.sip b/python/core/composer/qgscomposerscalebar.sip +index 727c10f..9a0e034 100644 +--- a/python/core/composer/qgscomposerscalebar.sip ++++ b/python/core/composer/qgscomposerscalebar.sip +@@ -109,7 +109,7 @@ class QgsComposerScaleBar: QgsComposerItem + of the segment + @note python bindings not available on android + */ +-%If (!ANDROID) ++%If (!ARM) + void segmentPositions( QList >& posWidthList ) const; + %End + +diff --git a/python/core/qgsclipper.sip b/python/core/qgsclipper.sip +index 847123c..90c920b 100644 +--- a/python/core/qgsclipper.sip ++++ b/python/core/qgsclipper.sip +@@ -1,3 +1,5 @@ ++%Feature ARM ++ + class QgsClipper + { + %TypeHeaderCode +@@ -34,7 +36,7 @@ class QgsClipper + // A handy way to refer to the four boundaries + enum Boundary {XMax, XMin, YMax, YMin}; + +-%If (!ANDROID) ++%If (!ARM) + // Trims the given feature to a rectangular box. Returns the trimmed + // feature in x and y. The shapeOpen parameter determines whether + // the function treats the points as a closed shape (polygon), or as +-- +1.8.5.5 + diff --git a/qgis.spec b/qgis.spec index e678a73..87c3668 100644 --- a/qgis.spec +++ b/qgis.spec @@ -19,7 +19,7 @@ Name: qgis Version: 2.2.0 -Release: 2%{?dist} +Release: 3%{?dist} Summary: A user friendly Open Source Geographic Information System Group: Applications/Engineering @@ -27,9 +27,6 @@ Group: Applications/Engineering License: GPLv3+ with exceptions URL: http://www.qgis.org -#TODO: There are build issues at the moment -ExcludeArch: armv7hl - Source0: http://qgis.org/downloads/%{name}-%{version}.tar.bz2 # The used sources were released as a tarball, the below is only for work in progress #git archive --format=tar --prefix=qgis-1.8.0/ master | bzip2 >../qgis-1.8.0.tar.gz @@ -56,6 +53,9 @@ Patch3: %{name}-2.2.0-sip.patch # https://github.com/qgis/QGIS/commit/afd667420a42cb257c6c4524290091663e21f3d6 Patch4: %{name}-2.2.0-show-license.patch +# https://github.com/qgis/QGIS/pull/1275.patch +Patch5: %{name}-2.2.0-arm-build.patch + # Some plug-ins need Pyspatialite (bundled) # The license is not totally clear, see: # http://code.google.com/p/pyspatialite/issues/detail?id=3 @@ -188,6 +188,7 @@ Please refer to %{name}-mapserver-README.fedora for details! %patch2 -p1 -b .httplib2~ %patch3 -p1 -b .sip~ %patch4 -p1 -b .license~ +%patch5 -p1 -b .arm-build~ # Readme file for QGIS mapserver configuration and Lighttpd example install -pm0644 %{SOURCE4} . @@ -396,6 +397,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %changelog +* Fri Mar 28 2014 Volker Fröhlich - 2.2.0-3 +- ARM build fix + * Sun Mar 16 2014 Rex Dieter 2.2.0-2 - rebuild (sip)