compile-libvlc.sh 24 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

Thomas Guillem's avatar
Thomas Guillem committed
15 16 17 18
#############
# ARGUMENTS #
#############

Geoffrey Métais's avatar
Geoffrey Métais committed
19
MEDIALIBRARY_HASH=a285ee80
20

21
RELEASE=0
Thomas Guillem's avatar
Thomas Guillem committed
22
ASAN=0
23 24 25 26 27 28 29 30 31 32 33
while [ $# -gt 0 ]; do
    case $1 in
        help|--help)
            echo "Use -a to set the ARCH"
            echo "Use --release to build in release mode"
            exit 1
            ;;
        a|-a)
            ANDROID_ABI=$2
            shift
            ;;
Thomas Guillem's avatar
Thomas Guillem committed
34 35 36
        -c)
            CHROME_OS=1
            ;;
Thomas Guillem's avatar
Thomas Guillem committed
37 38 39
        --asan)
            ASAN=1
            ;;
40 41 42 43 44 45 46
        release|--release)
            RELEASE=1
            ;;
    esac
    shift
done

47 48 49 50 51 52
if [ -z "$ANDROID_NDK" ]; then
    echo "Please set the ANDROID_NDK environment variable with its path."
    exit 1
fi

if [ -z "$ANDROID_ABI" ]; then
53 54
    echo "Please pass the ANDROID ABI to the correct architecture, using
                compile-libvlc.sh -a ARCH
55 56
    ARM:     (armeabi-v7a|arm)
    ARM64:   (arm64-v8a|arm64)
57 58
    X86:     x86, x86_64
    MIPS:    mips, mips64."
59 60 61
    exit 1
fi

62 63 64 65 66 67 68 69 70 71 72 73
###########################
# VLC BOOTSTRAP ARGUMENTS #
###########################

VLC_BOOTSTRAP_ARGS="\
    --disable-disc \
    --disable-sout \
    --enable-dvdread \
    --enable-dvdnav \
    --disable-dca \
    --disable-goom \
    --disable-chromaprint \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
74
    --enable-lua \
75 76 77 78 79 80 81 82 83
    --disable-schroedinger \
    --disable-sdl \
    --disable-SDL_image \
    --disable-fontconfig \
    --enable-zvbi \
    --disable-kate \
    --disable-caca \
    --disable-gettext \
    --disable-mpcdec \
Thomas Guillem's avatar
Thomas Guillem committed
84
    --enable-upnp \
85 86 87 88 89 90
    --disable-gme \
    --disable-tremor \
    --enable-vorbis \
    --disable-sidplay2 \
    --disable-samplerate \
    --disable-faad2 \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
91
    --enable-harfbuzz \
92 93 94
    --enable-iconv \
    --disable-aribb24 \
    --disable-aribb25 \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
95
    --enable-mpg123 \
96
    --enable-libdsm \
Thomas Guillem's avatar
Thomas Guillem committed
97
    --enable-libarchive \
Thomas Guillem's avatar
Thomas Guillem committed
98
    --disable-libmpeg2 \
Thomas Guillem's avatar
Thomas Guillem committed
99
    --enable-soxr \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
100
    --enable-nfs \
101
    --enable-microdns \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
102
    --enable-fluidlite \
Thomas Guillem's avatar
Thomas Guillem committed
103
    --disable-mad \
Geoffrey Métais's avatar
Geoffrey Métais committed
104 105 106
    --disable-vncclient \
    --disable-vnc \
    --enable-jpeg \
107 108 109 110 111 112 113 114 115 116 117 118 119 120
"

###########################
# VLC CONFIGURE ARGUMENTS #
###########################

VLC_CONFIGURE_ARGS="\
    --disable-nls \
    --enable-live555 --enable-realrtsp \
    --enable-avformat \
    --enable-swscale \
    --enable-avcodec \
    --enable-opus \
    --enable-opensles \
121
    --enable-matroska \
122 123 124 125 126 127
    --enable-taglib \
    --enable-dvbpsi \
    --disable-vlc --disable-shared \
    --disable-update-check \
    --disable-vlm \
    --disable-dbus \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
128
    --enable-lua \
129 130 131 132 133 134 135 136 137
    --disable-vcd \
    --disable-v4l2 \
    --enable-dvdread \
    --enable-dvdnav \
    --disable-bluray \
    --disable-linsys \
    --disable-decklink \
    --disable-libva \
    --disable-dv1394 \
138
    --enable-mod \
139 140 141
    --disable-sid \
    --disable-gme \
    --disable-tremor \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
142 143
    --disable-mad \
    --enable-mpg123 \
144 145 146 147
    --disable-dca \
    --disable-sdl-image \
    --enable-zvbi \
    --disable-fluidsynth \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
148
    --enable-fluidlite \
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
    --disable-jack \
    --disable-pulse \
    --disable-alsa \
    --disable-samplerate \
    --disable-sdl \
    --disable-xcb \
    --disable-qt \
    --disable-skins2 \
    --disable-mtp \
    --disable-notify \
    --enable-libass \
    --disable-svg \
    --disable-udev \
    --enable-libxml2 \
    --disable-caca \
    --enable-gles2 \
    --disable-goom \
    --disable-projectm \
    --disable-sout \
    --enable-vorbis \
    --disable-faad \
    --disable-x264 \
171
    --disable-schroedinger \
Geoffrey Métais's avatar
Geoffrey Métais committed
172 173 174
    --disable-vncclient \
    --disable-vnc \
    --enable-jpeg \
