├── .gitignore ├── README.md ├── build ├── clean ├── rebuild ├── scripts ├── ffmpeg-build ├── freetype-build ├── freetype-clean ├── fribidi-build ├── fribidi-clean ├── harfbuzz-build ├── harfbuzz-clean ├── libass-build ├── libass-clean ├── mpv-build ├── mpv-clean └── uchardet-build └── update /.gitignore: -------------------------------------------------------------------------------- 1 | tarballs/ 2 | src/ 3 | build-*/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Overview 2 | 3 | This is a shell script to build mpv libraries for iOS and macOS apps. 4 | 5 | This script refers to the mpv official build script [mpv-build](https://github.com/mpv-player/mpv-build). 6 | 7 | Tested with: 8 | 9 | - macOS 10.13.4 10 | - Xcode 9.3 for mac 11 | - Xcode 8.3.3 for iOS 12 | 13 | ## Usage 14 | 15 | - Clone code 16 | 17 | > ./update 18 | 19 | - To build for macOS 20 | 21 | > ./build 22 | 23 | - To build for iOS 24 | 25 | > ./build -p iOS 26 | 27 | - Get help 28 | 29 | > ./build -h 30 | 31 | ​ -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | export PLATFORM="macosx" 5 | MODULES="uchardet fribidi freetype harfbuzz libass ffmpeg mpv" 6 | 7 | info() 8 | { 9 | local green="\033[1;32m" 10 | local normal="\033[0m" 11 | echo "[${green}info${normal}] $1" 12 | } 13 | 14 | usage() 15 | { 16 | cat << EOF 17 | usage: $0 [-p platform] [-d] [-s] 18 | 19 | OPTHIONS 20 | -h Show help 21 | -p Platform (iOS|macosx) 22 | -s Build for iOS simulator #todo: 23 | -d Enable debug #todo: 24 | -b Enable bitcode 25 | -v Be more verbose 26 | -m Specify which modules to be build (uchardet|fribidi|freetype|harfbuzz|libass|ffmpeg|mpv) 27 | EOF 28 | } 29 | 30 | dylib_process() 31 | { 32 | local LIB="$1" 33 | DIRNAME=`dirname "$LIB"` 34 | LIBNAME=`basename "$LIB"` 35 | install_name_tool -id "$RPATH/$LIBNAME" "$LIB" 36 | for INSTLNAME in $(otool -L $LIB | grep -e '\t' | awk '{ print $1 }'); do 37 | BASENAME=`basename "$INSTLNAME"` 38 | if [[ 39 | $INSTLNAME == $SYSTEMPRE || 40 | $INSTLNAME == $USRLIBPRE || 41 | $INSTLNAME == $EXEPRE || 42 | $INSTLNAME == *libobjc.* || 43 | $INSTLNAME == *libSystem.* || 44 | $INSTLNAME == *libc.* || 45 | $INSTLNAME == *libgcc.* || 46 | $INSTLNAME == *$LIBNAME* || 47 | $BASENAME = "Python" 48 | ]]; then 49 | continue 50 | fi 51 | install_name_tool -change "$INSTLNAME" "$RPATH/$BASENAME" "$LIB" 52 | if ! ls | grep -q "$BASENAME"; then 53 | info "$BASENAME not found,$LIBNAME depends on it,copy it" 54 | DST="$DIRNAME/$BASENAME" 55 | cp -av "$INSTLNAME" "$DST" 56 | if [[ -L "$INSTLNAME" ]]; then 57 | cp -av "`dirname $INSTLNAME`/`readlink $INSTLNAME`" "$DIRNAME" 58 | fi 59 | chmod 755 "$DST" 60 | dylib_process "$DST" 61 | fi 62 | done 63 | } 64 | 65 | while getopts "hp:sdbvm:" OPTHION; do 66 | case $OPTHION in 67 | h ) 68 | usage 69 | exit 1 70 | ;; 71 | p ) 72 | PLATFORM=$(echo "$OPTARG" | awk '{print tolower($0)}') 73 | ;; 74 | s ) 75 | BUILD_SIMULATOR=yes 76 | ;; 77 | d ) 78 | CONFIGURATION="Debug" 79 | ;; 80 | b ) 81 | BITCODE=yes 82 | ;; 83 | v ) 84 | VERBOSE=yes 85 | ;; 86 | m ) 87 | MODULES=$OPTARG 88 | ;; 89 | ? ) 90 | info "Find unrecognized opthion" 91 | usage 92 | exit 1 93 | ;; 94 | esac 95 | done 96 | 97 | if [[ "$PLATFORM" != "ios" && "$PLATFORM" != "macosx" ]]; then 98 | info 'Platform parameter error,must be "iOS" or "macosx"' 99 | exit 1 100 | fi 101 | 102 | if [[ "$VERBOSE" = "yes" ]]; then 103 | set -ex 104 | fi 105 | 106 | ROOT="$(pwd)" 107 | SCRIPTS="$ROOT/scripts" 108 | BUILD="$ROOT/build-$PLATFORM" 109 | LIBS="$BUILD/libs" 110 | SCRATCH="$BUILD/scratch" 111 | THIN="$BUILD/thin" 112 | export SRCPATH="$ROOT/src" 113 | 114 | mkdir -p $LIBS $THIN 115 | 116 | SYSTEMPRE="/System*" 117 | USRLIBPRE="/usr/lib/*" 118 | EXEPRE="@executable_path*" 119 | RPATH="@rpath" 120 | 121 | export LC_ALL=C 122 | export LDFLAGS 123 | export CFLAGS 124 | export CXXFLAGS 125 | export PKG_CONFIG_PATH 126 | export ARCHFLAG 127 | export OPTHIONS 128 | 129 | if [[ "$PLATFORM" = "ios" ]]; then 130 | LIBEXTENSION=".a" 131 | 132 | ARCHS="armv7 arm64" 133 | DEPLOYMENT_TARGET="8.0" 134 | 135 | export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/:$PATH" 136 | export SDKPATH="$(xcodebuild -sdk iphoneos -version Path)" 137 | TCFLAGS="-isysroot $SDKPATH -mios-version-min=$DEPLOYMENT_TARGET" 138 | TLDFLAGS="-isysroot $SDKPATH -Wl,-ios_version_min,$DEPLOYMENT_TARGET -lbz2" 139 | TOPTHIONS="--build=x86_64-apple-darwin14 --enable-static --disable-shared \ 140 | --disable-dependency-tracking --with-pic" 141 | else 142 | LIBEXTENSION=".dylib" 143 | 144 | ARCHS="x86_64" 145 | DEPLOYMENT_TARGET="10.10" 146 | 147 | TCFLAGS="-mmacosx-version-min=$DEPLOYMENT_TARGET" 148 | TLDFLAGS="$TCFLAGS" 149 | TOPTHIONS="--disable-static --enable-shared --with-pic" 150 | fi 151 | 152 | for ARCH in $ARCHS; do 153 | LDFLAGS="$TLDFLAGS -arch $ARCH" 154 | CFLAGS="$TCFLAGS -arch $ARCH" 155 | CXXFLAGS="$CFLAGS" 156 | ARCHFLAG="$ARCH" 157 | 158 | if [[ $ARCH = "arm64" ]]; then 159 | HOSTFLAG="aarch64" 160 | else 161 | HOSTFLAG=$ARCH 162 | fi 163 | 164 | THINSUB="$THIN/$ARCH" 165 | OPTHIONS="--prefix=$THINSUB --exec-prefix=$THINSUB $TOPTHIONS" 166 | PKG_CONFIG_PATH="$THINSUB/lib/pkgconfig" 167 | if [[ "$PLATFORM" = "ios" ]]; then 168 | OPTHIONS="$OPTHIONS --host=$HOSTFLAG-apple-darwin14" 169 | fi 170 | 171 | SCRATCHSUB="$SCRATCH/$ARCH" 172 | for module in $MODULES; do 173 | case $module in 174 | "uchardet" ) 175 | info "Build uchardet" 176 | mkdir -p $SCRATCHSUB/uchardet && cd $_ && $SCRIPTS/uchardet-build 177 | ;; 178 | "fribidi" ) 179 | info "Build fribidi" 180 | mkdir -p $SCRATCHSUB/fribidi && cd $_ && $SCRIPTS/fribidi-build 181 | ;; 182 | "freetype" ) 183 | info "Build freetype" 184 | mkdir -p $SCRATCHSUB/freetype && cd $_ && $SCRIPTS/freetype-build 185 | ;; 186 | "harfbuzz" ) 187 | info "Build harfbuzz" 188 | mkdir -p $SCRATCHSUB/harfbuzz && cd $_ && $SCRIPTS/harfbuzz-build 189 | ;; 190 | "libass" ) 191 | info "Build libass" 192 | mkdir -p $SCRATCHSUB/libass && cd $_ && $SCRIPTS/libass-build 193 | ;; 194 | "ffmpeg" ) 195 | info "Build ffmpeg" 196 | mkdir -p $SCRATCHSUB/ffmpeg && cd $_ && $SCRIPTS/ffmpeg-build 197 | ;; 198 | "mpv" ) 199 | info "Build mpv" 200 | $SCRIPTS/mpv-build && cp $SRCPATH/mpv*/build/libmpv$LIBEXTENSION $THINSUB/lib 201 | ;; 202 | ? ) 203 | info "find Unrecognized module name \n Acceptable name is: $MODULES" 204 | exit 1 205 | ;; 206 | 207 | esac 208 | done 209 | done 210 | 211 | info "Lipo create" 212 | cd $THIN/$ARCHFLAG/lib 213 | for LIB in *$LIBEXTENSION; do 214 | if ! [[ -L "$LIB" ]]; then 215 | lipo -create `find $THIN -name $LIB` -output $LIBS/$LIB 216 | else 217 | cp -av "$LIB" "$LIBS/$LIB" 218 | fi 219 | done 220 | 221 | if [[ "$PLATFORM" = "macosx" ]]; then 222 | info "Install name change" 223 | cd $LIBS 224 | for LIB in *.dylib; do 225 | if [[ ! -L "$LIB" ]]; then 226 | dylib_process "$LIB" 227 | fi 228 | done 229 | fi 230 | 231 | cp -R $SRCPATH/mpv*/libmpv $LIBS 232 | 233 | info "All done!" -------------------------------------------------------------------------------- /clean: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | ROOT="$(pwd)" 5 | export SRCPATH="$ROOT/src" 6 | 7 | scripts/fribidi-clean 8 | scripts/freetype-clean 9 | scripts/harfbuzz-clean 10 | scripts/libass-clean 11 | scripts/mpv-clean 12 | 13 | rm -rf $ROOT/build-* -------------------------------------------------------------------------------- /rebuild: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | ./clean 5 | ./build $@ -------------------------------------------------------------------------------- /scripts/ffmpeg-build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | OPTS="${OPTHIONS%% *} \ 5 | --disable-lzma \ 6 | --disable-securetransport \ 7 | --disable-debug \ 8 | --disable-programs \ 9 | --disable-doc \ 10 | --enable-pic" 11 | 12 | if [[ "$PLATFORM" = "ios" ]]; then 13 | if [[ ! `which gas-preprocessor.pl` ]]; then 14 | curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl -o /usr/local/bin/gas-preprocessor.pl \ 15 | && chmod +x /usr/local/bin/gas-preprocessor.pl 16 | fi 17 | 18 | $SRCPATH/ffmpeg*/configure $OPTS \ 19 | --target-os=darwin \ 20 | --arch=$ARCHFLAG \ 21 | --extra-cflags="$CFLAGS" \ 22 | --enable-cross-compile 23 | else 24 | $SRCPATH/ffmpeg*/configure $OPTS \ 25 | --disable-static \ 26 | --enable-shared 27 | fi 28 | 29 | make -j4 install -------------------------------------------------------------------------------- /scripts/freetype-build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | $SRCPATH/freetype*/configure $OPTHIONS \ 5 | --with-zlib=yes \ 6 | --without-png \ 7 | --with-bzip2=no 8 | make install -------------------------------------------------------------------------------- /scripts/freetype-clean: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -ex 3 | 4 | cd $SRCPATH/freetype* 5 | if [[ -f Makefile ]]; then 6 | make distclean 7 | fi -------------------------------------------------------------------------------- /scripts/fribidi-build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | $SRCPATH/fribidi*/configure $OPTHIONS \ 5 | --disable-docs 6 | make install -------------------------------------------------------------------------------- /scripts/fribidi-clean: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -ex 3 | 4 | cd $SRCPATH/fribidi* 5 | if [[ -f Makefile ]]; then 6 | make distclean 7 | fi -------------------------------------------------------------------------------- /scripts/harfbuzz-build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | $SRCPATH/harfbuzz*/configure $OPTHIONS \ 5 | --with-icu=no \ 6 | --with-glib=no \ 7 | --with-fontconfig=no \ 8 | --with-coretext=yes 9 | make install -------------------------------------------------------------------------------- /scripts/harfbuzz-clean: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -ex 3 | 4 | cd $SRCPATH/harfbuzz* 5 | if [[ -f Makefile ]]; then 6 | make distclean 7 | fi -------------------------------------------------------------------------------- /scripts/libass-build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -ex 3 | 4 | if [[ "$PLATFORM" = "ios" ]]; then 5 | OPT="--disable-fontconfig \ 6 | --disable-require-system-font-provider \ 7 | --enable-directwrite" 8 | fi 9 | $SRCPATH/libass*/configure $OPTHIONS $OPT 10 | 11 | make install -------------------------------------------------------------------------------- /scripts/libass-clean: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -ex 3 | 4 | cd $SRCPATH/libass* 5 | if [[ -f Makefile ]]; then 6 | make distclean 7 | fi -------------------------------------------------------------------------------- /scripts/mpv-build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | if [[ "$PLATFORM" = "ios" ]]; then 5 | OPTS="--disable-cplayer \ 6 | --disable-lcms2 \ 7 | --disable-lua \ 8 | --enable-libmpv-static \ 9 | --enable-ios-gl \ 10 | --enable-gl \ 11 | --disable-javascript" 12 | else 13 | OPTS="--enable-uchardet --enable-libmpv-shared" 14 | fi 15 | 16 | cd $SRCPATH/mpv* 17 | ./bootstrap.py 18 | ./waf configure $OPTS --disable-debug-build 19 | ./waf build -j4 -------------------------------------------------------------------------------- /scripts/mpv-clean: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -ex 3 | 4 | cd $SRCPATH/mpv* 5 | if [[ -f waf ]]; then 6 | ./waf distclean 7 | fi 8 | rm -f DOCS/man/*/mpv.1 version.h input/input_conf.h video/out/vdpau_template.c demux/ebml_types.h demux/ebml_defs.c video/out/gl_video_shaders.h video/out/x11_icon.inc sub/osd_font.h player/lua/defaults.inc player/lua/assdraw.inc player/lua/osc.inc mpv -------------------------------------------------------------------------------- /scripts/uchardet-build: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | PREFIX="${OPTHIONS%% *}" 5 | PREFIX="${PREFIX##*=}" 6 | 7 | OPT="-DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=Release" 8 | 9 | if [[ "$PLATFORM" = "ios" ]]; then 10 | OPT="$OPT -DBUILD_SHARED_LIBS=false" 11 | fi 12 | 13 | cmake $SRCPATH/uchardet* 14 | cmake $SRCPATH/uchardet* $OPT && make 15 | make install -------------------------------------------------------------------------------- /update: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -ex 3 | 4 | FREETYPE_VERSION="2.9" 5 | HARFBUZZ_VERSION="1.7.6" 6 | FRIBIDI_VERSION="1.0.2" 7 | LIBASS_VERSION="0.14.0" 8 | FFMPEG_VERSION="3.4.2" 9 | MPV_VERSION="0.27.2" 10 | UCHARDET_VERSION="0.0.6" 11 | 12 | FREETYPE_URL="https://sourceforge.net/projects/freetype/files/freetype2/$FREETYPE_VERSION/freetype-$FREETYPE_VERSION.tar.bz2" 13 | HARFBUZZ_URL="https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-$HARFBUZZ_VERSION.tar.bz2" 14 | FRIBIDI_URL="https://github.com/fribidi/fribidi/releases/download/v$FRIBIDI_VERSION/fribidi-$FRIBIDI_VERSION.tar.bz2" 15 | LIBASS_URL="https://github.com/libass/libass/releases/download/$LIBASS_VERSION/libass-$LIBASS_VERSION.tar.gz" 16 | FFMPEG_URL="http://www.ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2" 17 | MPV_URL="https://github.com/mpv-player/mpv/archive/v$MPV_VERSION.tar.gz" 18 | UCHARDET_URL="https://www.freedesktop.org/software/uchardet/releases/uchardet-$UCHARDET_VERSION.tar.xz" 19 | 20 | mkdir tarballs src 21 | for URL in $UCHARDET_URL $FREETYPE_URL $HARFBUZZ_URL $FRIBIDI_URL $LIBASS_URL $FFMPEG_URL $MPV_URL; do 22 | TARNAME=${URL##*/} 23 | curl -f -L -- $URL > tarballs/$TARNAME 24 | tar xvf tarballs/$TARNAME -C src 25 | done --------------------------------------------------------------------------------