blob: bb48f0f31977edbc99dcac9c2b66e4bc7a2a04ef [file] [log] [blame]
Adrien Béraud86759bb2016-09-28 13:54:54 -04001#! /bin/bash
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -05002# Build Jami daemon for architecture specified by ANDROID_ABI
Adrien Béraud86759bb2016-09-28 13:54:54 -04003set -e
4
5if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
6 echo "You must define ANDROID_NDK, ANDROID_SDK and ANDROID_ABI before starting."
7 echo "They must point to your NDK and SDK directories."
8 exit 1
9fi
Adrien Béraud86759bb2016-09-28 13:54:54 -040010if [ -z "$ANDROID_ABI" ]; then
11 echo "Please set ANDROID_ABI to your architecture: armeabi-v7a, x86."
12 exit 1
13fi
14
Adrien Béraud86759bb2016-09-28 13:54:54 -040015ANDROID_TOPLEVEL_DIR="`pwd`"
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050016ANDROID_APP_DIR="${ANDROID_TOPLEVEL_DIR}/ring-android"
Adrien Béraud86759bb2016-09-28 13:54:54 -040017
18HAVE_ARM=0
19HAVE_X86=0
Adrien Béraud86759bb2016-09-28 13:54:54 -040020HAVE_64=0
21
22# Set up ABI variables
23if [ ${ANDROID_ABI} = "x86" ] ; then
24 TARGET_TUPLE="i686-linux-android"
25 PJ_TARGET_TUPLE="i686-pc-linux-android"
26 PATH_HOST="x86"
27 HAVE_X86=1
28 PLATFORM_SHORT_ARCH="x86"
29elif [ ${ANDROID_ABI} = "x86_64" ] ; then
30 TARGET_TUPLE="x86_64-linux-android"
31 PJ_TARGET_TUPLE="x86_64-pc-linux-android"
32 PATH_HOST="x86_64"
33 HAVE_X86=1
34 HAVE_64=1
35 PLATFORM_SHORT_ARCH="x86_64"
Adrien Béraud86759bb2016-09-28 13:54:54 -040036elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
37 TARGET_TUPLE="aarch64-linux-android"
Adrien Béraudd088a982017-02-09 14:38:36 -050038 PJ_TARGET_TUPLE="aarch64-unknown-linux-android"
Adrien Béraud86759bb2016-09-28 13:54:54 -040039 PATH_HOST=$TARGET_TUPLE
40 HAVE_ARM=1
41 HAVE_64=1
42 PLATFORM_SHORT_ARCH="arm64"
43else
44 TARGET_TUPLE="arm-linux-androideabi"
45 PJ_TARGET_TUPLE="arm-unknown-linux-androideabi"
46 PATH_HOST=$TARGET_TUPLE
47 HAVE_ARM=1
48 PLATFORM_SHORT_ARCH="arm"
49fi
50
51if [ "${HAVE_64}" = 1 ];then
Adrien Béraud86759bb2016-09-28 13:54:54 -040052 LIBDIR=lib64
53else
Adrien Béraud86759bb2016-09-28 13:54:54 -040054 LIBDIR=lib
55fi
Adrien Béraud97dcf022018-12-08 22:00:47 -050056ANDROID_API_VERS=21
Adrien Béraud86759bb2016-09-28 13:54:54 -040057ANDROID_API=android-$ANDROID_API_VERS
58
59export ANDROID_TOOLCHAIN="`pwd`/android-toolchain-$ANDROID_API_VERS-$PLATFORM_SHORT_ARCH"
60if [ ! -d "$ANDROID_TOOLCHAIN" ]; then
61 $ANDROID_NDK/build/tools/make_standalone_toolchain.py \
62 --arch=$PLATFORM_SHORT_ARCH \
63 --api $ANDROID_API_VERS \
64 --stl libc++ \
65 --install-dir=$ANDROID_TOOLCHAIN
66fi
67
Adrien Béraud86759bb2016-09-28 13:54:54 -040068export ANDROID_API
69export TARGET_TUPLE
Adrien Béraud86759bb2016-09-28 13:54:54 -040070export HAVE_ARM
71export HAVE_X86
Adrien Béraud86759bb2016-09-28 13:54:54 -040072export HAVE_64
Adrien Béraud86759bb2016-09-28 13:54:54 -040073
74# Add the NDK toolchain to the PATH, needed both for contribs and for building
75# stub libraries
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050076NDK_TOOLCHAIN_PATH="${ANDROID_TOOLCHAIN}/bin"
77CROSS_COMPILE=${NDK_TOOLCHAIN_PATH}/${TARGET_TUPLE}-
Adrien Béraud86759bb2016-09-28 13:54:54 -040078export PATH=${NDK_TOOLCHAIN_PATH}:${PATH}
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050079export CROSS_COMPILE="${CROSS_COMPILE}"
80export SYSROOT=$ANDROID_TOOLCHAIN/sysroot
Adrien Béraud86759bb2016-09-28 13:54:54 -040081
82if [ -z "$DAEMON_DIR" ]; then
83 DAEMON_DIR="$(pwd)/../daemon"
84 echo "DAEMON_DIR not provided trying to find it in $DAEMON_DIR"
85fi
86
87if [ ! -d "$DAEMON_DIR" ]; then
88 echo 'Daemon not found.'
89 echo 'If you cloned the daemon in a custom location override' \
90 'DAEMON_DIR to point to it'
91 echo "You can also use our meta repo which contains both:
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050092 https://review.jami.net/#/admin/projects/ring-project"
Adrien Béraud86759bb2016-09-28 13:54:54 -040093 exit 1
94fi
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050095export DAEMON_DIR
Adrien Béraud86759bb2016-09-28 13:54:54 -040096
Adrien Béraud86759bb2016-09-28 13:54:54 -040097# Setup LDFLAGS
Adrien Béraud97dcf022018-12-08 22:00:47 -050098if [ ${ANDROID_ABI} = "armeabi-v7a" ] ; then
Adrien Béraudb8f99fd2018-12-19 14:54:28 -050099 EXTRA_CFLAGS="${EXTRA_CFLAGS} -march=armv7-a -mthumb -mfpu=vfpv3-d16"
100 EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -march=armv7-a -mthumb -mfpu=vfpv3-d16"
Adrien Béraudd088a982017-02-09 14:38:36 -0500101elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500102 EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/lib"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400103fi
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400104EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR}/${ANDROID_ABI} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR}"
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500105EXTRA_CFLAGS="${EXTRA_CFLAGS} -fPIC"
106EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} -fPIC"
107EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${SYSROOT}/usr/${LIBDIR}"
108echo "EXTRA_CFLAGS= ${EXTRA_CFLAGS}" >> config.mak
109echo "EXTRA_CXXFLAGS= ${EXTRA_CXXFLAGS}" >> config.mak
110echo "EXTRA_LDFLAGS= ${EXTRA_LDFLAGS}" >> config.mak
111
112if [ "${RELEASE}" -eq 1 ]; then
113 echo "Daemon in release mode."
114 OPTS=""
115 STRIP_ARG="-s "
116else
117 echo "Daemon in debug mode."
118 OPTS="--enable-debug"
119fi
Adrien Béraud86759bb2016-09-28 13:54:54 -0400120
Adrien Béraud86759bb2016-09-28 13:54:54 -0400121# Make in //
122UNAMES=$(uname -s)
123MAKEFLAGS=
124if which nproc >/dev/null
125then
126MAKEFLAGS=-j`nproc`
127elif [ "$UNAMES" == "Darwin" ] && which sysctl >/dev/null
128then
129MAKEFLAGS=-j`sysctl -n machdep.cpu.thread_count`
130fi
131
132# Build buildsystem tools
Alexandre Lision123e0002018-01-02 16:20:49 -0500133cd $DAEMON_DIR/extras/tools
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500134export PATH=`pwd`/build/bin:$PATH
Adrien Béraud86759bb2016-09-28 13:54:54 -0400135echo "Building tools"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400136./bootstrap
137make $MAKEFLAGS
Alexandre Lisionf7547c72017-07-27 14:07:12 -0400138make .pkg-config
Adrien Beraud44a7a232017-06-22 18:58:31 +0200139make .gas
Alexandre Lision123e0002018-01-02 16:20:49 -0500140
141JNIDIR=$DAEMON_DIR/bin/jni
142PACKAGEDIR=$ANDROID_APP_DIR/libringclient/src/main/java/cx/ring/daemon
143
144#Build JNI interface
145cd $JNIDIR
146PACKAGEDIR=$PACKAGEDIR $JNIDIR/make-swig.sh
Adrien Béraud86759bb2016-09-28 13:54:54 -0400147
148############
149# Contribs #
150############
151echo "Building the contribs"
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500152CONTRIB_DIR=${DAEMON_DIR}/contrib/native-${TARGET_TUPLE}
153CONTRIB_SYSROOT=${DAEMON_DIR}/contrib/${TARGET_TUPLE}
154mkdir -p ${CONTRIB_DIR}
155mkdir -p ${CONTRIB_SYSROOT}/lib/pkgconfig
Adrien Béraud86759bb2016-09-28 13:54:54 -0400156
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500157cd ${CONTRIB_DIR}
158../bootstrap --host=${TARGET_TUPLE} --enable-ffmpeg --disable-speexdsp
Adrien Béraud86759bb2016-09-28 13:54:54 -0400159
160make list
161make fetch
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500162export PATH="$PATH:$CONTRIB_SYSROOT/bin"
Guillaume Roguez6b4c02b2016-12-14 19:04:16 -0500163make $MAKEFLAGS
Adrien Béraud86759bb2016-09-28 13:54:54 -0400164
165############
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500166# Make Jami daemon #
Adrien Béraud86759bb2016-09-28 13:54:54 -0400167############
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500168DAEMON_BUILD_DIR="${DAEMON_DIR}/build-android-${TARGET_TUPLE}"
169mkdir -p ${DAEMON_BUILD_DIR}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400170
171if [ ! -f config.h ]; then
Adrien Béraud86759bb2016-09-28 13:54:54 -0400172 cd ${DAEMON_DIR}
173 ./autogen.sh
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500174 cd "${DAEMON_BUILD_DIR}"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400175 echo "Configuring with ${OPTS}"
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400176 CFLAGS="${EXTRA_CFLAGS}" \
177 CXXFLAGS="${EXTRA_CXXFLAGS}" \
178 LDFLAGS="${EXTRA_LDFLAGS}" \
Adrien Béraud86759bb2016-09-28 13:54:54 -0400179 ${ANDROID_TOPLEVEL_DIR}/configure.sh ${OPTS}
180fi
181
182if [ ${ANDROID_API} = "android-21" ] ; then
183 # android-21 has empty sys/shm.h headers that triggers shm detection but it
184 # doesn't have any shm functions and/or symbols. */
185 export ac_cv_header_sys_shm_h=no
186fi
Adrien Béraud86759bb2016-09-28 13:54:54 -0400187
188echo "Building dring ${MAKEFLAGS}"
189V=99 make $MAKEFLAGS
190
Alexandre Lisionccf20632018-01-04 10:32:53 -0500191######################
192# Building JNI library
193######################
Adrien Béraud86759bb2016-09-28 13:54:54 -0400194cd ${ANDROID_TOPLEVEL_DIR}
195
196STATIC_LIBS_ALL="-llog -lOpenSLES -landroid \
197 -lopendht \
198 -lpjsip-${PJ_TARGET_TUPLE} \
199 -lpjsip-simple-${PJ_TARGET_TUPLE} \
200 -lpjsip-ua-${PJ_TARGET_TUPLE} -lpjsua-${PJ_TARGET_TUPLE} \
201 -lpjnath-${PJ_TARGET_TUPLE} \
202 -lpjmedia-${PJ_TARGET_TUPLE} \
203 -lpjlib-util-${PJ_TARGET_TUPLE} \
204 -lpj-${PJ_TARGET_TUPLE} \
Eden Abitbol638fe952019-06-04 10:34:07 -0400205 -lupnp -lixml \
Adrien Béraud94bd50e2017-09-29 14:54:31 +0200206 -lsecp256k1 \
Adrien Béraudee173382019-01-19 01:46:51 -0500207 -lgnutls -lhogweed -lnettle -lgmp \
Vsevolod Ivanov97525bd2019-08-25 03:02:50 -0400208 -lssl -lcrypto \
Adrien Béraud543579b2018-06-01 15:53:44 -0400209 -lavformat -lavdevice -lavfilter -lavcodec -lswresample -lswscale -lavutil \
Adrien Béraud66faa232019-09-10 14:01:56 -0400210 -lyaml-cpp -ljsoncpp -lhttp_parser -lfmt\
Adrien Béraud543579b2018-06-01 15:53:44 -0400211 -luuid -lz \
Adrien Béraudd8783852019-01-03 12:19:31 -0500212 -lvpx -lopus -lspeex -lx264 \
Aline Bonneta14f6062017-05-04 10:33:24 -0400213 -largon2 \
Adrien Beraud6c9d1582017-04-24 23:17:19 +0200214 -liconv"
215
Adrien Béraud86759bb2016-09-28 13:54:54 -0400216LIBRING_JNI_DIR=${ANDROID_APP_DIR}/app/src/main/libs/${ANDROID_ABI}
217
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500218echo "Building Jami JNI library for Android to ${LIBRING_JNI_DIR}"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400219mkdir -p ${LIBRING_JNI_DIR}
Alexandre Lision084d3ad2017-05-08 16:13:59 -0400220
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200221${NDK_TOOLCHAIN_PATH}/clang++ \
222 --shared \
223 -Wall -Wextra \
224 -Wno-unused-variable \
225 -Wno-unused-function \
226 -Wno-unused-parameter \
Alexandre Lision123e0002018-01-02 16:20:49 -0500227 ${JNIDIR}/ring_wrapper.cpp \
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500228 ${DAEMON_BUILD_DIR}/src/.libs/libring.a \
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200229 -static-libstdc++ \
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500230 -isystem ${DAEMON_DIR}/contrib/${TARGET_TUPLE}/include \
231 -I${DAEMON_DIR}/src \
232 -L${DAEMON_DIR}/contrib/${TARGET_TUPLE}/lib \
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200233 ${STATIC_LIBS_ALL} \
Adrien Béraudd5bc7e12018-09-30 19:43:44 -0400234 ${STRIP_ARG} --std=c++14 -O3 -fPIC \
Adrien Beraud0f7aa2f2017-05-20 00:37:25 +0200235 -o ${LIBRING_JNI_DIR}/libring.so