175 176
"

177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
########################
# VLC MODULE BLACKLIST #
########################

VLC_MODULE_BLACKLIST="
    addons.*
    stats
    access_(bd|shm|imem)
    oldrc
    real
    hotkeys
    gestures
    sap
    dynamicoverlay
    rss
    ball
    audiobargraph_[av]
    clone
    mosaic
    osdmenu
    puzzle
    mediadirs
    t140
    ripple
    motion
    sharpen
    grain
    posterize
    mirror
    wall
    scene
    blendbench
    psychedelic
    alphamask
    netsync
    audioscrobbler
    motiondetect
    motionblur
    export
    smf
    podcast
    bluescreen
    erase
    stream_filter_record
    speex_resampler
    remoteosd
    magnify
    gradient
    dtstofloat32
    logger
    visual
    fb
    aout_file
    yuv
    .dummy
"

234 235 236 237 238 239 240 241 242 243 244 245 246 247
# try to detect NDK version
REL=$(grep -o '^Pkg.Revision.*[0-9]*.*' $ANDROID_NDK/source.properties |cut -d " " -f 3 | cut -d "." -f 1)

if [ "$REL" -ge 13 ]; then
    if [ "${HAVE_64}" = 1 ];then
        ANDROID_API=21
    else
        ANDROID_API=9
    fi
else
    echo "You need the NDKv13 or later"
    exit 1
fi

248 249 250
#########
# FLAGS #
#########
251 252 253 254 255
if [ "${ANDROID_ABI}" = "arm" ] ; then
    ANDROID_ABI="armeabi-v7a"
elif [ "${ANDROID_ABI}" = "arm64" ] ; then
    ANDROID_ABI="arm64-v8a"
fi
Thomas Guillem's avatar
Thomas Guillem committed
256

257
# Set up ABI variables
Geoffrey Métais's avatar
Geoffrey Métais committed
258
if [ "${ANDROID_ABI}" = "x86" ] ; then
259 260
    TARGET_TUPLE="i686-linux-android"
    PATH_HOST="x86"
261
    PLATFORM_SHORT_ARCH="x86"
Geoffrey Métais's avatar
Geoffrey Métais committed
262
elif [ "${ANDROID_ABI}" = "x86_64" ] ; then
263 264
    TARGET_TUPLE="x86_64-linux-android"
    PATH_HOST="x86_64"
265
    PLATFORM_SHORT_ARCH="x86_64"
266
    HAVE_64=1
Geoffrey Métais's avatar
Geoffrey Métais committed
267
elif [ "${ANDROID_ABI}" = "mips" ] ; then
268 269
    TARGET_TUPLE="mipsel-linux-android"
    PATH_HOST=$TARGET_TUPLE
270
    PLATFORM_SHORT_ARCH="mips"
Geoffrey Métais's avatar
Geoffrey Métais committed
271
elif [ "${ANDROID_ABI}" = "mips64" ] ; then
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
272 273
    TARGET_TUPLE="mips64el-linux-android"
    PATH_HOST=$TARGET_TUPLE
274
    PLATFORM_SHORT_ARCH="mips64"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
275
    HAVE_64=1
Geoffrey Métais's avatar
Geoffrey Métais committed
276
elif [ "${ANDROID_ABI}" = "arm64-v8a" ] ; then
277 278 279 280
    TARGET_TUPLE="aarch64-linux-android"
    PATH_HOST=$TARGET_TUPLE
    HAVE_ARM=1
    HAVE_64=1
281
    PLATFORM_SHORT_ARCH="arm64"
