blob: 6548c4a3d1569e17081b1ae3bfbab222f1cd8a03 [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éraud8e5cfa62020-09-24 12:01:14 -040015platform=$(echo "`uname`" | tr '[:upper:]' '[:lower:]')
16arch=`uname -m`
17
Adrien Béraud86759bb2016-09-28 13:54:54 -040018ANDROID_TOPLEVEL_DIR="`pwd`"
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050019ANDROID_APP_DIR="${ANDROID_TOPLEVEL_DIR}/ring-android"
Adrien Béraud86759bb2016-09-28 13:54:54 -040020
21HAVE_ARM=0
22HAVE_X86=0
Adrien Béraud86759bb2016-09-28 13:54:54 -040023HAVE_64=0
24
25# Set up ABI variables
26if [ ${ANDROID_ABI} = "x86" ] ; then
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040027 TARGET="i686-linux-android"
28 PJ_TARGET="i686-pc-linux-android"
Adrien Béraud86759bb2016-09-28 13:54:54 -040029 HAVE_X86=1
30 PLATFORM_SHORT_ARCH="x86"
31elif [ ${ANDROID_ABI} = "x86_64" ] ; then
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040032 TARGET="x86_64-linux-android"
33 PJ_TARGET="x86_64-pc-linux-android"
Adrien Béraud86759bb2016-09-28 13:54:54 -040034 HAVE_X86=1
35 HAVE_64=1
36 PLATFORM_SHORT_ARCH="x86_64"
Adrien Béraud86759bb2016-09-28 13:54:54 -040037elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040038 TARGET="aarch64-linux-android"
39 PJ_TARGET="aarch64-unknown-linux-android"
Adrien Béraud86759bb2016-09-28 13:54:54 -040040 HAVE_ARM=1
41 HAVE_64=1
42 PLATFORM_SHORT_ARCH="arm64"
43else
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040044 TARGET_CC="armv7a-linux-androideabi"
45 TARGET="arm-linux-androideabi"
46 PJ_TARGET="arm-unknown-linux-androideabi"
Adrien Béraud86759bb2016-09-28 13:54:54 -040047 HAVE_ARM=1
48 PLATFORM_SHORT_ARCH="arm"
49fi
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040050TARGET_CC=${TARGET_CC:-$TARGET}
Adrien Béraud86759bb2016-09-28 13:54:54 -040051
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040052export API=21
53export ANDROID_API=android-$API
54export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/$platform-$arch
55export TARGET
Adrien Béraud86759bb2016-09-28 13:54:54 -040056export HAVE_ARM
57export HAVE_X86
Adrien Béraud86759bb2016-09-28 13:54:54 -040058export HAVE_64
Adrien Béraud86759bb2016-09-28 13:54:54 -040059
Adrien Béraud86759bb2016-09-28 13:54:54 -040060if [ -z "$DAEMON_DIR" ]; then
61 DAEMON_DIR="$(pwd)/../daemon"
62 echo "DAEMON_DIR not provided trying to find it in $DAEMON_DIR"
63fi
Adrien Béraud86759bb2016-09-28 13:54:54 -040064if [ ! -d "$DAEMON_DIR" ]; then
65 echo 'Daemon not found.'
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040066 echo 'If you cloned the daemon in a custom location override DAEMON_DIR to point to it'
Adrien Béraud86759bb2016-09-28 13:54:54 -040067 echo "You can also use our meta repo which contains both:
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050068 https://review.jami.net/#/admin/projects/ring-project"
Adrien Béraud86759bb2016-09-28 13:54:54 -040069 exit 1
70fi
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050071export DAEMON_DIR
Adrien Béraud86759bb2016-09-28 13:54:54 -040072
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050073if [ "${RELEASE}" -eq 1 ]; then
74 echo "Daemon in release mode."
75 OPTS=""
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050076else
77 echo "Daemon in debug mode."
78 OPTS="--enable-debug"
79fi
Adrien Béraud86759bb2016-09-28 13:54:54 -040080
Adrien Béraud86759bb2016-09-28 13:54:54 -040081# Make in //
Adrien Béraud86759bb2016-09-28 13:54:54 -040082MAKEFLAGS=
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040083if which nproc >/dev/null; then
Adrien Béraud86759bb2016-09-28 13:54:54 -040084MAKEFLAGS=-j`nproc`
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040085elif [ "$platform" == "darwin" ] && which sysctl >/dev/null; then
Adrien Béraud86759bb2016-09-28 13:54:54 -040086MAKEFLAGS=-j`sysctl -n machdep.cpu.thread_count`
87fi
88
89# Build buildsystem tools
Alexandre Lision123e0002018-01-02 16:20:49 -050090cd $DAEMON_DIR/extras/tools
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -050091export PATH=`pwd`/build/bin:$PATH
Adrien Béraud86759bb2016-09-28 13:54:54 -040092echo "Building tools"
Adrien Béraud86759bb2016-09-28 13:54:54 -040093./bootstrap
94make $MAKEFLAGS
Alexandre Lisionf7547c72017-07-27 14:07:12 -040095make .pkg-config
Adrien Beraud44a7a232017-06-22 18:58:31 +020096make .gas
Alexandre Lision123e0002018-01-02 16:20:49 -050097
Adrien Béraud8e5cfa62020-09-24 12:01:14 -040098# Generate JNI interface
Alexandre Lision123e0002018-01-02 16:20:49 -050099JNIDIR=$DAEMON_DIR/bin/jni
Alexandre Lision123e0002018-01-02 16:20:49 -0500100cd $JNIDIR
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400101PACKAGEDIR=$ANDROID_APP_DIR/libringclient/src/main/java/cx/ring/daemon $JNIDIR/make-swig.sh
102
103# Setup cross-compilation build environemnt
104export AR=$TOOLCHAIN/bin/$TARGET-ar
105export AS=$TOOLCHAIN/bin/$TARGET-as
106export CC=$TOOLCHAIN/bin/$TARGET_CC$API-clang
107export CXX=$TOOLCHAIN/bin/$TARGET_CC$API-clang++
108export LD=$TOOLCHAIN/bin/$TARGET-ld
109export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
110export STRIP=$TOOLCHAIN/bin/$TARGET-strip
111
112FLAGS_COMMON="-fPIC -g"
113EXTRA_CFLAGS="${EXTRA_CFLAGS} ${FLAGS_COMMON}"
114EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} ${FLAGS_COMMON}"
115EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -g"
116if [ ${ANDROID_ABI} = "armeabi-v7a" ] ; then
117 EXTRA_CFLAGS="${EXTRA_CFLAGS} -march=armv7-a -mthumb -mfpu=vfpv3-d16"
118 EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -march=armv7-a -mthumb -mfpu=vfpv3-d16"
119fi
Adrien Béraud86759bb2016-09-28 13:54:54 -0400120
121############
122# Contribs #
123############
124echo "Building the contribs"
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400125CONTRIB_DIR=${DAEMON_DIR}/contrib/native-${TARGET}
126CONTRIB_SYSROOT=${DAEMON_DIR}/contrib/${TARGET}
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500127mkdir -p ${CONTRIB_DIR}
128mkdir -p ${CONTRIB_SYSROOT}/lib/pkgconfig
Adrien Béraud86759bb2016-09-28 13:54:54 -0400129
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500130cd ${CONTRIB_DIR}
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400131../bootstrap --host=${TARGET} --enable-ffmpeg
Adrien Béraud86759bb2016-09-28 13:54:54 -0400132
133make list
134make fetch
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500135export PATH="$PATH:$CONTRIB_SYSROOT/bin"
Guillaume Roguez6b4c02b2016-12-14 19:04:16 -0500136make $MAKEFLAGS
Adrien Béraud86759bb2016-09-28 13:54:54 -0400137
138############
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500139# Make Jami daemon #
Adrien Béraud86759bb2016-09-28 13:54:54 -0400140############
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400141DAEMON_BUILD_DIR="${DAEMON_DIR}/build-android-${TARGET}"
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500142mkdir -p ${DAEMON_BUILD_DIR}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400143
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400144cd ${DAEMON_DIR}
145if [ ! -f configure ]; then
Adrien Béraud86759bb2016-09-28 13:54:54 -0400146 ./autogen.sh
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400147fi
148
149cd "${DAEMON_BUILD_DIR}"
150if [ ! -f config.h ]; then
Adrien Béraud86759bb2016-09-28 13:54:54 -0400151 echo "Configuring with ${OPTS}"
Adrien Béraudcbef9d62018-09-30 21:17:55 -0400152 CFLAGS="${EXTRA_CFLAGS}" \
153 CXXFLAGS="${EXTRA_CXXFLAGS}" \
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400154 CPPFLAGS="${CPPFLAGS} -I${DAEMON_DIR}/contrib/${TARGET}/include " \
155 LDFLAGS="${EXTRA_LDFLAGS} -L${DAEMON_DIR}/contrib/${TARGET}/lib " \
156 PKG_CONFIG_LIBDIR=$DAEMON_DIR/contrib/$TARGET/lib/pkgconfig \
157 ${DAEMON_DIR}/configure --host=$TARGET $EXTRA_PARAMS \
158 --disable-shared --with-opensl --without-dbus --without-alsa --without-pulse --enable-accel\
159 --prefix=$DAEMON_DIR/install-android-$TARGET \
160 ${OPTS}
Adrien Béraud86759bb2016-09-28 13:54:54 -0400161fi
162
163if [ ${ANDROID_API} = "android-21" ] ; then
164 # android-21 has empty sys/shm.h headers that triggers shm detection but it
165 # doesn't have any shm functions and/or symbols. */
166 export ac_cv_header_sys_shm_h=no
167fi
Adrien Béraud86759bb2016-09-28 13:54:54 -0400168
169echo "Building dring ${MAKEFLAGS}"
170V=99 make $MAKEFLAGS
171
Alexandre Lisionccf20632018-01-04 10:32:53 -0500172######################
173# Building JNI library
174######################
Adrien Béraud86759bb2016-09-28 13:54:54 -0400175cd ${ANDROID_TOPLEVEL_DIR}
176
177STATIC_LIBS_ALL="-llog -lOpenSLES -landroid \
178 -lopendht \
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400179 -lpjsip-${PJ_TARGET} \
180 -lpjsip-simple-${PJ_TARGET} \
181 -lpjsip-ua-${PJ_TARGET} -lpjsua-${PJ_TARGET} \
182 -lpjnath-${PJ_TARGET} \
183 -lpjmedia-${PJ_TARGET} \
184 -lpjlib-util-${PJ_TARGET} \
185 -lpj-${PJ_TARGET} \
Eden Abitbol638fe952019-06-04 10:34:07 -0400186 -lupnp -lixml \
Adrien Béraud1b538792020-06-29 11:39:23 -0400187 -larchive \
Adrien Béraud94bd50e2017-09-29 14:54:31 +0200188 -lsecp256k1 \
Adrien Béraudee173382019-01-19 01:46:51 -0500189 -lgnutls -lhogweed -lnettle -lgmp \
Vsevolod Ivanov97525bd2019-08-25 03:02:50 -0400190 -lssl -lcrypto \
Adrien Béraud543579b2018-06-01 15:53:44 -0400191 -lavformat -lavdevice -lavfilter -lavcodec -lswresample -lswscale -lavutil \
Adrien Béraud66faa232019-09-10 14:01:56 -0400192 -lyaml-cpp -ljsoncpp -lhttp_parser -lfmt\
ayounes5fa10682019-09-25 13:22:06 -0400193 -luuid -lz -ldl \
Adrien Béraud3a4b4b62020-02-21 22:57:48 -0500194 -lvpx -lopus -lspeex -lspeexdsp -lx264 \
Aline Bonneta14f6062017-05-04 10:33:24 -0400195 -largon2 \
Adrien Béraud1b538792020-06-29 11:39:23 -0400196 -liconv"
Adrien Beraud6c9d1582017-04-24 23:17:19 +0200197
Adrien Béraud86759bb2016-09-28 13:54:54 -0400198LIBRING_JNI_DIR=${ANDROID_APP_DIR}/app/src/main/libs/${ANDROID_ABI}
Adrien Béraud645da102020-09-28 10:17:11 -0400199LIBRING_JNI_UNSTRIPPED_DIR=${ANDROID_APP_DIR}/unstripped/${ANDROID_ABI}
200LIBCPP=$ANDROID_NDK/sources/cxx-stl/llvm-libc++/libs/${ANDROID_ABI}/libc++_shared.so
Adrien Béraud86759bb2016-09-28 13:54:54 -0400201
Adrien Béraudfd8a9ae2019-11-28 13:33:24 -0500202echo "Building Jami JNI library for Android to ${LIBRING_JNI_DIR}"
Adrien Béraud86759bb2016-09-28 13:54:54 -0400203mkdir -p ${LIBRING_JNI_DIR}
ayounes47e93992019-10-28 12:09:53 -0400204
ayounes5fa10682019-09-25 13:22:06 -0400205# Use a shared libc++_shared.so (shared by jami and all other plugins)
Adrien Béraud1623f0b2020-09-28 16:10:21 -0400206cp $LIBCPP $LIBRING_JNI_DIR
207
Adrien Béraud8e5cfa62020-09-24 12:01:14 -0400208${CXX} --shared \
209 -Wall -Wextra \
210 -Wno-unused-variable \
211 -Wno-unused-function \
212 -Wno-unused-parameter \
213 ${JNIDIR}/ring_wrapper.cpp \
214 ${DAEMON_BUILD_DIR}/src/.libs/libring.a \
215 -isystem ${DAEMON_DIR}/contrib/${TARGET}/include \
216 -I${DAEMON_DIR}/src \
217 -L${DAEMON_DIR}/contrib/${TARGET}/lib \
218 ${STATIC_LIBS_ALL} \
219 ${FLAGS_COMMON} -O3 --std=c++17 \
Adrien Béraud1623f0b2020-09-28 16:10:21 -0400220 -o ${LIBRING_JNI_DIR}/libring.so
Adrien Béraud645da102020-09-28 10:17:11 -0400221
Adrien Béraud1623f0b2020-09-28 16:10:21 -0400222if [ "${RELEASE}" -eq 1 ]; then
223 mkdir -p ${LIBRING_JNI_UNSTRIPPED_DIR}
224 cp ${LIBCPP} ${LIBRING_JNI_UNSTRIPPED_DIR}
225 cp ${LIBRING_JNI_DIR}/libring.so ${LIBRING_JNI_UNSTRIPPED_DIR}
226 ${STRIP} ${LIBRING_JNI_DIR}/libring.so
227fi