compile-libvlc.sh 13.7 KB
Newer Older
1 2
#!/bin/sh

3 4 5 6 7 8 9 10 11 12 13
#############
# FUNCTIONS #
#############

checkfail()
{
    if [ ! $? -eq 0 ];then
        echo "$1"
        exit 1
    fi
}
14 15 16 17

#############
# ARGUMENTS #
#############
18

19 20 21 22 23 24
if [ -z "$ANDROID_NDK" ]; then
    echo "Please set the ANDROID_NDK environment variable with its path."
    exit 1
fi

if [ -z "$ANDROID_ABI" ]; then
25 26 27 28 29
    echo "Please set ANDROID_ABI to your architecture:
    ARM:     armeabi-v7a, armeabi, armeabi-v5, armeabi-nofpu
    ARM64:   arm64-v8a
    X86:     x86, x86_64
    MIPS:    mips, mips64."
30 31 32
    exit 1
fi

33
RELEASE=0
34 35 36 37 38 39 40 41 42 43
for i in ${@}; do
    case "$i" in
        release|--release)
        RELEASE=1
        ;;
        *)
        ;;
    esac
done

44

45 46 47 48
#########
# FLAGS #
#########
# ARMv5 and ARMv6-nofpu are not really ABIs
49 50 51 52 53
if [ ${ANDROID_ABI} == "armeabi-nofpu" ];then
    NO_FPU=0
    ANDROID_ABI="armeabi"
fi
if [ ${ANDROID_ABI} == "armeabi-v5" ];then
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
54
    ARMV5=1
55 56 57 58 59 60 61 62 63 64
    NO_FPU=0
    ANDROID_ABI="armeabi"
fi
[ ${ANDROID_ABI} = "armeabi" ] && cat << EOF
For an ARMv6 device without FPU:
$ export ANDROID_ABI="armeabi-nofpu"
For an ARMv5 device:
$ export ANDROID_ABI="armeabi-v5"
EOF

65 66 67 68
# Set up ABI variables
if [ ${ANDROID_ABI} = "x86" ] ; then
    TARGET_TUPLE="i686-linux-android"
    PATH_HOST="x86"
69
    PLATFORM_SHORT_ARCH="x86"
70 71 72
elif [ ${ANDROID_ABI} = "x86_64" ] ; then
    TARGET_TUPLE="x86_64-linux-android"
    PATH_HOST="x86_64"
73
    PLATFORM_SHORT_ARCH="x86_64"
74 75 76 77
    HAVE_64=1
elif [ ${ANDROID_ABI} = "mips" ] ; then
    TARGET_TUPLE="mipsel-linux-android"
    PATH_HOST=$TARGET_TUPLE
78
    PLATFORM_SHORT_ARCH="mips"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
79 80 81
elif [ ${ANDROID_ABI} = "mips64" ] ; then
    TARGET_TUPLE="mips64el-linux-android"
    PATH_HOST=$TARGET_TUPLE
82
    PLATFORM_SHORT_ARCH="mips64"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
83
    HAVE_64=1
84 85 86 87 88
elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
    TARGET_TUPLE="aarch64-linux-android"
    PATH_HOST=$TARGET_TUPLE
    HAVE_ARM=1
    HAVE_64=1
89
    PLATFORM_SHORT_ARCH="arm64"
90 91 92 93
else
    TARGET_TUPLE="arm-linux-androideabi"
    PATH_HOST=$TARGET_TUPLE
    HAVE_ARM=1
94
    PLATFORM_SHORT_ARCH="arm"
95 96
fi

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
# try to detect NDK version
REL=$(grep -o '^r[0-9]*.*' $ANDROID_NDK/RELEASE.TXT 2>/dev/null|cut -b2-)
case "$REL" in
    10*)
        if [ "${HAVE_64}" = 1 ];then
            GCCVER=4.9
            ANDROID_API=android-21
        else
            GCCVER=4.8
            ANDROID_API=android-9
        fi
    ;;
    *)
        echo "You need the NDKv10 or later"
        exit 1
    ;;
esac

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
SYSROOT=$ANDROID_NDK/platforms/$ANDROID_API/arch-$PLATFORM_SHORT_ARCH
SRC_DIR=$PWD

