compile-libvlc.sh 14 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
if [ -z "$ANDROID_NDK" ]; then
    echo "Please set the ANDROID_NDK environment variable with its path."
    exit 1
fi

if [ -z "$ANDROID_ABI" ]; then
24 25 26 27 28
    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."
29 30 31
    exit 1
fi

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

43

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

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

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
# 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
114 115
SYSROOT=$ANDROID_NDK/platforms/$ANDROID_API/arch-$PLATFORM_SHORT_ARCH
SRC_DIR=$PWD
116 117 118 119 120
# Add the NDK toolchain to the PATH, needed both for contribs and for building
# stub libraries
NDK_TOOLCHAIN_PATH=`echo ${ANDROID_NDK}/toolchains/${PATH_HOST}-${GCCVER}/prebuilt/\`uname|tr A-Z a-z\`-*/bin`
export PATH=${NDK_TOOLCHAIN_PATH}:${PATH}

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
121 122 123 124 125 126 127 128 129 130 131 132 133 134

###############
# 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
135
echo "PATH:       $PATH"
136

137 138 139 140 141 142 143 144 145 146 147
# 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

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

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
156
EXTRA_CFLAGS=""
157
# Setup CFLAGS per ABI
158 159 160 161
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
162
    if [ -n "${ARMV5}" ]; then
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
        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
183 184
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"
185

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

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
188 189 190 191
#################
# Setup LDFLAGS #
#################
EXTRA_LDFLAGS="-L${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${GCCVER}/libs/${ANDROID_ABI} -lgnustl_static"
192

Edward Wang's avatar
Edward Wang committed
193 194 195
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
196
    if [ ${ANDROID_ABI} = "armeabi-v7a" ]; then
Edward Wang's avatar
Edward Wang committed
197 198 199
        EXTRA_PARAMS=" --enable-neon"
        LDFLAGS="$LDFLAGS -Wl,--fix-cortex-a8"
    fi
200 201
fi

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

204 205 206
# Release or not?
if [ "$RELEASE" = 1 ]; then
    OPTS=""
207
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -DNDEBUG "
208 209 210 211
else
    OPTS="--enable-debug"
fi

212

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
213 214
echo "CFLAGS:            ${CFLAGS}"
echo "EXTRA_CFLAGS:      ${EXTRA_CFLAGS}"
215

216 217 218

ANDROID_BIN=`echo $ANDROID_NDK/toolchains/${PATH_HOST}-${GCCVER}/prebuilt/\`uname|tr A-Z a-z\`-*/bin/`
export PATH=$ANDROID_BIN:$PATH
219 220 221 222
####################################################################################################

cd vlc

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

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

239
if [ ! -f configure ]; then
240 241
    echo "Bootstraping"
    ./bootstrap
242
    checkfail "vlc: bootstrap failed"
243 244
fi

245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
############
# 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}
265 266

ANDROID_API=${ANDROID_API} ../bootstrap --host=${TARGET_TUPLE} --disable-disc --disable-sout \
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
    --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
295
checkfail "contribs: bootstrap failed"
296 297 298 299 300 301 302 303 304

# 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
305 306
export VLC_EXTRA_CFLAGS="${EXTRA_CFLAGS}"                   # Makefile
export VLC_EXTRA_LDFLAGS="${EXTRA_LDFLAGS}"                 # Makefile
307 308

make fetch
309
checkfail "contribs: make fetch failed"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
310 311

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

321
cd ../../
322

323 324 325
###################
# BUILD DIRECTORY #
###################
326 327
VLC_BUILD_DIR=build-android-${TARGET_TUPLE}
mkdir -p $VLC_BUILD_DIR && cd $VLC_BUILD_DIR
328 329 330 331 332

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

333 334
CROSS_COMPILE=${ANDROID_BIN}/${TARGET_TUPLE}-

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

# 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
}

428
# if config dependencies change, ./config.status
429 430 431 432
# is run and overwrite previously hacked config.h. So call make config.h here
# and hack config.h after.

make $MAKEFLAGS config.h
433
checkfail "vlc: make config.h failed"
434 435 436 437 438 439 440 441 442 443 444 445 446

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

447 448
fi

449 450 451 452 453 454
############
# BUILDING #
############

echo "Building"
make $MAKEFLAGS
455
checkfail "vlc: make failed"
456

457
cd $SRC_DIR
458 459


460 461
######################################################################################
# libvlcJNI
462 463
######################################################################################

464 465 466
##################
# libVLC modules #
##################
467 468 469 470 471 472 473 474 475 476 477 478 479
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

480 481 482
###############################
# NDK-Build for libvlcjni.so  #
###############################
483 484 485

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

echo "Building NDK"

492
$ANDROID_NDK/ndk-build -C libvlc \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
493
    VLC_SRC_DIR="$VLC_SRC_DIR" \
494
    ANDROID_SYS_HEADERS="$ANDROID_SYS_HEADERS" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
495 496 497 498
    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
499
    EXTRA_LDFLAGS="$EXTRA_LDFLAGS" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
500 501 502 503
    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
504
    SYSROOT=${SYSROOT} \
505
    TARGET_TUPLE=$TARGET_TUPLE \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
506
    HAVE_64=${HAVE_64} \
507
    NDK_PROJECT_PATH=jni V=1