blob: ce477dc78eb7dd54729a7343dbd224811a108ac4 [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
Adrien Béraud86759bb2016-09-28 13:54:54 -040066 LIBDIR=lib64
67else
Adrien Béraud86759bb2016-09-28 13:54:54 -040068 LIBDIR=lib
69fi
Adrien Béraud97dcf022018-12-08 22:00:47 -050070ANDROID_API_VERS=21
Adrien Béraud86759bb2016-09-28 13:54:54 -040071ANDROID_API=android-$ANDROID_API_VERS
72
73export ANDROID_TOOLCHAIN="`pwd`/android-toolchain-$ANDROID_API_VERS-$PLATFORM_SHORT_ARCH"
74if [ ! -d "$ANDROID_TOOLCHAIN" ]; then
75 $ANDROID_NDK/build/tools/make_standalone_toolchain.py \
76 --arch=$PLATFORM_SHORT_ARCH \
77 --api $ANDROID_API_VERS \
78 --stl libc++ \
79 --install-dir=$ANDROID_TOOLCHAIN
80fi
81
82GCCVER=clang
83CXXSTL="/"${GCCVER}
84
85export GCCVER
86export CXXSTL
87export ANDROID_API
88export TARGET_TUPLE
89export PATH_HOST
90export HAVE_ARM
91export HAVE_X86
92export HAVE_MIPS
93export HAVE_64
94export PLATFORM_SHORT_ARCH
95
96# Add the NDK toolchain to the PATH, needed both for contribs and for building
97# stub libraries
98NDK_TOOLCHAIN_PATH=`echo ${ANDROID_TOOLCHAIN}/bin`
99export NDK_TOOLCHAIN_PATH=${NDK_TOOLCHAIN_PATH}
100export PATH=${NDK_TOOLCHAIN_PATH}:${PATH}
101
102if [ -z "$DAEMON_DIR" ]; then
103 DAEMON_DIR="$(pwd)/../daemon"
104 echo "DAEMON_DIR not provided trying to find it in $DAEMON_DIR"
105fi
106
107if [ ! -d "$DAEMON_DIR" ]; then
108 echo 'Daemon not found.'
109 echo 'If you cloned the daemon in a custom location override' \
110 'DAEMON_DIR to point to it'
111 echo "You can also use our meta repo which contains both:
112 https://gerrit-ring.savoirfairelinux.com/#/admin/projects/ring-project"
113 exit 1
114fi
115
Adrien Béraud86759bb2016-09-28 13:54:54 -0400116# Setup LDFLAGS
Adrien Béraud97dcf022018-12-08 22:00:47 -0500117if [ ${ANDROID_ABI} = "armeabi-v7a" ] ; then
Adrien Béraudb8f99fd2018-12-19 14:54:28 -0500118 EXTRA_CFLAGS="${EXTRA_CFLAGS} -march=armv7-a -mthumb -mfpu=vfpv3-d16"
119 EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -march=armv7-a -mthumb -mfpu=vfpv3-d16"
Adrien Béraudd088a982017-02-09 14:38:36 -0500120elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
121 EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_TOOLCHAIN}/sysroot/usr/lib -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/lib"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400122fi
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400123EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR}/${ANDROID_ABI} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR}"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400124
Adrien Béraud86759bb2016-09-28 13:54:54 -0400125# Make in //
126UNAMES=$(uname -s)
127MAKEFLAGS=
128if which nproc >/dev/null
129then
130MAKEFLAGS=-j`nproc`
131elif [ "$UNAMES" == "Darwin" ] && which sysctl >/dev/null
132then
133MAKEFLAGS=-j`sysctl -n machdep.cpu.thread_count`
134fi
135
136# Build buildsystem tools
Alexandre Lision123e0002018-01-02 16:20:49 -0500137cd $DAEMON_DIR/extras/tools
Adrien Béraud86759bb2016-09-28 13:54:54 -0400138export PATH=`pwd`/extras/tools/build/bin:$PATH
139echo "Building tools"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400140./bootstrap
141make $MAKEFLAGS
Alexandre Lisionf7547c72017-07-27 14:07:12 -0400142make .pkg-config
Adrien Beraud44a7a232017-06-22 18:58:31 +0200143make .gas
Alexandre Lision123e0002018-01-02 16:20:49 -0500144
145JNIDIR=$DAEMON_DIR/bin/jni
146PACKAGEDIR=$ANDROID_APP_DIR/libringclient/src/main/java/cx/ring/daemon
147
148#Build JNI interface
149cd $JNIDIR
150PACKAGEDIR=$PACKAGEDIR $JNIDIR/make-swig.sh
Adrien Béraud86759bb2016-09-28 13:54:54 -0400151
152############
153# Contribs #
154############
Alexandre Lision123e0002018-01-02 16:20:49 -0500155cd $DAEMON_DIR
Adrien Béraud86759bb2016-09-28 13:54:54 -0400156echo "Building the contribs"
157mkdir -p contrib/native-${TARGET_TUPLE}
158
Alexandre Lisionccf20632018-01-04 10:32:53 -0500159CROSS_COMPILE=${NDK_TOOLCHAIN_PATH}/${TARGET_TUPLE}-
Adrien Béraud86759bb2016-09-28 13:54:54 -0400160export CROSS_COMPILE="${CROSS_COMPILE}"
161
162mkdir -p contrib/${TARGET_TUPLE}/lib/pkgconfig
163
Alexandre Lision123e0002018-01-02 16:20:49 -0500164cd $DAEMON_DIR/contrib/native-${TARGET_TUPLE}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400165../bootstrap --host=${TARGET_TUPLE} --disable-libav --enable-ffmpeg --disable-speexdsp
166
Alexandre Lision2875f122016-11-08 10:52:25 -0500167# Always strip symbols for libring.so remove it if you want to debug the daemon
168STRIP_ARG="-s "
169
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400170EXTRA_CFLAGS="${EXTRA_CFLAGS} -DNDEBUG -fPIC -fno-integrated-as"
171EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} -DNDEBUG -fPIC"
172EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${SYSROOT}/usr/${LIBDIR}"
173
Romain Bertozzi32692de2016-10-27 15:16:46 -0400174if [ "${RELEASE}" -eq 1 ]; then
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400175 echo "Daemon in release mode."
Adrien Béraud86759bb2016-09-28 13:54:54 -0400176 OPTS=""
Adrien Béraud86759bb2016-09-28 13:54:54 -0400177else
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400178 echo "Daemon in debug mode."
Adrien Béraud86759bb2016-09-28 13:54:54 -0400179 OPTS="--enable-debug"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400180fi
181
182export SYSROOT=$ANDROID_TOOLCHAIN/sysroot
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400183echo "EXTRA_CFLAGS= ${EXTRA_CFLAGS}" >> config.mak
184echo "EXTRA_CXXFLAGS= ${EXTRA_CXXFLAGS}" >> config.mak
185echo "EXTRA_LDFLAGS= ${EXTRA_LDFLAGS}" >> config.mak
Adrien Béraud86759bb2016-09-28 13:54:54 -0400186export RING_EXTRA_CFLAGS="${EXTRA_CFLAGS}"
187export RING_EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS}"
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400188export RING_EXTRA_LDFLAGS="${EXTRA_LDFLAGS}"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400189
190make list
191make fetch
192export PATH="$PATH:$PWD/../$TARGET_TUPLE/bin"
Guillaume Roguez6b4c02b2016-12-14 19:04:16 -0500193make $MAKEFLAGS
Adrien Béraud86759bb2016-09-28 13:54:54 -0400194
195############
196# Make Ring #
197############
Alexandre Lision123e0002018-01-02 16:20:49 -0500198cd $DAEMON_DIR
Adrien Béraud86759bb2016-09-28 13:54:54 -0400199RING_SRC_DIR="${DAEMON_DIR}"
200RING_BUILD_DIR="`realpath build-android-${TARGET_TUPLE}`"
201export RING_SRC_DIR="${RING_SRC_DIR}"
202export RING_BUILD_DIR="${RING_BUILD_DIR}"
203
204mkdir -p build-android-${TARGET_TUPLE}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400205cd ${ANDROID_APP_DIR}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400206
207if [ ! -f config.h ]; then
208 echo "Bootstraping"
209 cd ${DAEMON_DIR}
210 ./autogen.sh
211 cd "${DAEMON_DIR}/build-android-${TARGET_TUPLE}"
212 echo "Configuring with ${OPTS}"
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400213 CFLAGS="${EXTRA_CFLAGS}" \
214 CXXFLAGS="${EXTRA_CXXFLAGS}" \
215 LDFLAGS="${EXTRA_LDFLAGS}" \
Adrien Béraud86759bb2016-09-28 13:54:54 -0400216 ${ANDROID_TOPLEVEL_DIR}/configure.sh ${OPTS}
217fi
218
219if [ ${ANDROID_API} = "android-21" ] ; then
220 # android-21 has empty sys/shm.h headers that triggers shm detection but it
221 # doesn't have any shm functions and/or symbols. */
222 export ac_cv_header_sys_shm_h=no
223fi
224if [ ${ANDROID_ABI} = "x86" -a ${ANDROID_API} != "android-21" ] ; then
225 # NDK x86 libm.so has nanf symbol but no nanf definition, we don't known if
226 # intel devices has nanf. Assume they don't have it.
227 export ac_cv_lib_m_nanf=no
228fi
229
230echo "Building dring ${MAKEFLAGS}"
231V=99 make $MAKEFLAGS
232
Alexandre Lisionccf20632018-01-04 10:32:53 -0500233######################
234# Building JNI library
235######################
Adrien Béraud86759bb2016-09-28 13:54:54 -0400236cd ${ANDROID_TOPLEVEL_DIR}
237
238STATIC_LIBS_ALL="-llog -lOpenSLES -landroid \
239 -lopendht \
240 -lpjsip-${PJ_TARGET_TUPLE} \
241 -lpjsip-simple-${PJ_TARGET_TUPLE} \
242 -lpjsip-ua-${PJ_TARGET_TUPLE} -lpjsua-${PJ_TARGET_TUPLE} \
243 -lpjnath-${PJ_TARGET_TUPLE} \
244 -lpjmedia-${PJ_TARGET_TUPLE} \
245 -lpjlib-util-${PJ_TARGET_TUPLE} \
246 -lpj-${PJ_TARGET_TUPLE} \
247 -lupnp -lixml -lthreadutil \
Adrien Béraud94bd50e2017-09-29 14:54:31 +0200248 -lsecp256k1 \
Adrien Béraudee173382019-01-19 01:46:51 -0500249 -lgnutls -lhogweed -lnettle -lgmp \
Sébastien Blin33339972018-03-09 14:00:57 -0500250 -lrestbed -lssl -lcrypto \
Adrien Béraud543579b2018-06-01 15:53:44 -0400251 -lavformat -lavdevice -lavfilter -lavcodec -lswresample -lswscale -lavutil \
philippegorleyaaae6f52018-07-30 11:47:23 -0400252 -lpcre -lyaml-cpp -ljsoncpp \
Adrien Béraud543579b2018-06-01 15:53:44 -0400253 -luuid -lz \
philippegorleya8b81c42018-08-03 14:40:00 -0400254 -lvpx -lopus -lspeex \
Aline Bonneta14f6062017-05-04 10:33:24 -0400255 -largon2 \
Adrien Beraud6c9d1582017-04-24 23:17:19 +0200256 -liconv"
257
Adrien Béraud86759bb2016-09-28 13:54:54 -0400258LIBRING_JNI_DIR=${ANDROID_APP_DIR}/app/src/main/libs/${ANDROID_ABI}
259
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200260echo "Building Ring JNI library for Android to ${LIBRING_JNI_DIR}"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400261mkdir -p ${LIBRING_JNI_DIR}
Alexandre Lision084d3ad2017-05-08 16:13:59 -0400262
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200263${NDK_TOOLCHAIN_PATH}/clang++ \
264 --shared \
265 -Wall -Wextra \
266 -Wno-unused-variable \
267 -Wno-unused-function \
268 -Wno-unused-parameter \
Alexandre Lision123e0002018-01-02 16:20:49 -0500269 ${JNIDIR}/ring_wrapper.cpp \
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200270 ${RING_BUILD_DIR}/src/.libs/libring.a \
271 -static-libstdc++ \
Adrien Béraude0e1a392018-01-13 20:29:12 -0500272 -isystem ${RING_SRC_DIR}/contrib/${TARGET_TUPLE}/include \
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200273 -I${RING_SRC_DIR}/src \
274 -L${RING_SRC_DIR}/contrib/${TARGET_TUPLE}/lib \
275 ${STATIC_LIBS_ALL} \
Adrien Béraudd5bc7e12018-09-30 19:43:44 -0400276 ${STRIP_ARG} --std=c++14 -O3 -fPIC \
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200277 -o ${LIBRING_JNI_DIR}/libring.so