Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 1 | #! /bin/bash |
| 2 | # Build Ring daemon for architecture specified by ANDROID_ABI |
| 3 | |
| 4 | #for OSX/BSD |
| 5 | realpath() { |
| 6 | [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" |
| 7 | } |
| 8 | |
| 9 | set -e |
| 10 | |
| 11 | if [ -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 |
| 15 | fi |
| 16 | |
| 17 | if [ -z "$ANDROID_ABI" ]; then |
| 18 | echo "Please set ANDROID_ABI to your architecture: armeabi-v7a, x86." |
| 19 | exit 1 |
| 20 | fi |
| 21 | |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 22 | ANDROID_TOPLEVEL_DIR="`pwd`" |
| 23 | ANDROID_APP_DIR="$(pwd)/ring-android" |
| 24 | |
| 25 | HAVE_ARM=0 |
| 26 | HAVE_X86=0 |
| 27 | HAVE_MIPS=0 |
| 28 | HAVE_64=0 |
| 29 | |
| 30 | # Set up ABI variables |
| 31 | if [ ${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" |
| 37 | elif [ ${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" |
| 44 | elif [ ${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" |
| 50 | elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then |
| 51 | TARGET_TUPLE="aarch64-linux-android" |
Adrien Béraud | d088a98 | 2017-02-09 14:38:36 -0500 | [diff] [blame] | 52 | PJ_TARGET_TUPLE="aarch64-unknown-linux-android" |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 53 | PATH_HOST=$TARGET_TUPLE |
| 54 | HAVE_ARM=1 |
| 55 | HAVE_64=1 |
| 56 | PLATFORM_SHORT_ARCH="arm64" |
| 57 | else |
| 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" |
| 63 | fi |
| 64 | |
| 65 | if [ "${HAVE_64}" = 1 ];then |
| 66 | ANDROID_API_VERS=21 |
| 67 | LIBDIR=lib64 |
| 68 | else |
| 69 | ANDROID_API_VERS=16 |
| 70 | LIBDIR=lib |
| 71 | fi |
| 72 | ANDROID_API=android-$ANDROID_API_VERS |
| 73 | |
| 74 | export ANDROID_TOOLCHAIN="`pwd`/android-toolchain-$ANDROID_API_VERS-$PLATFORM_SHORT_ARCH" |
| 75 | if [ ! -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 |
| 81 | fi |
| 82 | |
| 83 | GCCVER=clang |
| 84 | CXXSTL="/"${GCCVER} |
| 85 | |
| 86 | export GCCVER |
| 87 | export CXXSTL |
| 88 | export ANDROID_API |
| 89 | export TARGET_TUPLE |
| 90 | export PATH_HOST |
| 91 | export HAVE_ARM |
| 92 | export HAVE_X86 |
| 93 | export HAVE_MIPS |
| 94 | export HAVE_64 |
| 95 | export PLATFORM_SHORT_ARCH |
| 96 | |
| 97 | # Add the NDK toolchain to the PATH, needed both for contribs and for building |
| 98 | # stub libraries |
| 99 | NDK_TOOLCHAIN_PATH=`echo ${ANDROID_TOOLCHAIN}/bin` |
| 100 | export NDK_TOOLCHAIN_PATH=${NDK_TOOLCHAIN_PATH} |
| 101 | export PATH=${NDK_TOOLCHAIN_PATH}:${PATH} |
| 102 | |
| 103 | if [ -z "$DAEMON_DIR" ]; then |
| 104 | DAEMON_DIR="$(pwd)/../daemon" |
| 105 | echo "DAEMON_DIR not provided trying to find it in $DAEMON_DIR" |
| 106 | fi |
| 107 | |
| 108 | if [ ! -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 |
| 115 | fi |
| 116 | |
Adrien Beraud | f2fe7d3 | 2017-05-14 13:27:19 -0400 | [diff] [blame] | 117 | EXTRA_CFLAGS="${EXTRA_CFLAGS} -O3" |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 118 | |
| 119 | # Setup LDFLAGS |
| 120 | if [ ${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" |
| 123 | elif [ ${ANDROID_ABI} = "armeabi-v7a" ] ; then |
| 124 | EXTRA_CFLAGS="${EXTRA_CFLAGS} -march=armv7-a -mthumb -mfloat-abi=softfp -mfpu=vfpv3-d16" |
Adrien Béraud | d088a98 | 2017-02-09 14:38:36 -0500 | [diff] [blame] | 125 | EXTRA_LDFLAGS="-march=armv7-a -mthumb -mfloat-abi=softfp -mfpu=vfpv3-d16" |
| 126 | elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then |
| 127 | EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_TOOLCHAIN}/sysroot/usr/lib -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/lib" |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 128 | fi |
Adrien Béraud | d088a98 | 2017-02-09 14:38:36 -0500 | [diff] [blame] | 129 | EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR}/${ANDROID_ABI} -L${ANDROID_TOOLCHAIN}/${TARGET_TUPLE}/${LIBDIR} -lm -latomic -landroid_support" |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 130 | |
| 131 | EXTRA_CXXFLAGS="${EXTRA_CFLAGS}" |
| 132 | EXTRA_CFLAGS="-std=c11 ${EXTRA_CFLAGS}" |
| 133 | |
| 134 | # Make in // |
| 135 | UNAMES=$(uname -s) |
| 136 | MAKEFLAGS= |
| 137 | if which nproc >/dev/null |
| 138 | then |
| 139 | MAKEFLAGS=-j`nproc` |
| 140 | elif [ "$UNAMES" == "Darwin" ] && which sysctl >/dev/null |
| 141 | then |
| 142 | MAKEFLAGS=-j`sysctl -n machdep.cpu.thread_count` |
| 143 | fi |
| 144 | |
| 145 | # Build buildsystem tools |
| 146 | cd "$DAEMON_DIR" |
| 147 | export PATH=`pwd`/extras/tools/build/bin:$PATH |
| 148 | echo "Building tools" |
| 149 | pushd extras/tools |
| 150 | ./bootstrap |
| 151 | make $MAKEFLAGS |
Adrien Beraud | 44a7a23 | 2017-06-22 18:58:31 +0200 | [diff] [blame] | 152 | make .gas |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 153 | popd |
| 154 | |
| 155 | ############ |
| 156 | # Contribs # |
| 157 | ############ |
| 158 | echo "Building the contribs" |
| 159 | mkdir -p contrib/native-${TARGET_TUPLE} |
| 160 | |
| 161 | ANDROID_BIN=${NDK_TOOLCHAIN_PATH} |
| 162 | CROSS_COMPILE=${ANDROID_BIN}/${TARGET_TUPLE}- |
| 163 | export CROSS_COMPILE="${CROSS_COMPILE}" |
| 164 | |
| 165 | mkdir -p contrib/${TARGET_TUPLE}/lib/pkgconfig |
| 166 | |
| 167 | pushd contrib/native-${TARGET_TUPLE} |
| 168 | ../bootstrap --host=${TARGET_TUPLE} --disable-libav --enable-ffmpeg --disable-speexdsp |
| 169 | |
| 170 | # Some libraries have arm assembly which won't build in thumb mode |
| 171 | # We append -marm to the CFLAGS of these libs to disable thumb mode |
| 172 | [ ${ANDROID_ABI} = "armeabi-v7a" ] && echo "NOTHUMB := -marm" >> config.mak |
| 173 | [ ${ANDROID_ABI} = "armeabi-v7a-hard" ] && echo "NOTHUMB := -marm" >> config.mak |
| 174 | |
Alexandre Lision | 2875f12 | 2016-11-08 10:52:25 -0500 | [diff] [blame] | 175 | # Always strip symbols for libring.so remove it if you want to debug the daemon |
| 176 | STRIP_ARG="-s " |
| 177 | |
Romain Bertozzi | 32692de | 2016-10-27 15:16:46 -0400 | [diff] [blame] | 178 | EXTRA_CFLAGS="${EXTRA_CFLAGS} -DNDEBUG " |
| 179 | if [ "${RELEASE}" -eq 1 ]; then |
| 180 | echo "Contribs in release mode." |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 181 | OPTS="" |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 182 | else |
Romain Bertozzi | 32692de | 2016-10-27 15:16:46 -0400 | [diff] [blame] | 183 | echo "Contribs in debug mode." |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 184 | OPTS="--enable-debug" |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 185 | fi |
| 186 | |
| 187 | export SYSROOT=$ANDROID_TOOLCHAIN/sysroot |
| 188 | echo "EXTRA_CFLAGS= -g -fpic ${EXTRA_CFLAGS}" >> config.mak |
| 189 | echo "EXTRA_CXXFLAGS= -g -fpic ${EXTRA_CXXFLAGS}" >> config.mak |
| 190 | echo "EXTRA_LDFLAGS= ${EXTRA_LDFLAGS} -L${SYSROOT}/usr/${LIBDIR}" >> config.mak |
| 191 | export RING_EXTRA_CFLAGS="${EXTRA_CFLAGS}" |
| 192 | export RING_EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS}" |
| 193 | export RING_EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${SYSROOT}/usr/${LIBDIR}" |
| 194 | |
| 195 | make list |
| 196 | make fetch |
| 197 | export PATH="$PATH:$PWD/../$TARGET_TUPLE/bin" |
Guillaume Roguez | 6b4c02b | 2016-12-14 19:04:16 -0500 | [diff] [blame] | 198 | make $MAKEFLAGS |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 199 | popd |
| 200 | |
| 201 | ############ |
| 202 | # Make Ring # |
| 203 | ############ |
| 204 | RING_SRC_DIR="${DAEMON_DIR}" |
| 205 | RING_BUILD_DIR="`realpath build-android-${TARGET_TUPLE}`" |
| 206 | export RING_SRC_DIR="${RING_SRC_DIR}" |
| 207 | export RING_BUILD_DIR="${RING_BUILD_DIR}" |
| 208 | |
| 209 | mkdir -p build-android-${TARGET_TUPLE} |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 210 | cd ${ANDROID_APP_DIR} |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 211 | |
| 212 | if [ ! -f config.h ]; then |
| 213 | echo "Bootstraping" |
| 214 | cd ${DAEMON_DIR} |
| 215 | ./autogen.sh |
| 216 | cd "${DAEMON_DIR}/build-android-${TARGET_TUPLE}" |
| 217 | echo "Configuring with ${OPTS}" |
| 218 | ${ANDROID_TOPLEVEL_DIR}/configure.sh ${OPTS} |
| 219 | fi |
| 220 | |
| 221 | if [ ${ANDROID_API} = "android-21" ] ; then |
| 222 | # android-21 has empty sys/shm.h headers that triggers shm detection but it |
| 223 | # doesn't have any shm functions and/or symbols. */ |
| 224 | export ac_cv_header_sys_shm_h=no |
| 225 | fi |
| 226 | if [ ${ANDROID_ABI} = "x86" -a ${ANDROID_API} != "android-21" ] ; then |
| 227 | # NDK x86 libm.so has nanf symbol but no nanf definition, we don't known if |
| 228 | # intel devices has nanf. Assume they don't have it. |
| 229 | export ac_cv_lib_m_nanf=no |
| 230 | fi |
| 231 | |
| 232 | echo "Building dring ${MAKEFLAGS}" |
| 233 | V=99 make $MAKEFLAGS |
| 234 | |
Aline Bonnet | aded8f2 | 2017-03-22 11:22:35 -0400 | [diff] [blame] | 235 | if [[ $DAEMON_ONLY -eq 1 ]]; then |
| 236 | exit 0 |
| 237 | fi |
| 238 | |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 239 | #################################### |
| 240 | # Ring android UI and specific code |
| 241 | #################################### |
| 242 | cd ${ANDROID_TOPLEVEL_DIR} |
| 243 | |
| 244 | STATIC_LIBS_ALL="-llog -lOpenSLES -landroid \ |
| 245 | -lopendht \ |
| 246 | -lpjsip-${PJ_TARGET_TUPLE} \ |
| 247 | -lpjsip-simple-${PJ_TARGET_TUPLE} \ |
| 248 | -lpjsip-ua-${PJ_TARGET_TUPLE} -lpjsua-${PJ_TARGET_TUPLE} \ |
| 249 | -lpjnath-${PJ_TARGET_TUPLE} \ |
| 250 | -lpjmedia-${PJ_TARGET_TUPLE} \ |
| 251 | -lpjlib-util-${PJ_TARGET_TUPLE} \ |
| 252 | -lpj-${PJ_TARGET_TUPLE} \ |
| 253 | -lupnp -lixml -lthreadutil \ |
| 254 | -lsamplerate \ |
Adrien Beraud | 6c9d158 | 2017-04-24 23:17:19 +0200 | [diff] [blame] | 255 | -lgnutls -lnettle -lhogweed -lgmp \ |
Adrien Béraud | 14ddd73 | 2016-10-03 11:46:15 -0400 | [diff] [blame] | 256 | -lcryptopp -lboost_random -lboost_system \ |
| 257 | -lrestbed \ |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 258 | -lavformat -lavdevice -lavcodec -lavfilter -lavutil \ |
| 259 | -lpcre -lsndfile -lyaml-cpp -ljsoncpp \ |
| 260 | -luuid -lz -lswscale \ |
Adrien Beraud | 6c9d158 | 2017-04-24 23:17:19 +0200 | [diff] [blame] | 261 | -lvpx -lopus -lspeex -lvorbis -lvorbisenc -logg -lFLAC \ |
Aline Bonnet | a14f606 | 2017-05-04 10:33:24 -0400 | [diff] [blame] | 262 | -largon2 \ |
Adrien Beraud | 6c9d158 | 2017-04-24 23:17:19 +0200 | [diff] [blame] | 263 | -liconv" |
| 264 | |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 265 | LIBRING_JNI_DIR=${ANDROID_APP_DIR}/app/src/main/libs/${ANDROID_ABI} |
| 266 | |
Adrien Beraud | 0f7aa2f | 2017-05-20 00:37:25 +0200 | [diff] [blame] | 267 | echo "Building Ring JNI library for Android to ${LIBRING_JNI_DIR}" |
Adrien Béraud | 86759bb | 2016-09-28 13:54:54 -0400 | [diff] [blame] | 268 | mkdir -p ${LIBRING_JNI_DIR} |
Alexandre Lision | 084d3ad | 2017-05-08 16:13:59 -0400 | [diff] [blame] | 269 | |
Adrien Beraud | 0f7aa2f | 2017-05-20 00:37:25 +0200 | [diff] [blame] | 270 | ${NDK_TOOLCHAIN_PATH}/clang++ \ |
| 271 | --shared \ |
| 272 | -Wall -Wextra \ |
| 273 | -Wno-unused-variable \ |
| 274 | -Wno-unused-function \ |
| 275 | -Wno-unused-parameter \ |
| 276 | ${ANDROID_APP_DIR}/libringclient/src/main/jni/ring_wrapper.cpp \ |
| 277 | ${RING_BUILD_DIR}/src/.libs/libring.a \ |
| 278 | -static-libstdc++ \ |
| 279 | -I${RING_SRC_DIR}/contrib/${TARGET_TUPLE}/include \ |
| 280 | -I${RING_SRC_DIR}/src \ |
| 281 | -L${RING_SRC_DIR}/contrib/${TARGET_TUPLE}/lib \ |
| 282 | ${STATIC_LIBS_ALL} \ |
| 283 | ${STRIP_ARG} --std=c++11 \ |
| 284 | -o ${LIBRING_JNI_DIR}/libring.so |
Alexandre Lision | 084d3ad | 2017-05-08 16:13:59 -0400 | [diff] [blame] | 285 | |
| 286 | # Copying native libs to androidtv folder too |
| 287 | LIBRING_JNI_ANDROIDTV_DIR=${ANDROID_APP_DIR}/androidtv/src/main/libs/ |
| 288 | mkdir -p ${LIBRING_JNI_ANDROIDTV_DIR} |
| 289 | cp -r ${LIBRING_JNI_DIR} ${LIBRING_JNI_ANDROIDTV_DIR} |