Thomas Guillem's avatar
Thomas Guillem committed
282
elif [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
283 284 285
    TARGET_TUPLE="arm-linux-androideabi"
    PATH_HOST=$TARGET_TUPLE
    HAVE_ARM=1
286
    PLATFORM_SHORT_ARCH="arm"
287 288 289
else
    echo "Unknown ABI: '${ANDROID_ABI}'. Die, die, die!"
    exit 2
290 291
fi

292
NDK_FORCE_ARG=
Thomas Guillem's avatar
Thomas Guillem committed
293
NDK_TOOLCHAIN_DIR=${PWD}/toolchains/${PLATFORM_SHORT_ARCH}
294
NDK_TOOLCHAIN_PROPS=${NDK_TOOLCHAIN_DIR}/source.properties
Thomas Guillem's avatar
Thomas Guillem committed
295
NDK_TOOLCHAIN_PATH=${NDK_TOOLCHAIN_DIR}/bin
296 297 298 299 300 301

if [ "`cat \"${NDK_TOOLCHAIN_PROPS}\" 2>/dev/null`" != "`cat \"${ANDROID_NDK}/source.properties\"`" ];then
     echo "NDK changed, making new toolchain"
     NDK_FORCE_ARG="--force"
fi

Thomas Guillem's avatar
Thomas Guillem committed
302 303 304 305
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
    --arch ${PLATFORM_SHORT_ARCH} \
    --api ${ANDROID_API} \
    --stl libc++ \
306
    ${NDK_FORCE_ARG} \
Thomas Guillem's avatar
Thomas Guillem committed
307 308 309 310 311 312
    --install-dir ${NDK_TOOLCHAIN_DIR} 2> /dev/null
if [ ! -d ${NDK_TOOLCHAIN_PATH} ];
then
    echo "make_standalone_toolchain.py failed"
    exit 1
fi
313

314 315 316 317 318 319
if [ ! -z "${NDK_FORCE_ARG}" ];then
    # Don't mess up nl_langinfo() detection since this symbol is not present for 64
    # bits
    if [ "${HAVE_64}" = 1 ];then
        rm ${NDK_TOOLCHAIN_DIR}/sysroot/usr/local/include/langinfo.h
    fi
320 321
fi

322 323 324
if [ ! -z "${NDK_FORCE_ARG}" ];then
    cp "$ANDROID_NDK/source.properties" "${NDK_TOOLCHAIN_PROPS}"
fi
Thomas Guillem's avatar
Thomas Guillem committed
325

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
326
SRC_DIR=$PWD
327 328
# Add the NDK toolchain to the PATH, needed both for contribs and for building
# stub libraries
Thomas Guillem's avatar
Thomas Guillem committed
329
CROSS_TOOLS=${NDK_TOOLCHAIN_PATH}/${TARGET_TUPLE}-
Thomas Guillem's avatar
Thomas Guillem committed
330

331
export PATH=${NDK_TOOLCHAIN_PATH}:${PATH}
332 333 334 335
if [ ! -z "$MSYSTEM_PREFIX" ] ; then
    # The make.exe and awk.exe from the toolchain don't work in msys
    export PATH=$MSYSTEM_PREFIX/bin:/usr/bin:${NDK_TOOLCHAIN_PATH}:${PATH}
fi
336

337 338 339 340 341 342 343
ON_WINDOWS=0
if [ ! -z "$MSYSTEM_PREFIX" ] ; then
    # The make.exe and awk.exe from the toolchain don't work in msys
    export PATH=$MSYSTEM_PREFIX/bin:/usr/bin:${NDK_TOOLCHAIN_PATH}:${PATH}
    ON_WINDOWS=1
fi

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
344 345 346 347 348 349
###############
# DISPLAY ABI #
###############

echo "ABI:        $ANDROID_ABI"
echo "API:        $ANDROID_API"
350
echo "PATH:       $PATH"
351

352 353 354 355 356 357 358 359 360 361 362
# 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

363 364 365
##########
# CFLAGS #
##########
Thomas Guillem's avatar
Thomas Guillem committed
366

Thomas Guillem's avatar
Thomas Guillem committed
367 368
VLC_CFLAGS="-std=gnu11"
VLC_CXXFLAGS="-std=gnu++11"
369 370
if [ "$NO_OPTIM" = "1" ];
then
Thomas Guillem's avatar
Thomas Guillem committed
371
     VLC_CFLAGS="${VLC_CFLAGS} -g -O0"
372
else
Thomas Guillem's avatar
Thomas Guillem committed
373
     VLC_CFLAGS="${VLC_CFLAGS} -g -O2"
374
fi
Thomas Guillem's avatar
Thomas Guillem committed
375

Thomas Guillem's avatar
Thomas Guillem committed
376
VLC_CFLAGS="${VLC_CFLAGS} -fstrict-aliasing -funsafe-math-optimizations"
377

378
# Setup CFLAGS per ABI
Geoffrey Métais's avatar
Geoffrey Métais committed
379
if [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
Thomas Guillem's avatar
Thomas Guillem committed
380
    EXTRA_CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mcpu=cortex-a8"
381
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -mthumb -mfloat-abi=softfp"
Geoffrey Métais's avatar
Geoffrey Métais committed
382
elif [ "${ANDROID_ABI}" = "x86" ] ; then
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
383
    EXTRA_CFLAGS="-mtune=atom -msse3 -mfpmath=sse -m32"
Geoffrey Métais's avatar
Geoffrey Métais committed
384
elif [ "${ANDROID_ABI}" = "mips" ] ; then
385 386 387 388 389 390
    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
fi

Thomas Guillem's avatar
Thomas Guillem committed
391 392 393 394 395
EXTRA_CFLAGS="${EXTRA_CFLAGS} -MMD -MP -fpic -ffunction-sections -funwind-tables \
-fstack-protector-strong -Wno-invalid-command-line-argument -Wno-unused-command-line-argument \
-no-canonical-prefixes -fno-integrated-as"
EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} -fexceptions -frtti"
EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} -D__STDC_FORMAT_MACROS=1 -D__STDC_CONSTANT_MACROS=1 -D__STDC_LIMIT_MACROS=1"
396

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
397 398 399
#################
# Setup LDFLAGS #
#################
Thomas Guillem's avatar
Thomas Guillem committed
400

Thomas Guillem's avatar
Thomas Guillem committed
401
VLC_LDFLAGS=""
402
EXTRA_LDFLAGS=""
Thomas Guillem's avatar
Thomas Guillem committed
403
if [ ${ANDROID_ABI} = "armeabi-v7a" ]; then
Edward Wang's avatar
Edward Wang committed
404
        EXTRA_PARAMS=" --enable-neon"
405
        EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -Wl,--fix-cortex-a8"
406
fi
Thomas Guillem's avatar
Thomas Guillem committed
407
NDK_LIB_DIR="${NDK_TOOLCHAIN_DIR}/${TARGET_TUPLE}/lib"
Thomas Guillem's avatar
Thomas Guillem committed
408
if [ "${PLATFORM_SHORT_ARCH}" = "x86_64" -o "${PLATFORM_SHORT_ARCH}" = "mips64" ];then
Thomas Guillem's avatar
Thomas Guillem committed
409 410
    NDK_LIB_DIR="${NDK_LIB_DIR}64"