###############
# DISPLAY ABI #
###############

echo "ABI:        $ANDROID_ABI"
echo "API:        $ANDROID_API"
echo "SYSROOT:    $SYSROOT"
if [ ! -z "$NO_FPU" ]; then
echo "FPU:        NO"
fi
if [ ! -z "$ARMV5" ]; then
echo "ARMv5:       YES"
fi

132

133 134 135 136 137 138 139 140 141 142 143
# Make in //
if [ -z "$MAKEFLAGS" ]; then
    UNAMES=$(uname -s)
    MAKEFLAGS=
    if which nproc >/dev/null; then
        MAKEFLAGS=-j`nproc`
    elif [ "$UNAMES" == "Darwin" ] && which sysctl >/dev/null; then
        MAKEFLAGS=-j`sysctl -n machdep.cpu.thread_count`
    fi
fi

144 145 146
##########
# CFLAGS #
##########
Edward Wang's avatar
Edward Wang committed
147
CFLAGS="-g -O2 -fstrict-aliasing -funsafe-math-optimizations"
Thomas Guillem's avatar
Thomas Guillem committed
148
if [ -n "$HAVE_ARM" -a ! -n "$HAVE_64" ]; then
Edward Wang's avatar
Edward Wang committed
149
    CFLAGS="${CFLAGS} -mlong-calls"
150 151
fi

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
152
EXTRA_CFLAGS=""
153
# Setup CFLAGS per ABI
154 155 156 157
if [ ${ANDROID_ABI} = "armeabi-v7a" ] ; then
    EXTRA_CFLAGS="-mfpu=vfpv3-d16 -mcpu=cortex-a8"
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -mthumb -mfloat-abi=softfp"
elif [ ${ANDROID_ABI} = "armeabi" ] ; then
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
158
    if [ -n "${ARMV5}" ]; then
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
        EXTRA_CFLAGS="-march=armv5te -mtune=arm9tdmi -msoft-float"
    else
        if [ -n "${NO_FPU}" ]; then
            EXTRA_CFLAGS="-march=armv6j -mtune=arm1136j-s -msoft-float"
        else
            EXTRA_CFLAGS="-mfpu=vfp -mcpu=arm1136jf-s -mfloat-abi=softfp"
        fi
    fi
elif [ ${ANDROID_ABI} = "x86" ] ; then
    EXTRA_CFLAGS="-march=pentium -m32"
elif [ ${ANDROID_ABI} = "mips" ] ; then
    EXTRA_CFLAGS="-march=mips32 -mtune=mips32r2 -mhard-float"
    # All MIPS Linux kernels since 2.4.4 will trap any unimplemented FPU
    # instruction and emulate it, so we select -mhard-float.
    # See http://www.linux-mips.org/wiki/Floating_point#The_Linux_kernel_and_floating_point
else
    echo "Unknown ABI. Die, die, die!"
    exit 2
fi

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
179 180
EXTRA_CFLAGS="${EXTRA_CFLAGS} -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${GCCVER}/include"
EXTRA_CFLAGS="${EXTRA_CFLAGS} -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${GCCVER}/libs/${ANDROID_ABI}/include"
181

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
182
CPPFLAGS="-I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${GCCVER}/include -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${GCCVER}/libs/${ANDROID_ABI}/include"
183

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
184 185 186 187
#################
# Setup LDFLAGS #
#################
EXTRA_LDFLAGS="-L${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${GCCVER}/libs/${ANDROID_ABI} -lgnustl_static"
188

Edward Wang's avatar
Edward Wang committed
189 190 191
LDFLAGS="-Wl,-Bdynamic,-dynamic-linker=/system/bin/linker -Wl,--no-undefined"

if [ -n "$HAVE_ARM" ]; then
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
192
    if [ ${ANDROID_ABI} = "armeabi-v7a" ]; then
Edward Wang's avatar
Edward Wang committed
193 194 195
        EXTRA_PARAMS=" --enable-neon"
        LDFLAGS="$LDFLAGS -Wl,--fix-cortex-a8"
    fi
