From 7d5df5d67431c720f77e2cfee0eedf5202b7251d Mon Sep 17 00:00:00 2001
From: Alexandre Lision <alexandre.lision@gmail.com>
Date: Mon, 27 Oct 2014 13:10:01 -0400
Subject: [PATCH] build: add multi-arch and 64 bits support

    (cherry-picked from vlc-android commits:
        3ef336c2ac667932c36338efe65be6bda0515e75,
        ec890fd36a3a5410c8e6c5af6f67275dab4f9290,
        c8dccbaf8bc525b1084998da3535b8ea8aae9f3f,
        79740e9ffa7d30de28f3bc6e38163ee10ad78c0d,
        a62f5ad965ff08d9fb62a4594717065050a6871c)
---
 Makefile   |  14 ++++
 README.md  |   3 +-
 compile.sh | 194 +++++++++++++++++++++++++++++++++++++++--------------
 gen-env.sh |  20 ++++++
 4 files changed, 178 insertions(+), 53 deletions(-)
 create mode 100755 gen-env.sh

diff --git a/Makefile b/Makefile
index 233002f9c..d269055c4 100644
--- a/Makefile
+++ b/Makefile
@@ -29,6 +29,17 @@ SFLPHONE_APK=$(SRC)/bin/SFLphone-debug.apk
 NDK_DEBUG=1
 endif
 
+define build_apk
+	@echo
+	@echo "=== Building $(SFLPHONE_APK) for $(ARCH) ==="
+	@echo
+	date +"%Y-%m-%d" > $(SRC)/assets/builddate.txt
+	echo `id -u -n`@`hostname` > $(SRC)/assets/builder.txt
+	git rev-parse --short HEAD > $(SRC)/assets/revision.txt
+	./gen-env.sh $(SRC)
+	$(VERBOSE)cd $(SRC) && ant $(ANT_OPTS) $(ANT_TARGET)
+endef
+
 $(SFLPHONE_APK): $(LIBSFLPHONEJNI) $(JAVA_SOURCES)
 	@echo
 	@echo "=== Building $@ for $(ARCH) ==="
@@ -58,6 +69,9 @@ $(LIBSFLPHONEJNI): $(LIBSFLPHONEJNI_H)
 		NDK_DEBUG=$(NDK_DEBUG) \
 		TARGET_CFLAGS="$$SFLPHONE_EXTRA_CFLAGS"
 
+apk:
+	$(call build_apk)
+
 apkclean:
 	rm -f $(SFLPHONE_APK)
 
diff --git a/README.md b/README.md
index 4098b9cd1..55cb67c02 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,9 @@ export PATH=$ANDROID_SDK/platform-tools:${PATH}
 install swig-2.0.6 or later and python-2.7 or later on your system
 
 ## Build instructions
+Supported archs are: armeabi-v7a, armeabi, arm64-v8a, x86, x86_64 or mips
 
-export ANDROID_ABI=armeabi-v7a
+export ANDROID_ABI=[insert list of arch here with spaces]
 ./compile.sh
 
 We use a tested hash to build sflphone core, but if you want to use master:
diff --git a/compile.sh b/compile.sh
index e613d27b0..70aaa1a92 100755
--- a/compile.sh
+++ b/compile.sh
@@ -6,23 +6,6 @@
 
 set -e
 
-BUILD=
-FETCH=
-case "$1" in
-    --fetch)
-    FETCH=1
-    shift
-    ;;
-    --build)
-    BUILD=1
-    shift
-    ;;
-    *)
-    FETCH=1
-    BUILD=1
-    ;;
-esac
-
 if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
    echo "You must define ANDROID_NDK, ANDROID_SDK and ANDROID_ABI before starting."
    echo "They must point to your NDK and SDK directories.\n"
@@ -30,17 +13,109 @@ if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
 fi
 
 if [ -z "$ANDROID_ABI" ]; then
-   echo "Please set ANDROID_ABI to your architecture: armeabi-v7a, armeabi, x86 or mips."
+   echo "Please set ANDROID_ABI to your architecture: armeabi-v7a, armeabi, arm64-v8a, x86, x86_64 or mips."
    exit 1
 fi
 
