blob: 9ceec04b4687f15035ef767d0c1783e211219e1a [file] [log] [blame]
Adrien Béraud86759bb2016-09-28 13:54:54 -04001#! /bin/bash
2# Build Ring daemon for architecture specified by ANDROID_ABI
3
4#for OSX/BSD
5realpath() {
6 [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
7}
8
9set -e
10
11if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
12 echo "You must define ANDROID_NDK, ANDROID_SDK and ANDROID_ABI before starting."
13 echo "They must point to your NDK and SDK directories."
14 exit 1
15fi
16
17if [ -z "$ANDROID_ABI" ]; then
18 echo "Please set ANDROID_ABI to your architecture: armeabi-v7a, x86."
19 exit 1
20fi
21
Adrien Béraud86759bb2016-09-28 13:54:54 -040022ANDROID_TOPLEVEL_DIR="`pwd`"
23ANDROID_APP_DIR="$(pwd)/ring-android"
24
25HAVE_ARM=0
26HAVE_X86=0
27HAVE_MIPS=0
28HAVE_64=0
29
30# Set up ABI variables
31if [ ${ANDROID_ABI} = "x86" ] ; then
32 TARGET_TUPLE="i686-linux-android"
33 PJ_TARGET_TUPLE="i686-pc-linux-android"
34 PATH_HOST="x86"
35 HAVE_X86=1
36 PLATFORM_SHORT_ARCH="x86"
37elif [ ${ANDROID_ABI} = "x86_64" ] ; then
38 TARGET_TUPLE="x86_64-linux-android"
39 PJ_TARGET_TUPLE="x86_64-pc-linux-android"
40 PATH_HOST="x86_64"
41 HAVE_X86=1
42 HAVE_64=1
43 PLATFORM_SHORT_ARCH="x86_64"
44elif [ ${ANDROID_ABI} = "mips" ] ; then
45 TARGET_TUPLE="mipsel-linux-android"
46 PJ_TARGET_TUPLE="mips-unknown-linux-androideabi"
47 PATH_HOST=$TARGET_TUPLE
48 HAVE_MIPS=1
49 PLATFORM_SHORT_ARCH="mips"
50elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
51 TARGET_TUPLE="aarch64-linux-android"
Adrien Béraudd088a982017-02-09 14:38:36 -050052 PJ_TARGET_TUPLE="aarch64-unknown-linux-android"
Adrien Béraud86759bb2016-09-28 13:54:54 -040053 PATH_HOST=$TARGET_TUPLE
54 HAVE_ARM=1
55 HAVE_64=1
56 PLATFORM_SHORT_ARCH="arm64"
57else
58 TARGET_TUPLE="arm-linux-androideabi"
59 PJ_TARGET_TUPLE="arm-unknown-linux-androideabi"
60 PATH_HOST=$TARGET_TUPLE
61 HAVE_ARM=1
62 PLATFORM_SHORT_ARCH="arm"
63fi
64
65if [ "${HAVE_64}" = 1 ];then
66 ANDROID_API_VERS=21
67 LIBDIR=lib64
68else
69 ANDROID_API_VERS=16
70 LIBDIR=lib
71fi
72ANDROID_API=android-$ANDROID_API_VERS
73
74export ANDROID_TOOLCHAIN="`pwd`/android-toolchain-$ANDROID_API_VERS-$PLATFORM_SHORT_ARCH"
75if [ ! -d "$ANDROID_TOOLCHAIN" ]; then
76 $ANDROID_NDK/build/tools/make_standalone_toolchain.py \
77 --arch=$PLATFORM_SHORT_ARCH \
78 --api $ANDROID_API_VERS \
79 --stl libc++ \
80 --install-dir=$ANDROID_TOOLCHAIN
81fi
82
83GCCVER=clang
84CXXSTL="/"${GCCVER}
85
86export GCCVER
87export CXXSTL
88export ANDROID_API
89export TARGET_TUPLE
90export PATH_HOST
91export HAVE_ARM
92export HAVE_X86
93export HAVE_MIPS
94export HAVE_64
95export PLATFORM_SHORT_ARCH
96
97# Add the NDK toolchain to the PATH, needed both for contribs and for building
98# stub libraries
99NDK_TOOLCHAIN_PATH=`echo ${ANDROID_TOOLCHAIN}/bin`
100export NDK_TOOLCHAIN_PATH=${NDK_TOOLCHAIN_PATH}
101export PATH=${NDK_TOOLCHAIN_PATH}:${PATH}
102
103if [ -z "$DAEMON_DIR" ]; then
104 DAEMON_DIR="$(pwd)/../daemon"
105 echo "DAEMON_DIR not provided trying to find it in $DAEMON_DIR"
106fi
107
108if [ ! -d "$DAEMON_DIR" ]; then
109 echo 'Daemon not found.'
110 echo 'If you cloned the daemon in a custom location override' \
111 'DAEMON_DIR to point to it'
112 echo "You can also use our meta repo which contains both:
113 https://gerrit-ring.savoirfairelinux.com/#/admin/projects/ring-project"
114 exit 1
115fi
116
Adrien Beraudf2fe7d32017-05-14 13:27:19 -0400117EXTRA_CFLAGS="${EXTRA_CFLAGS} -O3"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400118
119# Setup LDFLAGS
120if [ ${ANDROID_ABI} = "armeabi-v7a-hard" ] ; then
121 EXTRA_CFLAGS="${EXTRA_CFLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
122 EXTRA_LDFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mcpu=cortex-a8 -lm_hard -D_NDK_MATH_NO_SOFTFP=1"
123elif [ ${ANDROID_ABI} = "armeabi-v7a" ] ; then
124 EXTRA_CFLAGS="${EXTRA_CFLAGS} -march=armv7-a -mthumb -mfloat-abi=softfp -mfpu=vfpv3-d16"
Adrien Béraudd088a982017-02-09 14:38:36 -0500125 EXTRA_LDFLAGS="-march=armv7-a -mthumb -mfloat-abi=softfp -mfpu=vfpv3-d16"
126elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
127 EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_TOOLCHAIN}/sysroot/usr/lib -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/lib"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400128fi
Adrien Béraudd088a982017-02-09 14:38:36 -0500129EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR}/${ANDROID_ABI} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR} -lm -latomic -landroid_support"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400130
131EXTRA_CXXFLAGS="${EXTRA_CFLAGS}"
132EXTRA_CFLAGS="-std=c11 ${EXTRA_CFLAGS}"
133
134# Make in //
135UNAMES=$(uname -s)
136MAKEFLAGS=
137if which nproc >/dev/null
138then
139MAKEFLAGS=-j`nproc`
140elif [ "$UNAMES" == "Darwin" ] && which sysctl >/dev/null
141then
142MAKEFLAGS=-j`sysctl -n machdep.cpu.thread_count`
143fi
144
145# Build buildsystem tools
146cd "$DAEMON_DIR"
147export PATH=`pwd`/extras/tools/build/bin:$PATH
148echo "Building tools"
149pushd extras/tools
150./bootstrap
151make $MAKEFLAGS
Alexandre Lisionf7547c72017-07-27 14:07:12 -0400152make .pkg-config
Adrien Beraud44a7a232017-06-22 18:58:31 +0200153make .gas
Adrien Béraud86759bb2016-09-28 13:54:54 -0400154popd
155
156############
157# Contribs #
158############
159echo "Building the contribs"
160mkdir -p contrib/native-${TARGET_TUPLE}
161
162ANDROID_BIN=${NDK_TOOLCHAIN_PATH}
163CROSS_COMPILE=${ANDROID_BIN}/${TARGET_TUPLE}-
164export CROSS_COMPILE="${CROSS_COMPILE}"
165
166mkdir -p contrib/${TARGET_TUPLE}/lib/pkgconfig
167
168pushd contrib/native-${TARGET_TUPLE}
169../bootstrap --host=${TARGET_TUPLE} --disable-libav --enable-ffmpeg --disable-speexdsp
170
171# Some libraries have arm assembly which won't build in thumb mode
172# We append -marm to the CFLAGS of these libs to disable thumb mode
173[ ${ANDROID_ABI} = "armeabi-v7a" ] && echo "NOTHUMB := -marm" >> config.mak
174[ ${ANDROID_ABI} = "armeabi-v7a-hard" ] && echo "NOTHUMB := -marm" >> config.mak
175
Alexandre Lision2875f122016-11-08 10:52:25 -0500176# Always strip symbols for libring.so remove it if you want to debug the daemon
177STRIP_ARG="-s "
178
Romain Bertozzi32692de2016-10-27 15:16:46 -0400179EXTRA_CFLAGS="${EXTRA_CFLAGS} -DNDEBUG "
180if [ "${RELEASE}" -eq 1 ]; then
181 echo "Contribs in release mode."
Adrien Béraud86759bb2016-09-28 13:54:54 -0400182 OPTS=""
Adrien Béraud86759bb2016-09-28 13:54:54 -0400183else
Romain Bertozzi32692de2016-10-27 15:16:46 -0400184 echo "Contribs in debug mode."
Adrien Béraud86759bb2016-09-28 13:54:54 -0400185 OPTS="--enable-debug"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400186fi
187
188export SYSROOT=$ANDROID_TOOLCHAIN/sysroot
189echo "EXTRA_CFLAGS= -g -fpic ${EXTRA_CFLAGS}" >> config.mak
190echo "EXTRA_CXXFLAGS= -g -fpic ${EXTRA_CXXFLAGS}" >> config.mak
191echo "EXTRA_LDFLAGS= ${EXTRA_LDFLAGS} -L${SYSROOT}/usr/${LIBDIR}" >> config.mak
192export RING_EXTRA_CFLAGS="${EXTRA_CFLAGS}"
193export RING_EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS}"
194export RING_EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${SYSROOT}/usr/${LIBDIR}"
195
196make list
197make fetch
198export PATH="$PATH:$PWD/../$TARGET_TUPLE/bin"
Guillaume Roguez6b4c02b2016-12-14 19:04:16 -0500199make $MAKEFLAGS
Adrien Béraud86759bb2016-09-28 13:54:54 -0400200popd
201
202############
203# Make Ring #
204############
205RING_SRC_DIR="${DAEMON_DIR}"
206RING_BUILD_DIR="`realpath build-android-${TARGET_TUPLE}`"
207export RING_SRC_DIR="${RING_SRC_DIR}"
208export RING_BUILD_DIR="${RING_BUILD_DIR}"
209
210mkdir -p build-android-${TARGET_TUPLE}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400211cd ${ANDROID_APP_DIR}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400212
213if [ ! -f config.h ]; then
214 echo "Bootstraping"
215 cd ${DAEMON_DIR}
216 ./autogen.sh
217 cd "${DAEMON_DIR}/build-android-${TARGET_TUPLE}"
218 echo "Configuring with ${OPTS}"
219 ${ANDROID_TOPLEVEL_DIR}/configure.sh ${OPTS}
220fi
221
222if [ ${ANDROID_API} = "android-21" ] ; then
223 # android-21 has empty sys/shm.h headers that triggers shm detection but it
224 # doesn't have any shm functions and/or symbols. */
225 export ac_cv_header_sys_shm_h=no
226fi
227if [ ${ANDROID_ABI} = "x86" -a ${ANDROID_API} != "android-21" ] ; then
228 # NDK x86 libm.so has nanf symbol but no nanf definition, we don't known if
229 # intel devices has nanf. Assume they don't have it.
230 export ac_cv_lib_m_nanf=no
231fi
232
233echo "Building dring ${MAKEFLAGS}"
234V=99 make $MAKEFLAGS
235
Aline Bonnetaded8f22017-03-22 11:22:35 -0400236if [[ $DAEMON_ONLY -eq 1 ]]; then
237 exit 0
238fi
239
Adrien Béraud86759bb2016-09-28 13:54:54 -0400240####################################
241# Ring android UI and specific code
242####################################
243cd ${ANDROID_TOPLEVEL_DIR}
244
245STATIC_LIBS_ALL="-llog -lOpenSLES -landroid \
246 -lopendht \
247 -lpjsip-${PJ_TARGET_TUPLE} \
248 -lpjsip-simple-${PJ_TARGET_TUPLE} \
249 -lpjsip-ua-${PJ_TARGET_TUPLE} -lpjsua-${PJ_TARGET_TUPLE} \
250 -lpjnath-${PJ_TARGET_TUPLE} \
251 -lpjmedia-${PJ_TARGET_TUPLE} \
252 -lpjlib-util-${PJ_TARGET_TUPLE} \
253 -lpj-${PJ_TARGET_TUPLE} \
254 -lupnp -lixml -lthreadutil \
255 -lsamplerate \
Adrien Beraud6c9d1582017-04-24 23:17:19 +0200256 -lgnutls -lnettle -lhogweed -lgmp \
Adrien Béraud14ddd732016-10-03 11:46:15 -0400257 -lcryptopp -lboost_random -lboost_system \
258 -lrestbed \
Adrien Béraud86759bb2016-09-28 13:54:54 -0400259 -lavformat -lavdevice -lavcodec -lavfilter -lavutil \
260 -lpcre -lsndfile -lyaml-cpp -ljsoncpp \
261 -luuid -lz -lswscale \
Adrien Beraudf4fb83c2017-06-16 14:41:56 +0200262 -lvpx -lx264 -lopus -lspeex -lvorbis -lvorbisenc -logg -lFLAC \
Aline Bonneta14f6062017-05-04 10:33:24 -0400263 -largon2 \
Adrien Beraud6c9d1582017-04-24 23:17:19 +0200264 -liconv"
265
Adrien Béraud86759bb2016-09-28 13:54:54 -0400266LIBRING_JNI_DIR=${ANDROID_APP_DIR}/app/src/main/libs/${ANDROID_ABI}
267
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200268echo "Building Ring JNI library for Android to ${LIBRING_JNI_DIR}"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400269mkdir -p ${LIBRING_JNI_DIR}
Alexandre Lision084d3ad2017-05-08 16:13:59 -0400270
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200271${NDK_TOOLCHAIN_PATH}/clang++ \
272 --shared \
273 -Wall -Wextra \
274 -Wno-unused-variable \
275 -Wno-unused-function \
276 -Wno-unused-parameter \
277 ${ANDROID_APP_DIR}/libringclient/src/main/jni/ring_wrapper.cpp \
278 ${RING_BUILD_DIR}/src/.libs/libring.a \
279 -static-libstdc++ \
280 -I${RING_SRC_DIR}/contrib/${TARGET_TUPLE}/include \
281 -I${RING_SRC_DIR}/src \
282 -L${RING_SRC_DIR}/contrib/${TARGET_TUPLE}/lib \
283 ${STATIC_LIBS_ALL} \
284 ${STRIP_ARG} --std=c++11 \
285 -o ${LIBRING_JNI_DIR}/libring.so
Alexandre Lision084d3ad2017-05-08 16:13:59 -0400286
287# Copying native libs to androidtv folder too
Loïc Siretbb8c5bd2017-07-14 16:16:28 -0400288LIBRING_JNI_ANDROID_DIR=${ANDROID_APP_DIR}/libringandroid/src/main/libs/
289mkdir -p ${LIBRING_JNI_ANDROID_DIR}
290cp -r ${LIBRING_JNI_DIR} ${LIBRING_JNI_ANDROID_DIR}