196 197
fi

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
198
LDFLAGS="$LDFLAGS -L${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${GCCVER}/libs/${ANDROID_ABI}"
199

200 201 202
# Release or not?
if [ "$RELEASE" = 1 ]; then
    OPTS=""
203
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -DNDEBUG "
204 205 206 207
else
    OPTS="--enable-debug"
fi

208

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
209 210
echo "CFLAGS:            ${CFLAGS}"
echo "EXTRA_CFLAGS:      ${EXTRA_CFLAGS}"
211

212 213 214

ANDROID_BIN=`echo $ANDROID_NDK/toolchains/${PATH_HOST}-${GCCVER}/prebuilt/\`uname|tr A-Z a-z\`-*/bin/`
export PATH=$ANDROID_BIN:$PATH
215 216 217 218
####################################################################################################

cd vlc

219 220 221 222 223 224 225
###########################
# Build buildsystem tools #
###########################
export PATH=`pwd`/extras/tools/build/bin:$PATH
echo "Building tools"
cd extras/tools
./bootstrap
226
checkfail "buildsystem tools: bootstrap failed"
227
make $MAKEFLAGS
228
checkfail "buildsystem tools: make"
229
cd ../..
230 231 232 233 234

#############
# BOOTSTRAP #
#############

235
if [ ! -f configure ]; then
236 237
    echo "Bootstraping"
    ./bootstrap
238
    checkfail "vlc: bootstrap failed"
239 240
fi

241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
############
# Contribs #
############
echo "Building the contribs"
mkdir -p contrib/contrib-android-${TARGET_TUPLE}

gen_pc_file() {
    echo "Generating $1 pkg-config file"
    echo "Name: $1
Description: $1
Version: $2
Libs: -l$1
Cflags:" > contrib/${TARGET_TUPLE}/lib/pkgconfig/`echo $1|tr 'A-Z' 'a-z'`.pc
}

mkdir -p contrib/${TARGET_TUPLE}/lib/pkgconfig
gen_pc_file EGL 1.1
gen_pc_file GLESv2 2

cd contrib/contrib-android-${TARGET_TUPLE}
261 262

ANDROID_API=${ANDROID_API} ../bootstrap --host=${TARGET_TUPLE} --disable-disc --disable-sout \
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
    --enable-dvdread \
    --enable-dvdnav \
    --disable-dca \
    --disable-goom \
    --disable-chromaprint \
    --disable-lua \
    --disable-schroedinger \
    --disable-sdl \
    --disable-SDL_image \
    --disable-fontconfig \
    --enable-zvbi \
    --disable-kate \
    --disable-caca \
    --disable-gettext \
    --disable-mpcdec \
    --disable-upnp \
    --disable-gme \
    --disable-tremor \
    --enable-vorbis \
    --disable-sidplay2 \
    --disable-samplerate \
    --disable-faad2 \
    --disable-harfbuzz \
    --enable-iconv \
    --disable-aribb24 \
    --disable-aribb25 \
    --disable-mpg123 \
    --enable-libdsm
291
checkfail "contribs: bootstrap failed"
292 293 294 295 296 297 298 299 300

# TODO: mpeg2, theora

# Some libraries have arm assembly which won't build in thumb mode
# We append -marm to the CFLAGS of these libs to disable thumb mode
[ ${ANDROID_ABI} = "armeabi-v7a" ] && echo "NOTHUMB := -marm" >> config.mak

echo "EXTRA_CFLAGS= -g ${EXTRA_CFLAGS}" >> config.mak
echo "EXTRA_LDFLAGS= ${EXTRA_LDFLAGS}" >> config.mak
301 302
export VLC_EXTRA_CFLAGS="${EXTRA_CFLAGS}"                   # Makefile
export VLC_EXTRA_LDFLAGS="${EXTRA_LDFLAGS}"                 # Makefile
303 304

make fetch
305
checkfail "contribs: make fetch failed"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
306 307

# We already have zlib available in the NDK
308
[ -e .zlib ] || (mkdir -p zlib; touch .zlib)
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
309
# gettext
310
which autopoint >/dev/null || make $MAKEFLAGS .gettext
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
311
#export the PATH
312
export PATH="$PATH:$PWD/../$TARGET_TUPLE/bin"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
313
# Make
314
make $MAKEFLAGS
315
checkfail "contribs: make failed"
316