+if [ -z "$NO_FPU" ];then
+    NO_FPU=0
+fi
+if [ -z "$NO_ARMV6" ];then
+    NO_ARMV6=0
+fi
+
+BUILD=0
+FETCH=0
+RELEASE=0
+JNI=0
+
+for i in ${@}; do
+    case "$i" in
+        --fetch)
+        FETCH=1
+        ;;
+        --build)
+        BUILD=1
+        ;;
+        release|--release)
+        RELEASE=1
+        ;;
+        jni|--jni)
+        JNI=1
+        ;;
+        *)
+        ;;
+    esac
+done
+
+if [ "$BUILD" = 0 -a "$FETCH" = 0 ];then
+    BUILD=1
+    FETCH=1
+fi
+
+if [ `set -- ${ANDROID_ABI}; echo $#` -gt 1 ]; then
+    ANDROID_ABI_LIST="${ANDROID_ABI}"
+    echo "More than one ABI specified: ${ANDROID_ABI_LIST}"
+    for i in ${ANDROID_ABI_LIST}; do
+        echo "$i starts building"
+        ANDROID_NDK=$ANDROID_NDK ANDROID_SDK=$ANDROID_SDK \
+            NO_FPU=$NO_FPU NO_ARMV6=$NO_ARMV6 ANDROID_ABI=$i \
+            ./compile.sh $* --jni || { echo "$i build KO"; exit 1; }
+        mkdir -p obj/
+        cp -r sflphone-android/libs/$i obj
+        echo "$i build OK"
+    done
+    for i in ${ANDROID_ABI_LIST}; do
+        cp -r obj/$i sflphone-android/libs/
+        rm -rf obj/$i
+    done
+    make -b -j1 RELEASE=$RELEASE apk || exit 1
+    exit 0
+fi
+
+HAVE_ARM=0
+HAVE_X86=0
+HAVE_MIPS=0
+HAVE_64=0
+
+
+# Set up ABI variables
+if [ ${ANDROID_ABI} = "x86" ] ; then
+    TARGET_TUPLE="i686-linux-android"
+    PATH_HOST="x86"
+    HAVE_X86=1
+    PLATFORM_SHORT_ARCH="x86"
+elif [ ${ANDROID_ABI} = "x86_64" ] ; then
+    TARGET_TUPLE="x86_64-linux-android"
+    PATH_HOST="x86_64"
+    HAVE_X86=1
+    HAVE_64=1
+    PLATFORM_SHORT_ARCH="x86_64"
+elif [ ${ANDROID_ABI} = "mips" ] ; then
+    TARGET_TUPLE="mipsel-linux-android"
+    PATH_HOST=$TARGET_TUPLE
+    HAVE_MIPS=1
+    PLATFORM_SHORT_ARCH="mips"
+elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
+    TARGET_TUPLE="aarch64-linux-android"
+    PATH_HOST=$TARGET_TUPLE
+    HAVE_ARM=1
+    HAVE_64=1
+    PLATFORM_SHORT_ARCH="arm64"
+else
+    TARGET_TUPLE="arm-linux-androideabi"
+    PATH_HOST=$TARGET_TUPLE
+    HAVE_ARM=1
+    PLATFORM_SHORT_ARCH="arm"
+fi
+
 # try to detect NDK version
 REL=$(grep -o '^r[0-9]*.*' $ANDROID_NDK/RELEASE.TXT 2>/dev/null|cut -b2-)
 case "$REL" in
     10*)
         if [ "${HAVE_64}" = 1 ];then
             GCCVER=4.9
-            ANDROID_API=android-L
+            ANDROID_API=android-21
         else
             GCCVER=4.8
             ANDROID_API=android-9
@@ -66,24 +141,6 @@ export GCCVER
 export CXXSTL
 export ANDROID_API
 
-# Set up ABI variables
-if [ ${ANDROID_ABI} = "x86" ] ; then
-    TARGET_TUPLE="i686-linux-android"
-    PATH_HOST="x86"
-    HAVE_X86=1
-    PLATFORM_SHORT_ARCH="x86"
-elif [ ${ANDROID_ABI} = "mips" ] ; then
-    TARGET_TUPLE="mipsel-linux-android"
-    PATH_HOST=$TARGET_TUPLE
-    HAVE_MIPS=1
-    PLATFORM_SHORT_ARCH="mips"
-else
-    TARGET_TUPLE="arm-linux-androideabi"
-    PATH_HOST=$TARGET_TUPLE
-    HAVE_ARM=1
-    PLATFORM_SHORT_ARCH="arm"
-fi
-
 # XXX : important!
 [ "$HAVE_ARM" = 1 ] && cat << EOF
 For an ARMv6 device without FPU:
@@ -99,6 +156,7 @@ export PATH_HOST
 export HAVE_ARM
 export HAVE_X86
 export HAVE_MIPS
+export HAVE_64
 export PLATFORM_SHORT_ARCH
 
 # Add the NDK toolchain to the PATH, needed both for contribs and for building
@@ -168,8 +226,12 @@ elif [ ${ANDROID_ABI} = "armeabi" ] ; then
             EXTRA_CFLAGS="-mfpu=vfp -mcpu=arm1136jf-s -mfloat-abi=softfp"
         fi
     fi
+elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
+    EXTRA_CFLAGS=""
 elif [ ${ANDROID_ABI} = "x86" ] ; then