fi
411
NDK_LIB_UNWIND=""
Thomas Guillem's avatar
Thomas Guillem committed
412 413
if [ "${ANDROID_ABI}" = "armeabi-v7a" ];then
    NDK_LIB_DIR="${NDK_LIB_DIR}/armv7-a"
414
    NDK_LIB_UNWIND="-lunwind"
Thomas Guillem's avatar
Thomas Guillem committed
415
fi
416

417 418
EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${NDK_LIB_DIR} -lc++abi ${NDK_LIB_UNWIND}"
VLC_LDFLAGS="${EXTRA_LDFLAGS}"
419

420 421 422
# Release or not?
if [ "$RELEASE" = 1 ]; then
    OPTS=""
423
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -DNDEBUG "
Thomas Guillem's avatar
Thomas Guillem committed
424
    NDK_DEBUG=0
425 426
else
    OPTS="--enable-debug"
Thomas Guillem's avatar
Thomas Guillem committed
427
    NDK_DEBUG=1
428 429
fi

Thomas Guillem's avatar
Thomas Guillem committed
430 431 432 433 434 435
if [ "${ASAN}" = 1 ];then
    VLC_CFLAGS="${VLC_CFLAGS} -O0 -fno-omit-frame-pointer -fsanitize=address"
    VLC_CXXFLAGS="${VLC_CXXLAGS} -O0 -fno-omit-frame-pointer -fsanitize=address"
    VLC_LDFLAGS="${VLC_LDFLAGS} -ldl -fsanitize=address"
    # ugly, sorry
    if [ "${ANDROID_API}" = "9" ];then
436 437 438 439 440 441 442 443 444 445 446 447
        if [ ! -f vlc/contrib/${TARGET_TUPLE}/include/stdlib.h ]; then
            mkdir -p vlc/contrib/${TARGET_TUPLE}/include
            printf "#include_next <stdlib.h>\n"
                   "#ifdef __cplusplus\n"
                   "extern \"C\" {\n"
                   "#endif\n"
                   "extern int posix_memalign(void **memptr, size_t alignment, size_t size);\n"
                   "#ifdef __cplusplus\n"
                   "}\n"
                   "#endif\n" \
                > vlc/contrib/${TARGET_TUPLE}/include/stdlib.h
        fi
Thomas Guillem's avatar
Thomas Guillem committed
448 449 450
    fi
fi

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
451
echo "EXTRA_CFLAGS:      ${EXTRA_CFLAGS}"
Thomas Guillem's avatar
Thomas Guillem committed
452
echo "VLC_CFLAGS:        ${VLC_CFLAGS}"
453

454 455
cd vlc

456 457 458
###########################
# Build buildsystem tools #
###########################
Thomas Guillem's avatar
Thomas Guillem committed
459
VLC_SRC_DIR="$SRC_DIR/vlc"
Thomas Guillem's avatar
Thomas Guillem committed
460

461 462 463 464
export PATH=`pwd`/extras/tools/build/bin:$PATH
echo "Building tools"
cd extras/tools
./bootstrap
465
checkfail "buildsystem tools: bootstrap failed"
466
make $MAKEFLAGS
Thomas Guillem's avatar
Thomas Guillem committed
467
make $MAKEFLAGS .gas
468
checkfail "buildsystem tools: make"
469
cd ../..
470 471 472 473 474

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

475
if [ ! -f configure ]; then
476 477
    echo "Bootstraping"
    ./bootstrap
478
    checkfail "vlc: bootstrap failed"
479 480
fi

481 482 483
############
# Contribs #
############
Thomas Guillem's avatar
Thomas Guillem committed
484

485 486 487
echo "Building the contribs"
mkdir -p contrib/contrib-android-${TARGET_TUPLE}

488 489 490 491 492 493 494
# don't use the dummy uchar.c
if [ ! -f contrib/${TARGET_TUPLE}/include/uchar.h ]; then
    mkdir -p contrib/${TARGET_TUPLE}/include
    cp ${ANDROID_NDK}/platforms/android-24/arch-${PLATFORM_SHORT_ARCH}/usr/include/uchar.h \
        contrib/${TARGET_TUPLE}/include/uchar.h
fi

495 496 497 498 499 500 501 502 503 504 505 506 507 508
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}
509

Thomas Guillem's avatar
Thomas Guillem committed
510
ANDROID_ABI=${ANDROID_ABI} ANDROID_API=android-${ANDROID_API} \
511
    ../bootstrap --host=${TARGET_TUPLE} ${VLC_BOOTSTRAP_ARGS}
512
checkfail "contribs: bootstrap failed"
513 514 515 516 517

# 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

Thomas Guillem's avatar
Thomas Guillem committed
518 519
echo "EXTRA_CFLAGS=${EXTRA_CFLAGS}" >> config.mak
echo "EXTRA_CXXFLAGS=${EXTRA_CXXFLAGS}" >> config.mak
520
echo "EXTRA_LDFLAGS=${EXTRA_LDFLAGS}" >> config.mak
521

522
make $MAKEFLAGS fetch
523
checkfail "contribs: make fetch failed"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
524 525

# We already have zlib available in the NDK
526
[ -e .zlib ] || (mkdir -p zlib; touch .zlib)
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
527
# gettext
528
which autopoint >/dev/null || make $MAKEFLAGS .gettext
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
529
#export the PATH
530
export PATH="$PATH:$PWD/../$TARGET_TUPLE/bin"
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
531
# Make
532
make $MAKEFLAGS
533
checkfail "contribs: make failed"
534