317
cd ../../
318

319 320 321
###################
# BUILD DIRECTORY #
###################
322 323
VLC_BUILD_DIR=build-android-${TARGET_TUPLE}
mkdir -p $VLC_BUILD_DIR && cd $VLC_BUILD_DIR
324 325 326 327 328

#############
# CONFIGURE #
#############

329 330
CROSS_COMPILE=${ANDROID_BIN}/${TARGET_TUPLE}-

331
if [ ! -e ./config.h ]; then
332
CPPFLAGS="$CPPFLAGS" \
333
CFLAGS="$CFLAGS ${VLC_EXTRA_CFLAGS} ${EXTRA_CFLAGS}" \
334 335 336 337 338 339 340 341
CXXFLAGS="$CFLAGS" \
LDFLAGS="$LDFLAGS" \
CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}" \
CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}" \
NM="${CROSS_COMPILE}nm" \
STRIP="${CROSS_COMPILE}strip" \
RANLIB="${CROSS_COMPILE}ranlib" \
AR="${CROSS_COMPILE}ar" \
342 343
PKG_CONFIG_LIBDIR=../contrib/$TARGET_TUPLE/lib/pkgconfig \
sh ../configure --host=$TARGET_TUPLE --build=x86_64-unknown-linux $EXTRA_PARAMS \
344
                --disable-nls \
345 346 347 348
                --enable-live555 --enable-realrtsp \
                --enable-avformat \
                --enable-swscale \
                --enable-avcodec \
349
                --enable-opus \
350 351 352 353
                --enable-opensles \
                --enable-android-surface \
                --enable-mkv \
                --enable-taglib \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
354
                --enable-dvbpsi \
355
                --disable-vlc --disable-shared \
356
                --disable-update-check \
357
                --disable-vlm \
358 359 360 361 362
                --disable-dbus \
                --disable-lua \
                --disable-vcd \
                --disable-v4l2 \
                --disable-gnomevfs \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
363
                --enable-dvdread \
364
                --enable-dvdnav \
365 366 367 368
                --disable-bluray \
                --disable-linsys \
                --disable-decklink \
                --disable-libva \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
369
                --disable-dv1394 \
370 371 372
                --disable-mod \
                --disable-sid \
                --disable-gme \
373
                --disable-tremor \
Thomas Guillem's avatar
Thomas Guillem committed
374
                --enable-mad \
375
                --disable-dca \
376
                --disable-sdl-image \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
377
                --enable-zvbi \
378 379 380 381 382 383 384 385
                --disable-fluidsynth \
                --disable-jack \
                --disable-pulse \
                --disable-alsa \
                --disable-samplerate \
                --disable-sdl \
                --disable-xcb \
                --disable-atmo \
Edward Wang's avatar
Edward Wang committed
386
                --disable-qt \
387 388 389
                --disable-skins2 \
                --disable-mtp \
                --disable-notify \
Sébastien Toque's avatar
Sébastien Toque committed
390
                --enable-libass \
391 392
                --disable-svg \
                --disable-udev \
393
                --enable-libxml2 \
394 395
                --disable-caca \
                --disable-glx \
396 397
                --enable-egl \
                --enable-gles2 \
398 399
                --disable-goom \
                --disable-projectm \
400
                --disable-sout \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
401
                --enable-vorbis \
Edward Wang's avatar
Edward Wang committed
402
                --disable-faad \
403 404
                --disable-x264 \
                --disable-schroedinger --disable-dirac \
405
                $OPTS
406
checkfail "vlc: configure failed"
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423

# ANDROID NDK FIXUP (BLAME GOOGLE)
config_undef ()
{
    unamestr=`uname`
    if [[ "$unamestr" == 'Darwin' ]]; then
        previous_change=`stat -f "%Sm" -t "%y%m%d%H%M.%S" config.h`
        sed -i '' 's,#define '$1' 1,/\* #undef '$1' \*/,' config.h
        touch -t "$previous_change" config.h
    else
        previous_change=`stat -c "%y" config.h`
        sed -i 's,#define '$1' 1,/\* #undef '$1' \*/,' config.h
        # don't change modified date in order to don't trigger a full build
        touch -d "$previous_change" config.h
    fi
}