-    EXTRA_CFLAGS="-march=pentium"
+    EXTRA_CFLAGS="-march=pentium -m32"
+elif [ ${ANDROID_ABI} = "x86_64" ] ; then
+    EXTRA_CFLAGS=""
 elif [ ${ANDROID_ABI} = "mips" ] ; then
     EXTRA_CFLAGS="-march=mips32 -mtune=mips32r2 -mhard-float"
     # All MIPS Linux kernels since 2.4.4 will trap any unimplemented FPU
@@ -185,7 +247,7 @@ EXTRA_CFLAGS="${EXTRA_CFLAGS} -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CX
 EXTRA_CFLAGS="${EXTRA_CFLAGS} -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CXXSTL}/libs/${ANDROID_ABI}/include"
 
 # Setup LDFLAGS
-EXTRA_LDFLAGS="-l${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CXXSTL}/libs/${ANDROID_ABI}/libgnustl_static.a"
+EXTRA_LDFLAGS="-L${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CXXSTL}/libs/${ANDROID_ABI} -lgnustl_static"
 
 # Make in //
 UNAMES=$(uname -s)
@@ -259,31 +321,59 @@ which autopoint >/dev/null || make $MAKEFLAGS .gettext
 export PATH="$PATH:$PWD/../$TARGET_TUPLE/bin"
 
 export SFLPHONE_BUILD_DIR=sflphone/daemon/build-android-${TARGET_TUPLE}
+
 ############
 # Make SFLPHONE #
 ############
 cd ../.. && mkdir -p build-android-${TARGET_TUPLE} && cd build-android-${TARGET_TUPLE}
 
-if [ $# -eq 1 ] && [ "$1" = "jni" ]; then
+if [ "$JNI" = 1 ]; then
     CLEAN="jniclean"
     TARGET="sflphone-android/obj/local/${ANDROID_ABI}/libsflphone.so"
 else
     CLEAN="distclean"
-    if [ ! -f config.h ]; then
-        echo "Bootstraping"
-        cd ../
-        ./autogen.sh
-        cd ../../
-        cd sflphone-android
-        ./make-swig.sh
-        cd ../sflphone/daemon/build-android-${TARGET_TUPLE}
-        echo "Configuring"
-        echo `pwd`
-        ${ANDROID_PATH}/configure.sh ${OPTS}
-    fi
     TARGET=
 fi
 
+if [ ! -f config.h ]; then
+    echo "Bootstraping"
+    cd ../
+    ./autogen.sh
+    cd ../../
+    cd sflphone-android
+    ./make-swig.sh
+    cd ../sflphone/daemon/build-android-${TARGET_TUPLE}
+    echo "Configuring"
+    ${ANDROID_PATH}/configure.sh ${OPTS}
+fi
+
+# ANDROID NDK FIXUP (BLAME GOOGLE)
+config_undef ()
+{
+    previous_change=`stat -c "%y" config.h`
+    sed -i 's,#define '$1' 1,/\* #undef '$1' \*/,' config.h
+    # don't change modified date in order to don't trigger a full build
+    touch -d "$previous_change" config.h
+}
+
+# if config dependencies change, ./config.status --recheck
+# is run and overwrite previously hacked config.h. So call make Makefile here
+# and hack config.h after.
+
+make $MAKEFLAGS Makefile
+
+if [ ${ANDROID_ABI} = "x86" -a ${ANDROID_API} != "android-21" ] ; then
+    # NDK x86 libm.so has nanf symbol but no nanf definition, we don't known if
+    # intel devices has nanf. Assume they don't have it.
+    config_undef HAVE_NANF
+fi
+if [ ${ANDROID_API} = "android-21" ] ; then
+    # android-21 has empty sys/shm.h headers that triggers shm detection but it
+    # doesn't have any shm functions and/or symbols. */
+    config_undef HAVE_SYS_SHM_H
+fi
+# END OF ANDROID NDK FIXUP
+
 echo "Building libsflphone"
 make $MAKEFLAGS
 
diff --git a/gen-env.sh b/gen-env.sh
new file mode 100755
index 000000000..73574344c
--- /dev/null
+++ b/gen-env.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Simple script to generate env.txt
+ENVTXT=$1/assets/env.txt
+
+function optional_var {
+	echo -n "$1=" >> $ENVTXT
+	ONE=\$$1
+	T=`eval echo $ONE`
+	if [ -z "$T" ]; then
+		echo -n "0" >> $ENVTXT
+	else
+		echo -n "$T" >> $ENVTXT
+	fi
+	echo -n -e "\n" >> $ENVTXT
+}
+
+rm -f $ENVTXT
+echo -e "ANDROID_ABI=$ANDROID_ABI" >> $ENVTXT
+optional_var "NO_FPU"
+optional_var "NO_ARMV6"
-- 
GitLab