535
cd ../../
536

537 538 539
###################
# BUILD DIRECTORY #
###################
Thomas Guillem's avatar
Thomas Guillem committed
540

Thomas Guillem's avatar
Thomas Guillem committed
541 542 543 544 545
if [ "${CHROME_OS}" = "1" ];then
    VLC_BUILD_DIR=build-chrome-${TARGET_TUPLE}
else
    VLC_BUILD_DIR=build-android-${TARGET_TUPLE}
fi
Thomas Guillem's avatar
Thomas Guillem committed
546 547 548
if [ "${ASAN}" = 1 ];then
    VLC_BUILD_DIR=${VLC_BUILD_DIR}-asan
fi
549
mkdir -p $VLC_BUILD_DIR && cd $VLC_BUILD_DIR
550 551 552 553 554

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

555 556 557 558
if [ "${CHROME_OS}" = "1" ];then
    # chrome OS doesn't have eventfd
    export ac_cv_func_eventfd=no
    export ac_cv_header_sys_eventfd_h=no
559
    export ac_cv_func_pipe2=no
560 561
fi

Thomas Guillem's avatar
Thomas Guillem committed
562
if [ ${ANDROID_API} = "21" ] ; then
563 564 565
    # android-21 has empty sys/shm.h headers that triggers shm detection but it
    # doesn't have any shm functions and/or symbols. */
    export ac_cv_header_sys_shm_h=no
Thomas Guillem's avatar
Thomas Guillem committed
566 567 568 569
else
    # force nanf and uselocale using libandroid_support since it's present in libc++
    export ac_cv_lib_m_nanf=yes
    export ac_cv_func_uselocale=yes
Thomas Guillem's avatar
Thomas Guillem committed
570

Thomas Guillem's avatar
Thomas Guillem committed
571
    VLC_LDFLAGS="${VLC_LDFLAGS} -L${NDK_LIB_DIR} -landroid_support"
572
fi
Thomas Guillem's avatar
Thomas Guillem committed
573

574
if [ ! -e ./config.h -o "$RELEASE" = 1 ]; then
Steve Lhomme's avatar
Steve Lhomme committed
575
CFLAGS="${VLC_CFLAGS} ${EXTRA_CFLAGS}" \
Thomas Guillem's avatar
Thomas Guillem committed
576 577 578 579 580 581 582 583
CXXFLAGS="${VLC_CXXFLAGS} ${EXTRA_CFLAGS} ${EXTRA_CXXFLAGS}" \
CC="${CROSS_TOOLS}clang" \
CXX="${CROSS_TOOLS}clang++" \
NM="${CROSS_TOOLS}nm" \
STRIP="${CROSS_TOOLS}strip" \
RANLIB="${CROSS_TOOLS}ranlib" \
AR="${CROSS_TOOLS}ar" \
PKG_CONFIG_LIBDIR=$VLC_SRC_DIR/contrib/$TARGET_TUPLE/lib/pkgconfig \
584
PKG_CONFIG_PATH=$VLC_SRC_DIR/contrib/$TARGET_TUPLE/lib/pkgconfig \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
585
PATH=../contrib/bin:$PATH \
586
sh ../configure --host=$TARGET_TUPLE --build=x86_64-unknown-linux \
Thomas Guillem's avatar
Thomas Guillem committed
587 588
    --with-contrib=${VLC_SRC_DIR}/contrib/${TARGET_TUPLE} \
    ${EXTRA_PARAMS} ${VLC_CONFIGURE_ARGS} ${OPTS}
589
checkfail "vlc: configure failed"
Thomas Guillem's avatar
Thomas Guillem committed
590
fi
591

592 593 594 595 596 597
############
# BUILDING #
############

echo "Building"
make $MAKEFLAGS
598
checkfail "vlc: make failed"
599

600
cd $SRC_DIR
601

Thomas Guillem's avatar
Thomas Guillem committed
602
echo ok
603

604 605 606
##################
# libVLC modules #
##################
Thomas Guillem's avatar
Thomas Guillem committed
607

608 609 610
REDEFINED_VLC_MODULES_DIR=$SRC_DIR/.modules/${VLC_BUILD_DIR}
rm -rf ${REDEFINED_VLC_MODULES_DIR}
mkdir -p ${REDEFINED_VLC_MODULES_DIR}
611

612
echo "Generating static module list"
613 614 615 616 617 618 619 620 621 622
blacklist_regexp=
for i in ${VLC_MODULE_BLACKLIST}
do
    if [ -z "${blacklist_regexp}" ]
    then
        blacklist_regexp="${i}"
    else
        blacklist_regexp="${blacklist_regexp}|${i}"
    fi
done
623

624 625 626 627 628 629 630 631 632 633 634
find_modules()
{
    echo "`find $1 -name 'lib*plugin.a' | grep -vE "lib(${blacklist_regexp})_plugin.a" | tr '\n' ' '`"
}

get_symbol()
{
    echo "$1" | grep vlc_entry_$2|cut -d" " -f 3
}

VLC_MODULES=$(find_modules vlc/$VLC_BUILD_DIR/modules)
635 636 637
DEFINITION="";
BUILTINS="const void *vlc_static_modules[] = {\n";
for file in $VLC_MODULES; do
638
    outfile=${REDEFINED_VLC_MODULES_DIR}/`basename $file`
