[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#735488: qt4-x11: Add arm64 support



Source: qt4-x11
Version: 4.8.5
Severity: normal
Tags: patch
User: debian-arm@lists.debian.org
Usertag: arm64

This package fails to build on arm64 without this patch. It is largely
based on the ubuntu patches in  4:4.8.4+dfsg-0ubuntu15,
4:4.8.4+dfsg-0ubuntu17, and the important fix in
4:4.8.4+dfsg-0ubuntu18), but has a few changes.

1) It uses autotools-dev and the dh_ helpers to ensure config.{sub,guess}
are up to date rather than patching them directly. This is cleaner, will
keep working in the future, and allows rebuilds as the clean target works
correctly.

2) It uses linux-g++ PLATFORM and adds the -fpermissive CFLAG to enable
it to build rather than defining a new almost-identical
linux-g++-aarch64 PLATFORM because that seems to be unnecessary and less
clean. However I am no QT expert so there may be a good reason for doing
it the other way. I have left that definition file in so you can see
what was done, but so far as I can see the linux-g++ definitions are
correct. A look at why -fpermissive is needed might be a good thing, but
is beyond my ken.

3) The ubuntu patch disabled the docs build, but that is now working
correctly so no need for that any more.

This is obviously an important package in the bootstrap so I hope this
patch can go in the archive reasonably soon. Obviously I am happy to
answer questions  if you have any queries about what is correct for the
arm64/aarch64 build.


-- System Information:
Debian Release: 7.3
  APT prefers stable
  APT policy: (990, 'stable')
Architecture: i386 (i686)

Kernel: Linux 3.2.0-kvm-i386-20110111 (SMP w/1 CPU core)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
diff -Nru qt4-x11-4.8.5+git192-g085f851+dfsg/debian/changelog qt4-x11-4.8.5+git192-g085f851+dfsg/debian/changelog
--- qt4-x11-4.8.5+git192-g085f851+dfsg/debian/changelog	2013-12-06 19:38:48.000000000 +0000
+++ qt4-x11-4.8.5+git192-g085f851+dfsg/debian/changelog	2063-04-30 00:08:35.000000000 +0000
@@ -1,3 +1,9 @@
+qt4-x11 (4:4.8.5+git192-g085f851+dfsg-2arm64) unstable; urgency=low
+
+  * Add arm64/aarch64 support
+
+ --  <wookey@linaro.org>  Mon, 30 Apr 2063 00:00:20 +0000
+
 qt4-x11 (4:4.8.5+git192-g085f851+dfsg-2) unstable; urgency=low
 
   * Fix typo created when refreshing a patch for s390x which created a FTBFS.
diff -Nru qt4-x11-4.8.5+git192-g085f851+dfsg/debian/control qt4-x11-4.8.5+git192-g085f851+dfsg/debian/control
--- qt4-x11-4.8.5+git192-g085f851+dfsg/debian/control	2013-10-11 23:49:32.000000000 +0000
+++ qt4-x11-4.8.5+git192-g085f851+dfsg/debian/control	2063-04-30 00:53:04.000000000 +0000
@@ -9,6 +9,7 @@
            Lisandro Damián Nicanor Pérez Meyer <lisandro@debian.org>,
            Timo Jyrinki <timo@debian.org>
 Build-Depends: debhelper (>= 9),
+	       autotools-dev,
                dpkg-dev (>= 1.16.1),
                firebird-dev [amd64 armel i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 sh4 sparc],
                flex,