424
# if config dependencies change, ./config.status
425 426 427 428
# is run and overwrite previously hacked config.h. So call make config.h here
# and hack config.h after.

make $MAKEFLAGS config.h
429
checkfail "vlc: make config.h failed"
430 431 432 433 434 435 436 437 438 439 440 441 442

if [ ${ANDROID_ABI} = "x86" -a ${ANDROID_API} != "android-21" ] ; then
    # NDK x86 libm.so has nanf symbol but no nanf definition, we don't known if
    # intel devices has nanf. Assume they don't have it.
    config_undef HAVE_NANF
fi
if [ ${ANDROID_API} = "android-21" ] ; then
    # android-21 has empty sys/shm.h headers that triggers shm detection but it
    # doesn't have any shm functions and/or symbols. */
    config_undef HAVE_SYS_SHM_H
fi
# END OF ANDROID NDK FIXUP

443 444
fi

445 446 447 448 449 450
############
# BUILDING #
############

echo "Building"
make $MAKEFLAGS
451
checkfail "vlc: make failed"
452

453
cd $SRC_DIR
454 455


456 457
######################################################################################
# libvlcJNI
458 459
######################################################################################

460 461 462
##################
# libVLC modules #
##################
463 464 465 466 467 468 469 470 471 472 473 474 475
echo "Generating static module list"
VLC_MODULES=`./find_modules.sh vlc/$VLC_BUILD_DIR`

DEFINITION="";
BUILTINS="const void *vlc_static_modules[] = {\n";
for file in $VLC_MODULES; do
	name=`echo $file | sed 's/.*\.libs\/lib//' | sed 's/_plugin\.a//'`; \
	DEFINITION=$DEFINITION"int vlc_entry__$name (int (*)(void *, void *, int, ...), void *);\n"; \
	BUILTINS="$BUILTINS vlc_entry__$name,\n"; \
done; \
BUILTINS="$BUILTINS NULL\n};\n"; \
printf "/* Autogenerated from the list of modules */\n $DEFINITION\n $BUILTINS\n" > libvlc/jni/libvlcjni.h

476 477 478
###############################
# NDK-Build for libvlcjni.so  #
###############################
479 480 481

LIBVLC_LIBS="libvlcjni"
VLC_MODULES=`echo $VLC_MODULES|sed "s|vlc/$VLC_BUILD_DIR|../vlc/$VLC_BUILD_DIR|g"`
482 483
VLC_SRC_DIR="$SRC_DIR/vlc"
ANDROID_SYS_HEADERS="$SRC_DIR/android-headers"
484
VLC_CONTRIB="$VLC_SRC_DIR/contrib/$TARGET_TUPLE"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
485 486 487

echo "Building NDK"

488
$ANDROID_NDK/ndk-build -C libvlc \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
489
    VLC_SRC_DIR="$VLC_SRC_DIR" \
490
    ANDROID_SYS_HEADERS="$ANDROID_SYS_HEADERS" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
491 492 493 494
    VLC_BUILD_DIR="$VLC_SRC_DIR/$VLC_BUILD_DIR" \
    VLC_CONTRIB="$VLC_CONTRIB" \
    VLC_MODULES="$VLC_MODULES" \
    TARGET_CFLAGS="$VLC_EXTRA_CFLAGS" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
495
    EXTRA_LDFLAGS="$EXTRA_LDFLAGS" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
496 497 498 499
    LIBVLC_LIBS="$LIBVLC_LIBS" \
    APP_BUILD_SCRIPT=jni/Android.mk \
    APP_PLATFORM=${ANDROID_API} \
    APP_ABI=${ANDROID_ABI} \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
500
    SYSROOT=${SYSROOT} \
501
    TARGET_TUPLE=$TARGET_TUPLE \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
502
    HAVE_64=${HAVE_64} \
503
    NDK_PROJECT_PATH=jni V=1