639
    name=`echo $file | sed 's/.*\.libs\/lib//' | sed 's/_plugin\.a//'`;
Thomas Guillem's avatar
Thomas Guillem committed
640
    symbols=$("${CROSS_TOOLS}nm" -g $file)
641

642
    # assure that all modules have differents symbol names
643 644 645
    entry=$(get_symbol "$symbols" _)
    copyright=$(get_symbol "$symbols" copyright)
    license=$(get_symbol "$symbols" license)
646
    cat <<EOF > ${REDEFINED_VLC_MODULES_DIR}/syms
647 648 649 650
AccessOpen AccessOpen__$name
AccessClose AccessClose__$name
StreamOpen StreamOpen__$name
StreamClose StreamClose__$name
651 652
OpenDemux OpenDemux__$name
CloseDemux CloseDemux__$name
653 654 655 656 657 658
DemuxOpen DemuxOpen__$name
DemuxClose DemuxClose__$name
OpenFilter OpenFilter__$name
CloseFilter CloseFilter__$name
Open Open__$name
Close Close__$name
659 660 661 662
$entry vlc_entry__$name
$copyright vlc_entry_copyright__$name
$license vlc_entry_license__$name
EOF
Thomas Guillem's avatar
Thomas Guillem committed
663
    ${CROSS_TOOLS}objcopy --redefine-syms ${REDEFINED_VLC_MODULES_DIR}/syms $file $outfile
664 665 666 667 668
    checkfail "objcopy failed"

    DEFINITION=$DEFINITION"int vlc_entry__$name (int (*)(void *, void *, int, ...), void *);\n";
    BUILTINS="$BUILTINS vlc_entry__$name,\n";
done;
669
BUILTINS="$BUILTINS NULL\n};\n"; \
670 671 672 673 674 675 676 677 678 679 680
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > libvlc/jni/libvlcjni-modules.c

DEFINITION=""
BUILTINS="const void *libvlc_functions[] = {\n";
for func in `cat vlc/lib/libvlc.sym`
do
    DEFINITION=$DEFINITION"int $func(void);\n";
    BUILTINS="$BUILTINS $func,\n";
done
BUILTINS="$BUILTINS NULL\n};\n"; \
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > libvlc/jni/libvlcjni-symbols.c
681

682
rm ${REDEFINED_VLC_MODULES_DIR}/syms
683

684 685 686
############################################
# NDK-Build for libvlc.so and libvlcjni.so #
############################################
687 688

LIBVLC_LIBS="libvlcjni"
689
VLC_MODULES=$(find_modules ${REDEFINED_VLC_MODULES_DIR})
690
ANDROID_SYS_HEADERS="$SRC_DIR/android-headers"
691
VLC_CONTRIB="$VLC_SRC_DIR/contrib/$TARGET_TUPLE"
692
VLC_CONTRIB_LDFLAGS=`for i in $(/bin/ls $VLC_CONTRIB/lib/pkgconfig/*.pc); do PKG_CONFIG_PATH="$VLC_CONTRIB/lib/pkgconfig/" pkg-config --libs $i; done |xargs`
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
693

694 695
if [ "${CHROME_OS}" != "1" ];then
    if [ "${HAVE_64}" != 1 ];then
696 697 698 699
        # Can't link with 32bits symbols.
        # Not a problem since MediaCodec should work on 64bits devices (android-21)
        LIBIOMX_LIBS="libiomx.14 libiomx.13 libiomx.10"
        LIBANW_LIBS="libanw.10 libanw.13 libanw.14 libanw.18"
700 701
    fi
    # (after android Jelly Bean, we prefer to use MediaCodec instead of iomx)
Thomas Guillem's avatar
Thomas Guillem committed
702
    # LIBIOMX_LIBS="${LIBIOMX_LIBS} libiomx.19 libiomx.18"
703

704
    LIBANW_LIBS="$LIBANW_LIBS libanw.21"
705
fi
706

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
707 708
echo "Building NDK"

709 710 711 712 713
if [ $ON_WINDOWS -eq 1 ]; then
    OSCMD=.cmd
fi

$ANDROID_NDK/ndk-build$OSCMD -C libvlc \
Thomas Guillem's avatar
Thomas Guillem committed
714 715
    APP_STL="c++_shared" \
    LOCAL_CPP_FEATURES="rtti exceptions" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
716 717 718
    VLC_SRC_DIR="$VLC_SRC_DIR" \
    VLC_BUILD_DIR="$VLC_SRC_DIR/$VLC_BUILD_DIR" \
    VLC_CONTRIB="$VLC_CONTRIB" \
719
    VLC_CONTRIB_LDFLAGS="$VLC_CONTRIB_LDFLAGS" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
720
    VLC_MODULES="$VLC_MODULES" \
Thomas Guillem's avatar
Thomas Guillem committed
721
    VLC_LDFLAGS="$VLC_LDFLAGS" \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
722
    APP_BUILD_SCRIPT=jni/Android.mk \
Thomas Guillem's avatar
Thomas Guillem committed
723
    APP_PLATFORM=android-${ANDROID_API} \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
724
    APP_ABI=${ANDROID_ABI} \
725
    TARGET_TUPLE=$TARGET_TUPLE \
Thomas Guillem's avatar
Thomas Guillem committed
726
    NDK_PROJECT_PATH=jni \
Thomas Guillem's avatar
Thomas Guillem committed
727
    NDK_TOOLCHAIN_VERSION=clang \
Thomas Guillem's avatar
Thomas Guillem committed
728
    NDK_DEBUG=${NDK_DEBUG}
729

730
checkfail "ndk-build failed for libvlc"
731

732
$ANDROID_NDK/ndk-build$OSCMD -C libvlc \
Thomas Guillem's avatar
Thomas Guillem committed
733 734 735 736 737 738 739 740 741 742 743
    VLC_SRC_DIR="$VLC_SRC_DIR" \
    ANDROID_SYS_HEADERS="$ANDROID_SYS_HEADERS" \
    LIBIOMX_LIBS="$LIBIOMX_LIBS" \
    LIBANW_LIBS="$LIBANW_LIBS" \
    APP_BUILD_SCRIPT=private_libs/Android.mk \
    APP_PLATFORM=android-${ANDROID_API} \
    APP_ABI=${ANDROID_ABI} \
    TARGET_TUPLE=$TARGET_TUPLE \
    NDK_PROJECT_PATH=private_libs \
    NDK_TOOLCHAIN_VERSION=clang

744
checkfail "ndk-build failed for private libs"
Thomas Guillem's avatar
Thomas Guillem committed
745

Geoffrey Métais's avatar
Geoffrey Métais committed
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
################
# MEDIALIBRARY #
################

if [ ! -d "${SRC_DIR}/medialibrary" ]; then
    mkdir "${SRC_DIR}/medialibrary"
fi

##########
# SQLITE #
##########

MEDIALIBRARY_MODULE_DIR=${SRC_DIR}/medialibrary
MEDIALIBRARY_BUILD_DIR=${MEDIALIBRARY_MODULE_DIR}/medialibrary
OUT_LIB_DIR=$MEDIALIBRARY_MODULE_DIR/jni/libs/${ANDROID_ABI}
SQLITE_RELEASE="sqlite-autoconf-3120200"

if [ ! -d "${MEDIALIBRARY_MODULE_DIR}/${SQLITE_RELEASE}" ]; then
    echo -e "\e[1m\e[32msqlite source not found, downloading\e[0m"
    cd ${MEDIALIBRARY_MODULE_DIR}
    wget https://www.sqlite.org/2016/${SQLITE_RELEASE}.tar.gz
    tar -xzf ${SQLITE_RELEASE}.tar.gz
fi
cd ${MEDIALIBRARY_MODULE_DIR}/${SQLITE_RELEASE}
770 771
if [ ! -d "build-$ANDROID_ABI" ]; then
    mkdir "build-$ANDROID_ABI";
Geoffrey Métais's avatar
Geoffrey Métais committed
772
fi;
773
cd "build-$ANDROID_ABI";
774 775

if [ ! -e ./config.status -o "$RELEASE" = 1 ]; then
Geoffrey Métais's avatar
Geoffrey Métais committed
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
../configure \
    --host=$TARGET_TUPLE \
    --disable-shared \
    CFLAGS="${VLC_CFLAGS} ${EXTRA_CFLAGS}" \
    CXXFLAGS="${VLC_CXXFLAGS} ${EXTRA_CFLAGS} ${EXTRA_CXXFLAGS}" \
    CC="clang" \
    CXX="clang++"
fi

make $MAKEFLAGS

cd ${SRC_DIR}
checkfail "sqlite build failed"

##############################
# FETCH MEDIALIBRARY SOURCES #
##############################

if [ ! -d "${MEDIALIBRARY_MODULE_DIR}/medialibrary" ]; then
    echo -e "\e[1m\e[32mmedialibrary source not found, cloning\e[0m"
    git clone http://code.videolan.org/videolan/medialibrary.git "${SRC_DIR}/medialibrary/medialibrary"
    checkfail "medialibrary source: git clone failed"
798 799
    cd ${SRC_DIR}/medialibrary/medialibrary
    git submodule update --init libvlcpp
800
    cd -
801 802 803 804
else
    cd ${MEDIALIBRARY_MODULE_DIR}/medialibrary
    if ! git cat-file -e ${MEDIALIBRARY_HASH}; then
      git pull --rebase
805 806
      rm -rf ${MEDIALIBRARY_MODULE_DIR}/jni/libs
      rm -rf ${MEDIALIBRARY_MODULE_DIR}/jni/obj
807
    fi
808
    cd ${SRC_DIR}
Geoffrey Métais's avatar
Geoffrey Métais committed
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
fi

echo -e "\e[1m\e[36mCFLAGS:            ${CFLAGS}\e[0m"
echo -e "\e[1m\e[36mEXTRA_CFLAGS:      ${EXTRA_CFLAGS}\e[0m"

#################
# Setup folders #
#################


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

cd ${MEDIALIBRARY_BUILD_DIR}

825
sed "s#@prefix@#${MEDIALIBRARY_MODULE_DIR}/medialibrary/libvlcpp#g" $SRC_DIR/pkgs/libvlcpp.pc.in > \
Geoffrey Métais's avatar
Geoffrey Métais committed
826 827 828 829 830 831
    $SRC_DIR/pkgs/libvlcpp.pc;
sed "s#@libdir@#$SRC_DIR/libvlc/jni/libs/$ANDROID_ABI#g" $SRC_DIR/pkgs/libvlc.pc.in > \
    $SRC_DIR/pkgs/libvlc.pc;
sed -i "s#@includedirs@#-I${SRC_DIR}/vlc/include \
-I${SRC_DIR}/vlc/build-android-$TARGET_TUPLE/include#g" $SRC_DIR/pkgs/libvlc.pc;

832 833
if [ ! -d "build-android-$ANDROID_ABI/" ]; then
    mkdir "build-android-$ANDROID_ABI/";
Geoffrey Métais's avatar
Geoffrey Métais committed
834
fi;
835
cd "build-android-$ANDROID_ABI/";
Geoffrey Métais's avatar
Geoffrey Métais committed
836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851

if [ ! -e ./config.h -o "$RELEASE" = 1 ]; then
../bootstrap
../configure \
    --host=$TARGET_TUPLE \
    --disable-shared \
    CFLAGS="${VLC_CFLAGS} ${EXTRA_CFLAGS}" \
    CXXFLAGS="${VLC_CXXFLAGS} ${EXTRA_CFLAGS} ${EXTRA_CXXFLAGS}" \
    CC="clang" \
    CXX="clang++" \
    NM="${CROSS_TOOLS}nm" \
    STRIP="${CROSS_TOOLS}strip" \
    RANLIB="${CROSS_TOOLS}ranlib" \
    PKG_CONFIG_LIBDIR="$SRC_DIR/pkgs/" \
    LIBJPEG_LIBS="-L$SRC_DIR/vlc/contrib/contrib-android-$TARGET_TUPLE/jpeg/.libs -ljpeg" \
    LIBJPEG_CFLAGS="-I$SRC_DIR/vlc/contrib/$TARGET_TUPLE/include/" \
852
    SQLITE_LIBS="-L$MEDIALIBRARY_MODULE_DIR/$SQLITE_RELEASE/build-$ANDROID_ABI/.libs -lsqlite3" \
Geoffrey Métais's avatar
Geoffrey Métais committed
853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870
    SQLITE_CFLAGS="-I$MEDIALIBRARY_MODULE_DIR/$SQLITE_RELEASE" \
    AR="${CROSS_TOOLS}ar"
checkfail "medialibrary: autoconf failed"
fi

############
# BUILDING #
############

echo -e "\e[1m\e[32mBuilding medialibrary\e[0m"
make $MAKEFLAGS

checkfail "medialibrary: make failed"

cd ${SRC_DIR}

echo -e "ndk-build medialibrary"

871 872 873
MEDIALIBRARY_LDLIBS="-L$SRC_DIR/libvlc/jni/libs/$ANDROID_ABI -lvlc \
-L${MEDIALIBRARY_BUILD_DIR}/build-android-$ANDROID_ABI/.libs -lmedialibrary \
-L$SRC_DIR/vlc/contrib/contrib-android-$TARGET_TUPLE/jpeg/.libs -ljpeg \
874 875
-L$MEDIALIBRARY_MODULE_DIR/$SQLITE_RELEASE/build-$ANDROID_ABI/.libs -lsqlite3 \
-L${NDK_LIB_DIR} -lc++abi ${NDK_LIB_UNWIND}"
876

Geoffrey Métais's avatar
Geoffrey Métais committed
877 878 879 880 881 882
$ANDROID_NDK/ndk-build -C medialibrary \
    APP_STL="c++_shared" \
    ANDROID_SYS_HEADERS="$ANDROID_SYS_HEADERS" \
    APP_BUILD_SCRIPT=jni/Android.mk \
    APP_PLATFORM=android-${ANDROID_API} \
    APP_ABI=${ANDROID_ABI} \
883
    LOCAL_CPP_FEATURES="rtti exceptions" \
Geoffrey Métais's avatar
Geoffrey Métais committed
884 885 886 887
    TARGET_TUPLE=$TARGET_TUPLE \
    NDK_PROJECT_PATH=jni \
    NDK_TOOLCHAIN_VERSION=clang \
    NDK_DEBUG=${NDK_DEBUG} \
888 889
    MEDIALIBRARY_LDLIBS="${MEDIALIBRARY_LDLIBS}" \
    MEDIALIBRARY_INCLUDE_DIR=${MEDIALIBRARY_BUILD_DIR}/include
Geoffrey Métais's avatar
Geoffrey Métais committed
890 891 892 893 894 895 896 897 898 899 900 901 902 903 904

checkfail "ndk-build failed"

cd ${SRC_DIR}

if [ ! -d $OUT_LIB_DIR ]; then
    mkdir -p $OUT_LIB_DIR
fi

if [ "$RELEASE" = 1 ]; then
    echo -e "\e[1m\e[32mStripping\e[0m"
    ${CROSS_TOOLS}strip ${OUT_LIB_DIR}/*.so
    checkfail "stripping"
fi

905 906 907 908 909 910
VERSION=$(grep "android:versionName" vlc-android/AndroidManifest.xml|cut -d\" -f 2)
OUT_DBG_DIR=.dbg/${ANDROID_ABI}/$VERSION

echo "Dumping dbg symbols info ${OUT_DBG_DIR}"

mkdir -p $OUT_DBG_DIR
Thomas Guillem's avatar
Thomas Guillem committed
911 912
cp -a libvlc/jni/obj/local/${ANDROID_ABI}/*.so ${OUT_DBG_DIR}
cp -a libvlc/private_libs/obj/local/${ANDROID_ABI}/*.so ${OUT_DBG_DIR}
Geoffrey Métais's avatar
Geoffrey Métais committed
913
cp -a medialibrary/jni/obj/local/${ANDROID_ABI}/*.so ${OUT_DBG_DIR}