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

Thomas Guillem's avatar
Thomas Guillem committed
3 4 5 6
#############
# ARGUMENTS #
#############

7
AVLC_RELEASE=$RELEASE
8 9 10 11 12 13 14 15 16 17 18 19
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
            ;;
        release|--release)
20
            AVLC_RELEASE=1
21 22 23 24 25
            ;;
    esac
    shift
done

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
# 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

#########
# FLAGS #
#########
if [ "${ANDROID_ABI}" = "arm" ] ; then
    ANDROID_ABI="armeabi-v7a"
elif [ "${ANDROID_ABI}" = "arm64" ] ; then
    ANDROID_ABI="arm64-v8a"
fi

# Set up ABI variables
if [ "${ANDROID_ABI}" = "x86" ] ; then
    TARGET_TUPLE="i686-linux-android"
    PLATFORM_SHORT_ARCH="x86"
elif [ "${ANDROID_ABI}" = "x86_64" ] ; then
    TARGET_TUPLE="x86_64-linux-android"
    PLATFORM_SHORT_ARCH="x86_64"
    HAVE_64=1
elif [ "${ANDROID_ABI}" = "arm64-v8a" ] ; then
    TARGET_TUPLE="aarch64-linux-android"
    HAVE_ARM=1
    HAVE_64=1
    PLATFORM_SHORT_ARCH="arm64"
elif [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
    TARGET_TUPLE="arm-linux-androideabi"
    HAVE_ARM=1
    PLATFORM_SHORT_ARCH="arm"
else
64 65 66 67 68 69
    echo "Please pass the ANDROID ABI to the correct architecture, using
                compile-libvlc.sh -a ARCH
    ARM:     (armeabi-v7a|arm)
    ARM64:   (arm64-v8a|arm64)
    X86:     x86, x86_64"
    exit 1
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
fi

# 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" -eq 18 ]; then
    if [ "${HAVE_64}" = 1 ]; then
        ANDROID_API=21
    else
        ANDROID_API=17
    fi
else
    echo "NDK v18 needed, cf. https://developer.android.com/ndk/downloads/"
    exit 1
fi

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
############
# VLC PATH #
############
SRC_DIR=$PWD
if [ -f $SRC_DIR/src/libvlc.h ];then
    VLC_SRC_DIR="$SRC_DIR"
elif [ -d $SRC_DIR/vlc ];then
    VLC_SRC_DIR=$SRC_DIR/vlc
else
    echo "Could not find vlc sources"
    exit 1
fi

VLC_BUILD_DIR=`realpath $VLC_SRC_DIR/build-android-${TARGET_TUPLE}`
VLC_OUT_PATH="$VLC_BUILD_DIR/ndk"
mkdir -p $VLC_OUT_PATH
VLC_OUT_LDLIBS="-L$VLC_OUT_PATH/libs/${ANDROID_ABI} -lvlc"

#################
# NDK TOOLCHAIN #
#################
107
NDK_TOOLCHAIN_DIR=${VLC_OUT_PATH}/toolchains
108 109 110 111 112 113
NDK_TOOLCHAIN_PATH=${NDK_TOOLCHAIN_DIR}/bin
# Add the NDK toolchain to the PATH, needed both for contribs and for building
# stub libraries
CROSS_TOOLS=${NDK_TOOLCHAIN_PATH}/${TARGET_TUPLE}-

export PATH="${NDK_TOOLCHAIN_PATH}:${PATH}"
114
NDK_BUILD=$ANDROID_NDK/ndk-build
115 116 117
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}"
118
    NDK_BUILD=$NDK_BUILD.cmd
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
fi

##########
# CFLAGS #
##########

VLC_CFLAGS="-std=gnu11"
VLC_CXXFLAGS="-std=gnu++11"
if [ "$NO_OPTIM" = "1" ];
then
     VLC_CFLAGS="${VLC_CFLAGS} -g -O0"
     VLC_CXXFLAGS="${VLC_CXXFLAGS} -g -O0"
else
     VLC_CFLAGS="${VLC_CFLAGS} -g -O2"
     VLC_CXXFLAGS="${VLC_CXXFLAGS} -g -O2"
fi

VLC_CFLAGS="${VLC_CFLAGS} -fstrict-aliasing -funsafe-math-optimizations"
VLC_CXXFLAGS="${VLC_CXXFLAGS} -fstrict-aliasing -funsafe-math-optimizations"

# Setup CFLAGS per ABI
if [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
    EXTRA_CFLAGS="-march=armv7-a -mfpu=neon -mcpu=cortex-a8"
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -mthumb -mfloat-abi=softfp"
elif [ "${ANDROID_ABI}" = "x86" ] ; then
    EXTRA_CFLAGS="-mtune=atom -msse3 -mfpmath=sse -m32"
fi

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"

#################
# Setup LDFLAGS #
#################

EXTRA_LDFLAGS="${VLC_LDFLAGS}"
if [ ${ANDROID_ABI} = "armeabi-v7a" ]; then
        EXTRA_PARAMS=" --enable-neon"
        EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -Wl,--fix-cortex-a8"
fi
NDK_LIB_DIR="${NDK_TOOLCHAIN_DIR}/${TARGET_TUPLE}/lib"
if [ "${PLATFORM_SHORT_ARCH}" = "x86_64" ];then
    NDK_LIB_DIR="${NDK_LIB_DIR}64"
elif [ "${PLATFORM_SHORT_ARCH}" = "arm" ]; then
    NDK_LIB_DIR="${NDK_LIB_DIR}/armv7-a"
fi

EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${NDK_LIB_DIR} -lc++abi"
VLC_LDFLAGS="${EXTRA_LDFLAGS}"

# Release or not?
if [ "$AVLC_RELEASE" = 1 ]; then
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -DNDEBUG "
    NDK_DEBUG=0
else
    NDK_DEBUG=1
fi

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

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

echo "EXTRA_CFLAGS:      ${EXTRA_CFLAGS}"
echo "VLC_CFLAGS:        ${VLC_CFLAGS}"
echo "VLC_CXXFLAGS:      ${VLC_CXXFLAGS}"

192 193 194 195 196 197
if [ -z "$ANDROID_NDK" ]; then
    echo "Please set the ANDROID_NDK environment variable with its path."
    exit 1
fi

if [ -z "$ANDROID_ABI" ]; then
198 199
    echo "Please pass the ANDROID ABI to the correct architecture, using
                compile-libvlc.sh -a ARCH
200 201
    ARM:     (armeabi-v7a|arm)
    ARM64:   (arm64-v8a|arm64)
202
    X86:     x86, x86_64"
203 204 205
    exit 1
fi

206 207 208 209 210 211 212 213
avlc_checkfail()
{
    if [ ! $? -eq 0 ];then
        echo "$1"
        exit 1
    fi
}

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
avlc_make_toolchain()
{
NDK_TOOLCHAIN_PROPS=${NDK_TOOLCHAIN_DIR}/source.properties
NDK_FORCE_ARG=
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

if [ ! -d ${NDK_TOOLCHAIN_DIR} ]; then
    $ANDROID_NDK/build/tools/make_standalone_toolchain.py \
        --arch ${PLATFORM_SHORT_ARCH} \
        --api ${ANDROID_API} \
        --stl libc++ \
        ${NDK_FORCE_ARG} \
        --install-dir ${NDK_TOOLCHAIN_DIR}
fi
if [ ! -d ${NDK_TOOLCHAIN_PATH} ];
then
    echo "make_standalone_toolchain.py failed"
    exit 1
fi

if [ ! -z "${NDK_FORCE_ARG}" ];then
    cp "$ANDROID_NDK/source.properties" "${NDK_TOOLCHAIN_PROPS}"
fi
} # avlc_make_toolchain()

avlc_find_modules()
{
    echo "`find $1 -name 'lib*plugin.a' | grep -vE "lib(${blacklist_regexp})_plugin.a" | tr '\n' ' '`"
}

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

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

avlc_build()
{
avlc_make_toolchain

266 267 268 269 270 271 272 273 274 275 276
###########################
# VLC BOOTSTRAP ARGUMENTS #
###########################

VLC_BOOTSTRAP_ARGS="\
    --disable-disc \
    --enable-dvdread \
    --enable-dvdnav \
    --disable-dca \
    --disable-goom \
    --disable-chromaprint \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
277
    --enable-lua \
278 279 280 281 282 283 284 285 286
    --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
287
    --enable-upnp \
288 289 290 291 292 293
    --disable-gme \
    --disable-tremor \
    --enable-vorbis \
    --disable-sidplay2 \
    --disable-samplerate \
    --disable-faad2 \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
294
    --enable-harfbuzz \
295 296 297
    --enable-iconv \
    --disable-aribb24 \
    --disable-aribb25 \
298
    --enable-mpg123 \
299
    --enable-libdsm \
Thomas Guillem's avatar
Thomas Guillem committed
300
    --enable-libarchive \
Thomas Guillem's avatar
Thomas Guillem committed
301
    --disable-libmpeg2 \
Thomas Guillem's avatar
Thomas Guillem committed
302
    --enable-soxr \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
303
    --enable-nfs \
304
    --enable-microdns \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
305
    --enable-fluidlite \
Thomas Guillem's avatar
Thomas Guillem committed
306
    --disable-mad \
Geoffrey Métais's avatar
Geoffrey Métais committed
307 308 309
    --disable-vncclient \
    --disable-vnc \
    --enable-jpeg \
310
    --enable-libplacebo \
311
    --enable-ad-clauses \
312
    --disable-srt \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
313
    --enable-vpx \
Geoffrey Métais's avatar
Geoffrey Métais committed
314
    --disable-x265 \
315
    --disable-medialibrary \
316 317 318 319 320 321 322 323 324 325 326 327 328 329
"

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

VLC_CONFIGURE_ARGS="\
    --disable-nls \
    --enable-live555 --enable-realrtsp \
    --enable-avformat \
    --enable-swscale \
    --enable-avcodec \
    --enable-opus \
    --enable-opensles \
330
    --enable-matroska \
331 332 333 334 335 336
    --enable-taglib \
    --enable-dvbpsi \
    --disable-vlc --disable-shared \
    --disable-update-check \
    --disable-vlm \
    --disable-dbus \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
337
    --enable-lua \
338 339 340 341 342 343 344 345 346
    --disable-vcd \
    --disable-v4l2 \
    --enable-dvdread \
    --enable-dvdnav \
    --disable-bluray \
    --disable-linsys \
    --disable-decklink \
    --disable-libva \
    --disable-dv1394 \
347
    --enable-mod \
348 349 350
    --disable-sid \
    --disable-gme \
    --disable-tremor \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
351 352
    --disable-mad \
    --enable-mpg123 \
353 354 355 356
    --disable-dca \
    --disable-sdl-image \
    --enable-zvbi \
    --disable-fluidsynth \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
357
    --enable-fluidlite \
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
    --disable-jack \
    --disable-pulse \
    --disable-alsa \
    --disable-samplerate \
    --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 \
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
375
    --enable-sout \
376 377
    --enable-vorbis \
    --disable-faad \
378
    --disable-schroedinger \
Geoffrey Métais's avatar
Geoffrey Métais committed
379 380
    --disable-vnc \
    --enable-jpeg \
381 382
"

383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
########################
# 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
"

440 441 442
###########################
# Build buildsystem tools #
###########################
443

444
export PATH="$VLC_SRC_DIR/extras/tools/build/bin:$PATH"
445
echo "Building tools"
446
cd $VLC_SRC_DIR/extras/tools
447
./bootstrap
448
avlc_checkfail "buildsystem tools: bootstrap failed"
449
make $MAKEFLAGS
450
avlc_checkfail "buildsystem tools: make failed"
451
make $MAKEFLAGS .gas || make $MAKEFLAGS .buildgas
452
avlc_checkfail "buildsystem tools: make failed"
453
cd ../../..
Thomas Guillem's avatar
Thomas Guillem committed
454

455
VLC_CONTRIB="$VLC_SRC_DIR/contrib/$TARGET_TUPLE"
456

457
cd $VLC_SRC_DIR
458

459 460 461 462
#############
# BOOTSTRAP #
#############

463
if [ ! -f configure ]; then
464 465
    echo "Bootstraping"
    ./bootstrap
466
    avlc_checkfail "vlc: bootstrap failed"
467 468
fi

469 470 471
############
# Contribs #
############
Thomas Guillem's avatar
Thomas Guillem committed
472

473 474 475 476
echo "Building the contribs"
mkdir -p contrib/contrib-android-${TARGET_TUPLE}

mkdir -p contrib/${TARGET_TUPLE}/lib/pkgconfig
477 478
avlc_gen_pc_file EGL 1.1
avlc_gen_pc_file GLESv2 2
479 480

cd contrib/contrib-android-${TARGET_TUPLE}
481

482
export USE_FFMPEG=1
483
ANDROID_ABI=${ANDROID_ABI} ANDROID_API=${ANDROID_API} \
484
    ../bootstrap --host=${TARGET_TUPLE} ${VLC_BOOTSTRAP_ARGS}
485
avlc_checkfail "contribs: bootstrap failed"
486 487 488 489 490

# 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
491 492
echo "EXTRA_CFLAGS=${EXTRA_CFLAGS}" >> config.mak
echo "EXTRA_CXXFLAGS=${EXTRA_CXXFLAGS}" >> config.mak
493
echo "EXTRA_LDFLAGS=${EXTRA_LDFLAGS}" >> config.mak
494 495 496 497 498
echo "CC=${NDK_TOOLCHAIN_PATH}/clang" >> config.mak
echo "CXX=${NDK_TOOLCHAIN_PATH}/clang++" >> config.mak
echo "AR=${NDK_TOOLCHAIN_PATH}/${TARGET_TUPLE}-ar" >> config.mak
echo "RANLIB=${NDK_TOOLCHAIN_PATH}/${TARGET_TUPLE}-ranlib" >> config.mak
echo "LD=${NDK_TOOLCHAIN_PATH}/${TARGET_TUPLE}-ld" >> config.mak
499

500 501 502
# fix modplug endianess check (narrowing error)
export ac_cv_c_bigendian=no

503
make $MAKEFLAGS fetch
504
avlc_checkfail "contribs: make fetch failed"
505 506

# gettext
507
which autopoint >/dev/null || make $MAKEFLAGS .gettext
508 509
#export the PATH
# Make
510
make $MAKEFLAGS
511
avlc_checkfail "contribs: make failed"
512

513
cd ../../
514

515
mkdir -p $VLC_BUILD_DIR && cd $VLC_BUILD_DIR
516 517 518 519 520

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

521 522
if [ ${ANDROID_API} -lt "26" ]; then
    # android APIs < 26 have empty sys/shm.h headers that triggers shm detection but it
523 524
    # doesn't have any shm functions and/or symbols. */
    export ac_cv_header_sys_shm_h=no
525 526 527
fi

if [ ${ANDROID_API} -lt "21" ] ; then
528
    # force uselocale using libandroid_support since it's present in libc++
Thomas Guillem's avatar
Thomas Guillem committed
529
    export ac_cv_func_uselocale=yes
Thomas Guillem's avatar
Thomas Guillem committed
530

531
    # -l order is important here
Thomas Guillem's avatar
Thomas Guillem committed
532
    VLC_LDFLAGS="${VLC_LDFLAGS} -L${NDK_LIB_DIR} -landroid_support"
533 534 535 536
    if [ "${ANDROID_ABI}" = "armeabi-v7a" ]; then
        VLC_LDFLAGS="${VLC_LDFLAGS} -lunwind"
    fi
    VLC_LDFLAGS="${VLC_LDFLAGS} -latomic -lgcc"
537
fi
Thomas Guillem's avatar
Thomas Guillem committed
538

539 540 541 542 543
# always use fixups for search.h and tdestroy
export ac_cv_header_search_h=no
export ac_cv_func_tdestroy=no
export ac_cv_func_tfind=no

544 545 546 547 548 549
if [ ! -e ./config.h -o "$AVLC_RELEASE" = 1 ]; then
VLC_CONFIGURE_DEBUG=""
if [ ! "$AVLC_RELEASE" = 1 ]; then
    VLC_CONFIGURE_DEBUG="--enable-debug"
fi

550
CFLAGS="${VLC_CFLAGS} ${EXTRA_CFLAGS}" \
Thomas Guillem's avatar
Thomas Guillem committed
551 552 553 554 555 556 557 558
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 \
559
PKG_CONFIG_PATH=$VLC_SRC_DIR/contrib/$TARGET_TUPLE/lib/pkgconfig \
560
PATH=../contrib/bin:$PATH \
561
sh ../configure --host=$TARGET_TUPLE --build=x86_64-unknown-linux \
Thomas Guillem's avatar
Thomas Guillem committed
562
    --with-contrib=${VLC_SRC_DIR}/contrib/${TARGET_TUPLE} \
563
    --prefix=${VLC_BUILD_DIR}/install/ \
564 565
    ${EXTRA_PARAMS} ${VLC_CONFIGURE_ARGS} ${VLC_CONFIGURE_DEBUG}
avlc_checkfail "vlc: configure failed"
Thomas Guillem's avatar
Thomas Guillem committed
566
fi
567

568 569 570 571 572 573
############
# BUILDING #
############

echo "Building"
make $MAKEFLAGS
574
avlc_checkfail "vlc: make failed"
575
make install
576
avlc_checkfail "vlc: make install failed"
577

578
cd $SRC_DIR
579

580 581 582
##################
# libVLC modules #
##################
Thomas Guillem's avatar
Thomas Guillem committed
583

584
REDEFINED_VLC_MODULES_DIR=${VLC_BUILD_DIR}/install/lib/vlc/plugins
585 586
rm -rf ${REDEFINED_VLC_MODULES_DIR}
mkdir -p ${REDEFINED_VLC_MODULES_DIR}
587

588
echo "Generating static module list"
589 590 591 592 593 594 595 596 597 598
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
599

600
VLC_MODULES=$(avlc_find_modules ${VLC_BUILD_DIR}/modules)
601 602 603
DEFINITION="";
BUILTINS="const void *vlc_static_modules[] = {\n";
for file in $VLC_MODULES; do
604
    outfile=${REDEFINED_VLC_MODULES_DIR}/`basename $file`
605
    name=`echo $file | sed 's/.*\.libs\/lib//' | sed 's/_plugin\.a//'`;
Thomas Guillem's avatar
Thomas Guillem committed
606
    symbols=$("${CROSS_TOOLS}nm" -g $file)
607

608
    # assure that all modules have differents symbol names
609 610 611
    entry=$(avlc_get_symbol "$symbols" _)
    copyright=$(avlc_get_symbol "$symbols" copyright)
    license=$(avlc_get_symbol "$symbols" license)
612
    cat <<EOF > ${REDEFINED_VLC_MODULES_DIR}/syms
613 614 615 616
AccessOpen AccessOpen__$name
AccessClose AccessClose__$name
StreamOpen StreamOpen__$name
StreamClose StreamClose__$name
617 618
OpenDemux OpenDemux__$name
CloseDemux CloseDemux__$name
619 620 621 622 623 624
DemuxOpen DemuxOpen__$name
DemuxClose DemuxClose__$name
OpenFilter OpenFilter__$name
CloseFilter CloseFilter__$name
Open Open__$name
Close Close__$name
625 626 627 628
$entry vlc_entry__$name
$copyright vlc_entry_copyright__$name
$license vlc_entry_license__$name
EOF
Thomas Guillem's avatar
Thomas Guillem committed
629
    ${CROSS_TOOLS}objcopy --redefine-syms ${REDEFINED_VLC_MODULES_DIR}/syms $file $outfile
630
    avlc_checkfail "objcopy failed"
631 632 633 634

    DEFINITION=$DEFINITION"int vlc_entry__$name (int (*)(void *, void *, int, ...), void *);\n";
    BUILTINS="$BUILTINS vlc_entry__$name,\n";
done;
635
BUILTINS="$BUILTINS NULL\n};\n"; \
636
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > $VLC_OUT_PATH/libvlcjni-modules.c
637 638 639

DEFINITION=""
BUILTINS="const void *libvlc_functions[] = {\n";
640
for func in `cat $VLC_SRC_DIR/lib/libvlc.sym`
641 642 643 644 645
do
    DEFINITION=$DEFINITION"int $func(void);\n";
    BUILTINS="$BUILTINS $func,\n";
done
BUILTINS="$BUILTINS NULL\n};\n"; \
646
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > $VLC_OUT_PATH/libvlcjni-symbols.c
647

648
rm ${REDEFINED_VLC_MODULES_DIR}/syms
649

650 651 652
###########################
# NDK-Build for libvlc.so #
###########################
653

654
VLC_MODULES=$(avlc_find_modules ${REDEFINED_VLC_MODULES_DIR})
655
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`
656 657
echo -e "ndk-build vlc"

658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
touch $VLC_OUT_PATH/dummy.cpp

# This is ugly but it's better to use the linker from ndk-build that will use
# the proper linkflags depending on ABI/API
rm -rf $VLC_OUT_PATH/Android.mk
cat << 'EOF' > $VLC_OUT_PATH/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := libvlc
LOCAL_SRC_FILES := libvlcjni-modules.c libvlcjni-symbols.c dummy.cpp
LOCAL_LDFLAGS := -L$(VLC_CONTRIB)/lib
LOCAL_LDLIBS := \
	$(VLC_MODULES) \
	$(VLC_BUILD_DIR)/lib/.libs/libvlc.a \
	$(VLC_BUILD_DIR)/src/.libs/libvlccore.a \
	$(VLC_BUILD_DIR)/compat/.libs/libcompat.a \
	$(VLC_CONTRIB_LDFLAGS) \
	-ldl -lz -lm -llog \
	-la52 -ljpeg \
	-llua \
	$(VLC_LDFLAGS)
LOCAL_CXXFLAGS := -std=c++11
include $(BUILD_SHARED_LIBRARY)
EOF

683
$NDK_BUILD -C $VLC_OUT_PATH/.. \
684 685 686
    APP_STL="c++_shared" \
    APP_CPPFLAGS="-frtti -fexceptions" \
    VLC_SRC_DIR="$VLC_SRC_DIR" \
687
    VLC_BUILD_DIR="$VLC_BUILD_DIR" \
688 689 690
    VLC_CONTRIB="$VLC_CONTRIB" \
    VLC_CONTRIB_LDFLAGS="$VLC_CONTRIB_LDFLAGS" \
    VLC_MODULES="$VLC_MODULES" \
691
    VLC_LDFLAGS="$VLC_LDFLAGS" \
692
    APP_BUILD_SCRIPT=ndk/Android.mk \
693 694
    APP_PLATFORM=android-${ANDROID_API} \
    APP_ABI=${ANDROID_ABI} \
695
    NDK_PROJECT_PATH=ndk \
696 697
    NDK_TOOLCHAIN_VERSION=clang \
    NDK_DEBUG=${NDK_DEBUG}
698

699 700 701
# Remove gdbserver to avoid conflict with libvlcjni.so debug options
rm -f $VLC_OUT_PATH/libs/${ANDROID_ABI}/gdb*

702 703 704 705 706 707
avlc_checkfail "ndk-build libvlc failed"
} # avlc_build()

if [ "$AVLC_SOURCED" != "1" ]; then
    avlc_build
fi