diff -Nru qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64.patch qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64.patch
--- qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64.patch	1970-01-01 00:00:00.000000000 +0000
+++ qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64.patch	2063-04-30 01:11:32.000000000 +0000
@@ -0,0 +1,653 @@
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/configure
+===================================================================
+--- qt4-x11-4.8.5+git192-g085f851+dfsg.orig/configure	2063-04-29 23:57:10.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/configure	2063-04-29 23:57:10.000000000 +0000
+@@ -264,6 +264,9 @@
+ 	armhf)
+ 		UNAME_MACHINE="armv6"
+ 	;;
++	arm64)
++		UNAME_MACHINE="aarch64"
++	;;
+ 	hppa)
+ 		UNAME_MACHINE="parisc"
+ 	;;
+@@ -2856,6 +2859,9 @@
+             *86_64)
+                 PLATFORM=qws/linux-x86_64-g++
+                 ;;
++            aarch64)
++                PLATFORM=linux-g++-aarch64
++                ;;
+             *)
+                 PLATFORM=qws/linux-generic-g++
+                 ;;
+@@ -3294,6 +3300,12 @@
+             echo "    ARM (arm)"
+         fi
+         CFG_HOST_ARCH=arm
++	;;
++    *:*:aarch64*)
++        if [ "$OPT_VERBOSE" = "yes" ]; then
++            echo "    AArch64 (aarch64)"
++        fi
++        CFG_HOST_ARCH=aarch64
+         ;;
+     Linux:*:sparc*)
+         if [ "$OPT_VERBOSE" = "yes" ]; then
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/mkspecs/linux-g++-aarch64/qmake.conf
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/mkspecs/linux-g++-aarch64/qmake.conf	2063-04-29 23:57:10.000000000 +0000
+@@ -0,0 +1,28 @@
++#
++# qmake configuration for linux-g++
++#
++# Written for GNU/Linux platforms that have both lib and lib64 directories,
++# like the AMD Opteron.
++#
++
++MAKEFILE_GENERATOR	= UNIX
++TARGET_PLATFORM		= unix
++TEMPLATE		= app
++CONFIG			+= qt warn_on release incremental link_prl gdb_dwarf_index
++QT			+= core gui
++QMAKE_INCREMENTAL_STYLE = sublib
++
++QMAKE_CFLAGS		= -fpermissive
++QMAKE_LFLAGS		=
++
++QMAKE_CFLAGS_RELEASE   += -O2
++
++include(../common/linux.conf)
++include(../common/gcc-base-unix.conf)
++include(../common/g++-unix.conf)
++
++
++QMAKE_LIBDIR_X11      = /usr/X11R6/lib64
++QMAKE_LIBDIR_OPENGL   = /usr/X11R6/lib64
++
++load(qt_config)
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/mkspecs/linux-g++-aarch64/qplatformdefs.h
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/mkspecs/linux-g++-aarch64/qplatformdefs.h	2063-04-29 23:57:10.000000000 +0000
+@@ -0,0 +1,42 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 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"
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h
+===================================================================
+--- qt4-x11-4.8.5+git192-g085f851+dfsg.orig/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h	2063-04-29 23:57:10.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h	2063-04-29 23:58:18.000000000 +0000
+@@ -238,6 +238,11 @@
+ 
+ #endif
+ 
++/* CPU(AARCH64) - AArch64 */
++#if defined(__aarch64__)
++#define WTF_CPU_AARCH64 1
++#endif
++
+ #define WTF_ARM_ARCH_AT_LEAST(N) (CPU(ARM) && WTF_ARM_ARCH_VERSION >= N)
+ 
+ /* Set WTF_ARM_ARCH_VERSION */
+@@ -907,7 +912,7 @@
+ #endif
+ 
+ #if !defined(WTF_USE_JSVALUE64) && !defined(WTF_USE_JSVALUE32) && !defined(WTF_USE_JSVALUE32_64)
+-#if (CPU(X86_64) && (OS(UNIX) || OS(WINDOWS) || OS(SOLARIS) || OS(HPUX))) || (CPU(IA64) && !CPU(IA64_32)) || CPU(ALPHA) || CPU(AIX64) || CPU(SPARC64) || CPU(MIPS64) || CPU(S390X)
++#if (CPU(X86_64) && (OS(UNIX) || OS(WINDOWS) || OS(SOLARIS) || OS(HPUX))) || (CPU(IA64) && !CPU(IA64_32)) || CPU(ALPHA) || CPU(AIX64) || CPU(SPARC64) || CPU(MIPS64) || CPU(S390X) || CPU(AARCH64)
+ #define WTF_USE_JSVALUE64 1
+ #elif CPU(ARM) || CPU(PPC64)
+ #define WTF_USE_JSVALUE32 1
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h
+===================================================================
+--- qt4-x11-4.8.5+git192-g085f851+dfsg.orig/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h	2063-04-29 23:57:10.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h	2063-04-29 23:57:10.000000000 +0000
+@@ -365,10 +365,15 @@
+ 
+ #endif /* ARM */
+ 
+-#if CPU(ARM) || CPU(MIPS) || CPU(SH4)
++#if CPU(ARM) || CPU(MIPS) || CPU(SH4) || CPU(AARCH64)
+ #define WTF_CPU_NEEDS_ALIGNED_ACCESS 1
+ #endif
+ 
++/* CPU(AARCH64) - Aarch64 */
++#if defined(__aarch64__)
++#define WTF_CPU_AARCH64 1
++#endif
++
+ /* ==== OS() - underlying operating system; only to be used for mandated low-level services like 
+    virtual memory, not to choose a GUI toolkit ==== */
+ 
+@@ -998,7 +1003,8 @@
+     || CPU(ALPHA) \
+     || CPU(SPARC64) \
+     || CPU(S390X) \
+-    || CPU(PPC64)
++    || CPU(PPC64) \
++    || CPU(AARCH64)
+ #define WTF_USE_JSVALUE64 1
+ #else
+ #define WTF_USE_JSVALUE32_64 1
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/aarch64/arch.pri
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/aarch64/arch.pri	2063-04-29 23:57:10.000000000 +0000
+@@ -0,0 +1,4 @@
++#
++# AArch64 architecture
++#
++SOURCES += $$QT_ARCH_CPP/qatomic_aarch64.cpp
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/aarch64/qatomic_aarch64.cpp
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/aarch64/qatomic_aarch64.cpp	2063-04-29 23:57:10.000000000 +0000
+@@ -0,0 +1,70 @@
++/****************************************************************************
++**
++** Copyright (C) 2012, 2013 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the QtCore module 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 <QtCore/qglobal.h>
++
++#include <unistd.h>
++#ifdef _POSIX_PRIORITY_SCHEDULING
++# include <sched.h>
++#endif
++#include <time.h>
++
++QT_BEGIN_NAMESPACE
++
++QT_USE_NAMESPACE
++
++Q_CORE_EXPORT void qt_atomic_yield(int *count)
++{
++#ifdef _POSIX_PRIORITY_SCHEDULING
++    if((*count)++ < 50) {
++        sched_yield();
++    } else
++#endif
++    {
++        struct timespec tm;
++        tm.tv_sec = 0;
++        tm.tv_nsec = 2000001;
++        nanosleep(&tm, NULL);
++        *count = 0;
++    }
++}
++
++QT_END_NAMESPACE
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/arch.pri
+===================================================================
+--- qt4-x11-4.8.5+git192-g085f851+dfsg.orig/src/corelib/arch/arch.pri	2063-04-29 23:57:10.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/arch.pri	2063-04-29 23:57:10.000000000 +0000
+@@ -31,7 +31,9 @@
+                        arch/qatomic_s390.h \
+                        arch/qatomic_x86_64.h \
+                        arch/qatomic_sh.h \
+-                       arch/qatomic_sh4a.h
++                       arch/qatomic_sh4a.h \
++                       arch/qatomic_aarch64.h \
++
+ 
+ QT_ARCH_CPP = $$QT_SOURCE_TREE/src/corelib/arch/$$QT_ARCH
+ DEPENDPATH += $$QT_ARCH_CPP
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/qatomic_aarch64.h
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/qatomic_aarch64.h	2063-04-30 00:50:49.000000000 +0000
+@@ -0,0 +1,335 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the QtCore module 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$
++**
++****************************************************************************/
++
++#ifndef QATOMIC_AARCH64_H
++#define QATOMIC_AARCH64_H
++
++QT_BEGIN_HEADER
++
++QT_BEGIN_NAMESPACE
++
++#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isReferenceCountingNative()
++{ return true; }
++inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isTestAndSetNative()
++{ return true; }
++inline bool QBasicAtomicInt::isTestAndSetWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isFetchAndStoreNative()
++{ return true; }
++inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isFetchAndAddNative()
++{ return true; }
++inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
++{ return true; }
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
++{ return true; }
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
++{ return true; }
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
++{ return false; }
++
++#ifndef Q_DATA_MEMORY_BARRIER
++# define Q_DATA_MEMORY_BARRIER asm volatile("dmb sy\n":::"memory")
++#endif
++#ifndef Q_COMPILER_MEMORY_BARRIER
++# define Q_COMPILER_MEMORY_BARRIER asm volatile("":::"memory")
++#endif
++
++inline bool QBasicAtomicInt::ref()
++{
++    int newValue;
++
++    Q_COMPILER_MEMORY_BARRIER;
++    newValue = __atomic_add_fetch(&_q_value, 1, __ATOMIC_ACQ_REL);
++    Q_COMPILER_MEMORY_BARRIER;
++
++    return newValue != 0;
++}
++
++inline bool QBasicAtomicInt::deref()
++{
++    int newValue;
++
++    Q_COMPILER_MEMORY_BARRIER;
++    newValue = __atomic_sub_fetch(&_q_value, 1, __ATOMIC_ACQ_REL);
++    Q_COMPILER_MEMORY_BARRIER;
++
++    return newValue != 0;
++}
++
++inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
++{
++    bool val;
++
++    Q_COMPILER_MEMORY_BARRIER;
++    val =  __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue,
++					false, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
++    Q_COMPILER_MEMORY_BARRIER;
++    return val;
++}
++
++inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
++{
++    int val;
++    Q_COMPILER_MEMORY_BARRIER;
++    val = __atomic_exchange_n(&_q_value, newValue, __ATOMIC_RELAXED);
++    Q_COMPILER_MEMORY_BARRIER;
++    return val;
++}
++
++inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
++{
++    int val;
++    Q_COMPILER_MEMORY_BARRIER;
++    val = __atomic_fetch_add(&_q_value, valueToAdd, __ATOMIC_RELAXED);
++    Q_COMPILER_MEMORY_BARRIER;
++    return val;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
++{
++    bool val;
++    Q_COMPILER_MEMORY_BARRIER;
++    val =  __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue,
++					false, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
++    Q_COMPILER_MEMORY_BARRIER;
++    return val;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
++{
++    T *val;
++    Q_COMPILER_MEMORY_BARRIER;
++    val = __atomic_exchange_n(&_q_value, newValue, __ATOMIC_RELAXED);
++    Q_COMPILER_MEMORY_BARRIER;
++    return val;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
++{
++    T *val;
++    Q_COMPILER_MEMORY_BARRIER;
++    val = __atomic_fetch_add(&_q_value, valueToAdd, __ATOMIC_RELAXED);
++    Q_COMPILER_MEMORY_BARRIER;
++    return val;
++}
++
++inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
++{
++    bool returnValue = testAndSetRelaxed(expectedValue, newValue);
++    Q_DATA_MEMORY_BARRIER;
++    return returnValue;
++}
++
++inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    return testAndSetRelaxed(expectedValue, newValue);
++}
++
++inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    bool returnValue = testAndSetRelaxed(expectedValue, newValue);
++    Q_COMPILER_MEMORY_BARRIER;
++    return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
++{
++    int returnValue = fetchAndStoreRelaxed(newValue);
++    Q_DATA_MEMORY_BARRIER;
++    return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    return fetchAndStoreRelaxed(newValue);
++}
++
++inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    int returnValue = fetchAndStoreRelaxed(newValue);
++    Q_COMPILER_MEMORY_BARRIER;
++    return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
++{
++    int returnValue = fetchAndAddRelaxed(valueToAdd);
++    Q_DATA_MEMORY_BARRIER;
++    return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
++{
++    Q_DATA_MEMORY_BARRIER;
++    return fetchAndAddRelaxed(valueToAdd);
++}
++
++inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
++{
++    Q_DATA_MEMORY_BARRIER;
++    int returnValue = fetchAndAddRelaxed(valueToAdd);
++    Q_COMPILER_MEMORY_BARRIER;
++    return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
++{
++    bool returnValue = testAndSetRelaxed(expectedValue, newValue);
++    Q_DATA_MEMORY_BARRIER;
++    return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    return testAndSetRelaxed(expectedValue, newValue);
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    bool returnValue = testAndSetAcquire(expectedValue, newValue);
++    Q_COMPILER_MEMORY_BARRIER;
++    return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
++{
++    T *returnValue = fetchAndStoreRelaxed(newValue);
++    Q_DATA_MEMORY_BARRIER;
++    return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    return fetchAndStoreRelaxed(newValue);
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
++{
++    Q_DATA_MEMORY_BARRIER;
++    T *returnValue = fetchAndStoreRelaxed(newValue);
++    Q_COMPILER_MEMORY_BARRIER;
++    return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
++{
++    T *returnValue = fetchAndAddRelaxed(valueToAdd);
++    Q_DATA_MEMORY_BARRIER;
++    return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
++{
++    Q_DATA_MEMORY_BARRIER;
++    return fetchAndAddRelaxed(valueToAdd);
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
++{
++    Q_DATA_MEMORY_BARRIER;
++    T *returnValue = fetchAndAddRelaxed(valueToAdd);
++    Q_COMPILER_MEMORY_BARRIER;
++    return returnValue;
++}
++
++#undef Q_DATA_MEMORY_BARRIER
++#undef Q_COMPILER_MEMORY_BARRIER
++
++QT_END_NAMESPACE
++
++QT_END_HEADER
++
++#endif // QATOMIC_AARCH64_H
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/qatomic_arch.h
+===================================================================
+--- qt4-x11-4.8.5+git192-g085f851+dfsg.orig/src/corelib/arch/qatomic_arch.h	2063-04-29 23:57:10.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/arch/qatomic_arch.h	2063-04-29 23:57:10.000000000 +0000
+@@ -94,6 +94,8 @@
+ #  include "QtCore/qatomic_sh4a.h"
+ #elif defined(QT_ARCH_NACL)
+ #  include "QtCore/qatomic_generic.h"
++#elif defined(QT_ARCH_AARCH64)
++#  include "QtCore/qatomic_aarch64.h"
+ #else
+ #  error "Qt has not been ported to this architecture"
+ #endif
+Index: qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/io/qfilesystemwatcher_inotify.cpp
+===================================================================
+--- qt4-x11-4.8.5+git192-g085f851+dfsg.orig/src/corelib/io/qfilesystemwatcher_inotify.cpp	2063-04-29 23:57:10.000000000 +0000
++++ qt4-x11-4.8.5+git192-g085f851+dfsg/src/corelib/io/qfilesystemwatcher_inotify.cpp	2063-04-29 23:57:10.000000000 +0000
+@@ -138,6 +138,11 @@
+ # define __NR_inotify_add_watch 285
+ # define __NR_inotify_rm_watch  286
+ # define __NR_inotify_init1     328
++#elif defined (__aarch64__)
++# define __NR_inotify_init1     26
++# define __NR_inotify_add_watch 27
++# define __NR_inotify_rm_watch  28
++// no inotify_init for aarch64
+ #else
+ # error "This architecture is not supported. Please talk to qt-bugs@trolltech.com"
+ #endif
+@@ -155,7 +160,11 @@
+ 
+ static inline int inotify_init()
+ {
++#ifdef __NR_inotify_init
+     return syscall(__NR_inotify_init);
++#else
++    return syscall(__NR_inotify_init1, 0);
++#endif
+ }
+ 
+ static inline int inotify_add_watch(int fd, const char *name, __u32 mask)
diff -Nru qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64_fix_atomic_set.patch qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64_fix_atomic_set.patch
--- qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64_fix_atomic_set.patch	1970-01-01 00:00:00.000000000 +0000
+++ qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/aarch64_fix_atomic_set.patch	2063-04-29 23:58:45.000000000 +0000
@@ -0,0 +1,29 @@
+Description: Fix aarch64 atomic test and set to set the right value.
+ QBasicAtomicInt::testAndSetRelaxed and
+ QBasicAtomicPointer<T>::testAndSetRelaxed would previously set the
+ target to a local stack frame pointer to the new value, rather than to
+ the new value itself.
+Author: William Grant <wgrant@ubuntu.com>
+
+Index: qt4-x11-4.8.4+dfsg/src/corelib/arch/qatomic_aarch64.h
+===================================================================
+--- qt4-x11-4.8.4+dfsg.orig/src/corelib/arch/qatomic_aarch64.h	2013-10-13 22:23:58.000000000 +1100
++++ qt4-x11-4.8.4+dfsg/src/corelib/arch/qatomic_aarch64.h	2013-10-13 22:24:56.810788571 +1100
+@@ -135,7 +135,7 @@
+     bool val;
+ 
+     Q_COMPILER_MEMORY_BARRIER;
+-    val =  __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue,
++    val =  __atomic_compare_exchange_n (&_q_value, &expectedValue, newValue,
+ 					false, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+     Q_COMPILER_MEMORY_BARRIER;
+     return val;
+@@ -164,7 +164,7 @@
+ {
+     bool val;
+     Q_COMPILER_MEMORY_BARRIER;
+-    val =  __atomic_compare_exchange_n (&_q_value, &expectedValue, &newValue,
++    val =  __atomic_compare_exchange_n (&_q_value, &expectedValue, newValue,
+ 					false, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+     Q_COMPILER_MEMORY_BARRIER;
+     return val;
diff -Nru qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/series qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/series
--- qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/series	2013-12-05 19:29:51.000000000 +0000
+++ qt4-x11-4.8.5+git192-g085f851+dfsg/debian/patches/series	2063-04-29 23:58:45.000000000 +0000
@@ -43,3 +43,5 @@
 QTBUG-25324_assistant_segfault_on_start_with_gcc_4.7.patch
 qt-everywhere-opensource-src-4.8.5-QTBUG-22829.patch
 qtdoc-build-offline-docs.patch
+aarch64.patch
+aarch64_fix_atomic_set.patch
diff -Nru qt4-x11-4.8.5+git192-g085f851+dfsg/debian/rules qt4-x11-4.8.5+git192-g085f851+dfsg/debian/rules
--- qt4-x11-4.8.5+git192-g085f851+dfsg/debian/rules	2013-10-11 23:49:32.000000000 +0000
+++ qt4-x11-4.8.5+git192-g085f851+dfsg/debian/rules	2063-04-30 03:12:47.000000000 +0000
@@ -45,6 +45,11 @@
 	extra_configure_opts += -no-sql-sqlite2
 endif
 
+ifneq (,$(filter $(DEB_HOST_ARCH),arm64))
+        export CXXFLAGS := -fpermissive $(CXXFLAGS)
+        extra_configure_opts += -no-javascript-jit
+endif
+
 ifeq ($(DEB_HOST_ARCH),arm)
 	extra_configure_opts += -DQT_QLOCALE_USES_FCVT
 endif
@@ -70,7 +75,7 @@
 endif
 
 ifeq ($(DEB_HOST_ARCH_OS),linux)
-  ifneq (,$(filter $(DEB_HOST_ARCH),alpha ia64))
+  ifneq (,$(filter $(DEB_HOST_ARCH),alpha arm64 ia64))
 	platform_arg = linux-g++
   else ifeq ($(DEB_HOST_ARCH_BITS),64)
 	platform_arg = linux-g++-64
@@ -118,6 +123,8 @@
 	# syncqt and regenerating it.
 	rm -rf include
 
+	#update (3rdparty) autoconf files
+	dh_autotools-dev_updateconfig
 	./configure -confirm-license \
 	            -prefix "/usr" \
 	            -bindir "/usr/lib/$(DEB_HOST_MULTIARCH)/qt4/bin" \
@@ -184,6 +191,9 @@
 override_dh_auto_clean:
 	[ ! -f Makefile ] || $(MAKE) confclean distclean
 
+	# For freetype (3rdparty)
+	dh_autotools-dev_restoreconfig
+
 	# Extra stuff missed by confclean/distclean
 
 	# Misc. files

Reply to: