#!/bin/sh # Copyright (C) Pierre d'Herbemont, 2010 # Copyright (C) Felix Paul Kühne, 2012-2019 set -e BUILD_DEVICE=yes BUILD_SIMULATOR=yes BUILD_STATIC_FRAMEWORK=no BUILD_DYNAMIC_FRAMEWORK=no SDK_VERSION=`xcrun --sdk iphoneos --show-sdk-version` SDK_MIN=9.0 VERBOSE=no DISABLEDEBUG=no CONFIGURATION="Debug" NONETWORK=no SKIPLIBVLCCOMPILATION=no TVOS=no MACOS=no IOS=yes BITCODE=no OSVERSIONMINCFLAG=iphoneos OSVERSIONMINLDFLAG=ios ROOT_DIR=empty FARCH="all" TESTEDHASH="361ad729d" # libvlc hash that this version of VLCKit is build on usage() { cat << EOF usage: $0 [-s] [-v] [-k sdk] OPTIONS -k Specify which sdk to use (see 'xcodebuild -showsdks', current: ${SDK}) -v Be more verbose -s Build framework only for simulator (default both) -f Build framework only for device (default both) -r Disable Debug for Release -n Skip script steps requiring network interaction -l Skip libvlc compilation -t Build for tvOS -x Build for macOS / Mac OS X -b Enable bitcode -a Build framework for specific arch (all|i386|x86_64|armv7|aarch64) -e External VLC source path EOF } get_actual_arch() { if [ "$1" = "aarch64" ]; then echo "arm64" else echo "$1" fi } get_arch() { if [ "$1" = "arm64" ]; then echo "aarch64" else echo "$1" fi } is_simulator_arch() { if [ "$1" = "i386" -o "$1" = "x86_64" ];then return 0 else return 1 fi } spushd() { pushd "$1" 2>&1> /dev/null } spopd() { popd 2>&1> /dev/null } info() { local green="\033[1;32m" local normal="\033[0m" echo "[${green}info${normal}] $1" } buildxcodeproj() { local target="$2" local PLATFORM="$3" info "Building $1 ($target, ${CONFIGURATION}, $PLATFORM)" local architectures="" if [ "$FARCH" = "all" ];then if [ "$TVOS" = "yes" ]; then if [ "$PLATFORM" = "appletvsimulator" ]; then architectures="x86_64" else architectures="arm64" fi fi if [ "$IOS" = "yes" ]; then if [ "$PLATFORM" = "iphonesimulator" ]; then architectures="i386 x86_64" else architectures="armv7 arm64" fi fi else architectures=`get_actual_arch $FARCH` fi local bitcodeflag="" if [ "$BITCODE" = "yes" ]; then bitcodeflag="BITCODE_GENERATION_MODE=bitcode" fi local defs="$GCC_PREPROCESSOR_DEFINITIONS" xcodebuild -project "$1.xcodeproj" \ -target "$target" \ -sdk $PLATFORM$SDK \ -configuration ${CONFIGURATION} \ ARCHS="${architectures}" \ IPHONEOS_DEPLOYMENT_TARGET=${SDK_MIN} \ GCC_PREPROCESSOR_DEFINITIONS="$defs" \ ${bitcodeflag} \ > ${out} } buildLibVLC() { ARCH="$1" PLATFORM="$2" if [ "$DISABLEDEBUG" = "yes" ]; then DEBUGFLAG="--disable-debug" else DEBUGFLAG="" fi if [ "$VERBOSE" = "yes" ]; then VERBOSEFLAG="--verbose" else VERBOSEFLAG="" fi if [ "$BITCODE" = "yes" ]; then BITCODEFLAG="--enable-bitcode" else BITCODEFLAG="" fi info "Compiling ${ARCH} with SDK version ${SDK_VERSION}, platform ${PLATFORM}" ACTUAL_ARCH=`get_actual_arch $ARCH` BUILDDIR="${VLCROOT}/build-${PLATFORM}-${ACTUAL_ARCH}" mkdir -p ${BUILDDIR} spushd ${BUILDDIR} ../extras/package/apple/build.sh \ --arch=$ARCH \ --sdk=${PLATFORM}${SDK_VERSION} \ --build-libvlc=dynamic \ --build-modules=static \ ${DEBUGFLAG} ${VERBOSEFLAG} ${BITCODEFLAG} # COPY to the framework: # - ${VLC_INSTALL_DIR}/lib/libvlc.dylib # - ${VLC_INSTALL_DIR}/lib/libvlccore.dylib # - ${VLC_INSTALL_DIR}/lib/libvlcmodules_plugin.dylib # - ${VLC_INSTALL_DIR}/include/vlc/plugins.manifest.h spopd # builddir info "Finished compiling libvlc for ${ARCH} with SDK version ${SDK_VERSION}, platform ${PLATFORM}" } buildMobileKit() { PLATFORM="$1" if [ "$SKIPLIBVLCCOMPILATION" != "yes" ]; then if [ "$FARCH" = "all" ];then if [ "$TVOS" = "yes" ]; then if [ "$PLATFORM" = "iphonesimulator" ]; then buildLibVLC "x86_64" "appletvsimulator" else buildLibVLC "aarch64" "appletvos" fi fi if [ "$MACOS" = "yes" ]; then buildLibVLC "x86_64" "macosx" fi if [ "$IOS" = "yes" ]; then if [ "$PLATFORM" = "iphonesimulator" ]; then buildLibVLC "i386" $PLATFORM buildLibVLC "x86_64" $PLATFORM else buildLibVLC "armv7" $PLATFORM buildLibVLC "aarch64" $PLATFORM fi fi else if [ "$FARCH" != "x86_64" -a "$FARCH" != "aarch64" -a "$FARCH" != "i386" \ -a "$FARCH" != "armv7" ];then echo "*** Framework ARCH: ${FARCH} is invalid ***" exit 1 fi if (is_simulator_arch $FARCH);then if [ "$TVOS" = "yes" ]; then PLATFORM="appletvsimulator" fi if [ "$IOS" = "yes" ]; then PLATFORM="iphonesimulator" fi if [ "$MACOS" = "yes" ]; then PLATFORM="macosx" fi else if [ "$TVOS" = "yes" ]; then PLATFORM="appletvos" fi if [ "$IOS" = "yes" ]; then PLATFORM="iphoneos" fi if [ "$MACOS" = "yes" ]; then PLATFORM="macosx" fi fi buildLibVLC $FARCH "$PLATFORM" fi fi } get_symbol() { echo "$1" | grep vlc_entry_$2|cut -d" " -f 3|sed 's/_vlc/vlc/' } build_universal_static_lib() { PROJECT_DIR=`pwd` OSSTYLE="$1" info "building universal static libs for $OSSTYLE" # remove old module list rm -f $PROJECT_DIR/Resources/MobileVLCKit/vlc-plugins-$OSSTYLE.h touch $PROJECT_DIR/Resources/MobileVLCKit/vlc-plugins-$OSSTYLE.h spushd ${VLCROOT} rm -rf install-$OSSTYLE mkdir install-$OSSTYLE spopd # vlc VLCSTATICLIBS="" VLCSTATICLIBRARYNAME="static-lib/libvlc-full-static.a" VLCSTATICMODULELIST="" # brute-force test the available architectures we could lipo BUILD_KIND_AVAILABLES="os-arm64 os-armv7 simulator-x86_64 simulator-i386 -x86_64" for flavour in $BUILD_KIND_AVAILABLES; do staticlibname="${VLCROOT}/build-${OSSTYLE}${flavour}/${VLCSTATICLIBRARYNAME}" modulelistname="${VLCROOT}/build-${OSSTYLE}${flavour}/static-lib/plugins.manifest.h" if [ -f "$staticlibname" -a -f "$modulelistname" ]; then VLCSTATICLIBS+=" $staticlibname" VLCSTATICMODULELIST="$modulelistname" # TODO: which one should we choose ? else echo "${VLCROOT}/build-${OSSTYLE}${flavour}/ not available for lipo" if ! [ -f "$staticlibname" ]; then echo " -> $staticlibname not available" fi if ! [ -f "$modulelistname" ]; then echo " -> $modulelistname not available" fi fi done spushd ${VLCROOT} lipo $VLCSTATICLIBS -create -output install-$OSSTYLE/libvlc-full-static.a cp $VLCSTATICMODULELIST $PROJECT_DIR/Resources/MobileVLCKit/vlc-plugins-$OSSTYLE.h spopd # VLCROOT } while getopts "hvsfbrxntlk:a:e:" OPTION do case $OPTION in h) usage exit 1 ;; v) VERBOSE=yes ;; s) BUILD_DEVICE=no BUILD_SIMULATOR=yes BUILD_STATIC_FRAMEWORK=yes ;; f) BUILD_DEVICE=yes BUILD_SIMULATOR=no BUILD_STATIC_FRAMEWORK=yes ;; r) CONFIGURATION="Release" DISABLEDEBUG=yes ;; n) NONETWORK=yes ;; l) SKIPLIBVLCCOMPILATION=yes ;; k) SDK=$OPTARG ;; a) FARCH=$OPTARG ;; b) BITCODE=yes ;; t) TVOS=yes IOS=no BITCODE=yes SDK_VERSION=`xcrun --sdk appletvos --show-sdk-version` SDK_MIN=10.2 OSVERSIONMINCFLAG=tvos OSVERSIONMINLDFLAG=tvos ;; x) MACOS=yes IOS=no BITCODE=no SDK_VERSION=`xcrun --sdk macosx --show-sdk-version` SDK_MIN=10.11 OSVERSIONMINCFLAG=macosx OSVERSIONMINLDFLAG=macosx BUILD_DEVICE=yes FARCH=x86_64 BUILD_DYNAMIC_FRAMEWORK=yes BUILD_STATIC_FRAMEWORK=no ;; e) VLCROOT=$OPTARG ;; ?) usage exit 1 ;; esac done shift $(($OPTIND - 1)) out="/dev/null" if [ "$VERBOSE" = "yes" ]; then out="/dev/stdout" fi if [ "x$1" != "x" ]; then usage exit 1 fi # Get root dir spushd . ROOT_DIR=`pwd` spopd if [ "$VLCROOT" = "" ]; then VLCROOT=${ROOT_DIR}/libvlc/vlc info "Preparing build dirs" mkdir -p libvlc spushd libvlc if [ "$NONETWORK" != "yes" ]; then if ! [ -e vlc ]; then git clone https://git.videolan.org/git/vlc.git vlc info "Applying patches to vlc.git" cd vlc git checkout -B localBranch ${TESTEDHASH} git branch --set-upstream-to=origin/master localBranch git am ${ROOT_DIR}/libvlc/patches/*.patch if [ $? -ne 0 ]; then git am --abort info "Applying the patches failed, aborting git-am" exit 1 fi cd .. else cd vlc git fetch --all git reset --hard ${TESTEDHASH} git am ${ROOT_DIR}/libvlc/patches/*.patch cd .. fi fi spopd fi fetch_python3_path() { PYTHON3_PATH=$(echo /Library/Frameworks/Python.framework/Versions/3.*/bin | awk '{print $1;}') if [ ! -d "${PYTHON3_PATH}" ]; then PYTHON3_PATH="" fi } # # Build time # out="/dev/null" if [ "$VERBOSE" = "yes" ]; then out="/dev/stdout" fi if [ "$SKIPLIBVLCCOMPILATION" != "yes" ]; then info "Building tools" fetch_python3_path export PATH="${PYTHON3_PATH}:${VLCROOT}/extras/tools/build/bin:${VLCROOT}/contrib/${TARGET}/bin:/usr/bin:/bin:/usr/sbin:/sbin" spushd ${VLCROOT}/extras/tools ./bootstrap make make .buildgas make .buildxz make .buildtar make .buildmeson make .buildninja spopd #${VLCROOT}/extras/tools fi if [ "$BUILD_DEVICE" != "no" ]; then buildMobileKit iphoneos fi if [ "$BUILD_SIMULATOR" != "no" ]; then buildMobileKit iphonesimulator fi if [ "$TVOS" = "yes" ]; then build_universal_static_lib "AppleTV" fi if [ "$MACOS" = "yes" ]; then build_universal_static_lib "MacOSX" fi if [ "$IOS" = "yes" ]; then echo Not building universal static libs #build_universal_static_lib "iphone" fi info "all done" copy_libvlc_files() { OUTPUT="$1" ARCH="$2" PLATFORM="$3" info "Copy plugin manifest for $PLATFORM-$ARCH to $OUTPUT" ACTUAL_ARCH=`get_actual_arch $ARCH` BUILDDIR="${VLCROOT}/build-${PLATFORM}-${ACTUAL_ARCH}" # HACK: find the path to VLC install directory ourselves, althoug we should # be able to explicit it ourselves instead of relying on the script to # decide for us. VLC_INSTALL_DIR="${BUILDDIR}/vlc-${PLATFORM}${SDK_VERSION}-${ACTUAL_ARCH}/" mkdir -p "${OUTPUT}/Headers" mkdir -p "${OUTPUT}/Libraries" cp -p "${VLC_INSTALL_DIR}/include/vlc/plugins.manifest.h" "$OUTPUT/Headers/" cp -p "${VLC_INSTALL_DIR}/lib/libvlc.dylib" "$OUTPUT/Libraries/" cp -p "${VLC_INSTALL_DIR}/lib/libvlccore.dylib" "$OUTPUT/Libraries/" cp -p "${VLC_INSTALL_DIR}/lib/libvlcmodules_plugin.dylib" "$OUTPUT/Libraries/" # The application has to set the run-search path to the MobileVLCKit Library folder install_name_tool \ "$OUTPUT/Libraries/libvlc.dylib" \ -id "@rpath/libvlc.dylib" install_name_tool \ "$OUTPUT/Libraries/libvlccore.dylib" \ -id "@rpath/libvlccore.dylib" install_name_tool \ "$OUTPUT/Libraries/libvlcmodules_plugin.dylib" \ \-id "@rpath/libvlcmodules_plugin.dylib" } if [ "$BUILD_STATIC_FRAMEWORK" != "no" ]; then if [ "$TVOS" = "yes" ]; then info "Building static TVVLCKit.framework" lipo_libs="" platform="" if [ "$FARCH" = "all" ] || (! is_simulator_arch $FARCH);then platform="appletvos" buildxcodeproj MobileVLCKit "TVVLCKit" ${platform} lipo_libs="$lipo_libs ${CONFIGURATION}-appletvos/libTVVLCKit.a" fi if [ "$FARCH" = "all" ] || (is_simulator_arch $FARCH);then platform="appletvsimulator" buildxcodeproj MobileVLCKit "TVVLCKit" ${platform} lipo_libs="$lipo_libs ${CONFIGURATION}-appletvsimulator/libTVVLCKit.a" fi # Assumes both platforms were built currently spushd build rm -rf TVVLCKit.framework && \ mkdir TVVLCKit.framework && \ lipo -create ${lipo_libs} -o TVVLCKit.framework/TVVLCKit && \ chmod a+x TVVLCKit.framework/TVVLCKit && \ cp -pr ${CONFIGURATION}-${platform}/TVVLCKit TVVLCKit.framework/Headers cp -pr ${CONFIGURATION}-${platform}/Modules TVVLCKit.framework/Modules spopd # build info "Build of static TVVLCKit.framework completed" fi if [ "$IOS" = "yes" ]; then info "Building static MobileVLCKit.framework" lipo_libs="" platform="" if [ "$FARCH" = "all" ] || (! is_simulator_arch $FARCH);then platform="iphoneos" buildxcodeproj MobileVLCKit "MobileVLCKit" ${platform} lipo_libs="$lipo_libs ${CONFIGURATION}-iphoneos/libMobileVLCKit.a" fi if [ "$FARCH" = "all" ] || (is_simulator_arch $FARCH);then platform="iphonesimulator" buildxcodeproj MobileVLCKit "MobileVLCKit" ${platform} lipo_libs="$lipo_libs ${CONFIGURATION}-iphonesimulator/libMobileVLCKit.a" fi # Assumes both platforms were built currently spushd build rm -rf MobileVLCKit.framework && \ mkdir MobileVLCKit.framework && \ lipo -create ${lipo_libs} -o MobileVLCKit.framework/MobileVLCKit && \ chmod a+x MobileVLCKit.framework/MobileVLCKit && \ cp -pr ${CONFIGURATION}-${platform}/MobileVLCKit MobileVLCKit.framework/Headers cp -pr ${CONFIGURATION}-${platform}/Modules MobileVLCKit.framework/Modules # Only support the non-ALL case for now if [ "$FARCH" != "all" ]; then copy_libvlc_files MobileVLCKit.framework/ ${FARCH} ${platform} fi spopd # build info "Build of static MobileVLCKit.framework completed" fi fi if [ "$BUILD_DYNAMIC_FRAMEWORK" != "no" ]; then if [ "$MACOS" = "yes" ]; then CURRENT_DIR=`pwd` info "Building VLCKit.framework in ${CURRENT_DIR}" buildxcodeproj VLCKit "VLCKit" "macosx" # remove intermediate build result we don't need to keep spushd build rm ${CONFIGURATION}/libStaticLibVLC.a spopd # build info "Build of VLCKit.framework completed" fi fi