1*b2055c35SXin Li#!/bin/bash 2*b2055c35SXin Li# 3*b2055c35SXin Li# This script generates 'WebP.framework' and 'WebPDecoder.framework', 4*b2055c35SXin Li# 'WebPDemux.framework' and 'WebPMux.framework'. 5*b2055c35SXin Li# An iOS app can decode WebP images by including 'WebPDecoder.framework' and 6*b2055c35SXin Li# both encode and decode WebP images by including 'WebP.framework'. 7*b2055c35SXin Li# 8*b2055c35SXin Li# Run ./iosbuild.sh to generate the frameworks under the current directory 9*b2055c35SXin Li# (the previous build will be erased if it exists). 10*b2055c35SXin Li# 11*b2055c35SXin Li# This script is inspired by the build script written by Carson McDonald. 12*b2055c35SXin Li# (https://www.ioncannon.net/programming/1483/using-webp-to-reduce-native-ios-app-size/). 13*b2055c35SXin Li 14*b2055c35SXin Liset -e 15*b2055c35SXin Li 16*b2055c35SXin Li# Set this variable based on the desired minimum deployment target. 17*b2055c35SXin Lireadonly IOS_MIN_VERSION=6.0 18*b2055c35SXin Li 19*b2055c35SXin Li# Extract the latest SDK version from the final field of the form: iphoneosX.Y 20*b2055c35SXin Lireadonly SDK=$(xcodebuild -showsdks \ 21*b2055c35SXin Li | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}' 22*b2055c35SXin Li) 23*b2055c35SXin Li# Extract Xcode version. 24*b2055c35SXin Lireadonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2) 25*b2055c35SXin Liif [[ -z "${XCODE}" ]]; then 26*b2055c35SXin Li echo "Xcode not available" 27*b2055c35SXin Li exit 1 28*b2055c35SXin Lifi 29*b2055c35SXin Li 30*b2055c35SXin Lireadonly OLDPATH=${PATH} 31*b2055c35SXin Li 32*b2055c35SXin Li# Add iPhoneOS-V6 to the list of platforms below if you need armv6 support. 33*b2055c35SXin Li# Note that iPhoneOS-V6 support is not available with the iOS6 SDK. 34*b2055c35SXin LiPLATFORMS="iPhoneSimulator iPhoneSimulator64" 35*b2055c35SXin LiPLATFORMS+=" iPhoneOS-V7 iPhoneOS-V7s iPhoneOS-V7-arm64" 36*b2055c35SXin Lireadonly PLATFORMS 37*b2055c35SXin Lireadonly SRCDIR=$(dirname $0) 38*b2055c35SXin Lireadonly TOPDIR=$(pwd) 39*b2055c35SXin Lireadonly BUILDDIR="${TOPDIR}/iosbuild" 40*b2055c35SXin Lireadonly TARGETDIR="${TOPDIR}/WebP.framework" 41*b2055c35SXin Lireadonly DECTARGETDIR="${TOPDIR}/WebPDecoder.framework" 42*b2055c35SXin Lireadonly MUXTARGETDIR="${TOPDIR}/WebPMux.framework" 43*b2055c35SXin Lireadonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.framework" 44*b2055c35SXin Lireadonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.framework" 45*b2055c35SXin Lireadonly DEVELOPER=$(xcode-select --print-path) 46*b2055c35SXin Lireadonly PLATFORMSROOT="${DEVELOPER}/Platforms" 47*b2055c35SXin Lireadonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo) 48*b2055c35SXin LiLIBLIST='' 49*b2055c35SXin LiDECLIBLIST='' 50*b2055c35SXin LiMUXLIBLIST='' 51*b2055c35SXin LiDEMUXLIBLIST='' 52*b2055c35SXin Li 53*b2055c35SXin Liif [[ -z "${SDK}" ]]; then 54*b2055c35SXin Li echo "iOS SDK not available" 55*b2055c35SXin Li exit 1 56*b2055c35SXin Lielif [[ ${SDK%%.*} -gt 8 ]]; then 57*b2055c35SXin Li EXTRA_CFLAGS="-fembed-bitcode" 58*b2055c35SXin Lielif [[ ${SDK%%.*} -le 6 ]]; then 59*b2055c35SXin Li echo "You need iOS SDK version 6.0 or above" 60*b2055c35SXin Li exit 1 61*b2055c35SXin Lifi 62*b2055c35SXin Li 63*b2055c35SXin Liecho "Xcode Version: ${XCODE}" 64*b2055c35SXin Liecho "iOS SDK Version: ${SDK}" 65*b2055c35SXin Li 66*b2055c35SXin Liif [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \ 67*b2055c35SXin Li || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \ 68*b2055c35SXin Li || -e "${SHARPYUVTARGETDIR}" ]]; then 69*b2055c35SXin Li cat << EOF 70*b2055c35SXin LiWARNING: The following directories will be deleted: 71*b2055c35SXin LiWARNING: ${BUILDDIR} 72*b2055c35SXin LiWARNING: ${TARGETDIR} 73*b2055c35SXin LiWARNING: ${DECTARGETDIR} 74*b2055c35SXin LiWARNING: ${MUXTARGETDIR} 75*b2055c35SXin LiWARNING: ${DEMUXTARGETDIR} 76*b2055c35SXin LiWARNING: ${SHARPYUVTARGETDIR} 77*b2055c35SXin LiWARNING: The build will continue in 5 seconds... 78*b2055c35SXin LiEOF 79*b2055c35SXin Li sleep 5 80*b2055c35SXin Lifi 81*b2055c35SXin Lirm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \ 82*b2055c35SXin Li ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR} 83*b2055c35SXin Limkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \ 84*b2055c35SXin Li ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/ \ 85*b2055c35SXin Li ${SHARPYUVTARGETDIR}/Headers/ 86*b2055c35SXin Li 87*b2055c35SXin Liif [[ ! -e ${SRCDIR}/configure ]]; then 88*b2055c35SXin Li if ! (cd ${SRCDIR} && sh autogen.sh); then 89*b2055c35SXin Li cat << EOF 90*b2055c35SXin LiError creating configure script! 91*b2055c35SXin LiThis script requires the autoconf/automake and libtool to build. MacPorts can 92*b2055c35SXin Libe used to obtain these: 93*b2055c35SXin Lihttps://www.macports.org/install.php 94*b2055c35SXin LiEOF 95*b2055c35SXin Li exit 1 96*b2055c35SXin Li fi 97*b2055c35SXin Lifi 98*b2055c35SXin Li 99*b2055c35SXin Lifor PLATFORM in ${PLATFORMS}; do 100*b2055c35SXin Li ARCH2="" 101*b2055c35SXin Li if [[ "${PLATFORM}" == "iPhoneOS-V7-arm64" ]]; then 102*b2055c35SXin Li PLATFORM="iPhoneOS" 103*b2055c35SXin Li ARCH="aarch64" 104*b2055c35SXin Li ARCH2="arm64" 105*b2055c35SXin Li elif [[ "${PLATFORM}" == "iPhoneOS-V7s" ]]; then 106*b2055c35SXin Li PLATFORM="iPhoneOS" 107*b2055c35SXin Li ARCH="armv7s" 108*b2055c35SXin Li elif [[ "${PLATFORM}" == "iPhoneOS-V7" ]]; then 109*b2055c35SXin Li PLATFORM="iPhoneOS" 110*b2055c35SXin Li ARCH="armv7" 111*b2055c35SXin Li elif [[ "${PLATFORM}" == "iPhoneOS-V6" ]]; then 112*b2055c35SXin Li PLATFORM="iPhoneOS" 113*b2055c35SXin Li ARCH="armv6" 114*b2055c35SXin Li elif [[ "${PLATFORM}" == "iPhoneSimulator64" ]]; then 115*b2055c35SXin Li PLATFORM="iPhoneSimulator" 116*b2055c35SXin Li ARCH="x86_64" 117*b2055c35SXin Li else 118*b2055c35SXin Li ARCH="i386" 119*b2055c35SXin Li fi 120*b2055c35SXin Li 121*b2055c35SXin Li ROOTDIR="${BUILDDIR}/${PLATFORM}-${SDK}-${ARCH}" 122*b2055c35SXin Li mkdir -p "${ROOTDIR}" 123*b2055c35SXin Li 124*b2055c35SXin Li DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain" 125*b2055c35SXin Li SDKROOT="${PLATFORMSROOT}/" 126*b2055c35SXin Li SDKROOT+="${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK}.sdk/" 127*b2055c35SXin Li CFLAGS="-arch ${ARCH2:-${ARCH}} -pipe -isysroot ${SDKROOT} -O3 -DNDEBUG" 128*b2055c35SXin Li CFLAGS+=" -miphoneos-version-min=${IOS_MIN_VERSION} ${EXTRA_CFLAGS}" 129*b2055c35SXin Li 130*b2055c35SXin Li set -x 131*b2055c35SXin Li export PATH="${DEVROOT}/usr/bin:${OLDPATH}" 132*b2055c35SXin Li ${SRCDIR}/configure --host=${ARCH}-apple-darwin --prefix=${ROOTDIR} \ 133*b2055c35SXin Li --build=$(${SRCDIR}/config.guess) \ 134*b2055c35SXin Li --disable-shared --enable-static \ 135*b2055c35SXin Li --enable-libwebpdecoder --enable-swap-16bit-csp \ 136*b2055c35SXin Li --enable-libwebpmux \ 137*b2055c35SXin Li CFLAGS="${CFLAGS}" 138*b2055c35SXin Li set +x 139*b2055c35SXin Li 140*b2055c35SXin Li # Build only the libraries, skip the examples. 141*b2055c35SXin Li make V=0 -C sharpyuv install 142*b2055c35SXin Li make V=0 -C src install 143*b2055c35SXin Li 144*b2055c35SXin Li LIBLIST+=" ${ROOTDIR}/lib/libwebp.a" 145*b2055c35SXin Li DECLIBLIST+=" ${ROOTDIR}/lib/libwebpdecoder.a" 146*b2055c35SXin Li MUXLIBLIST+=" ${ROOTDIR}/lib/libwebpmux.a" 147*b2055c35SXin Li DEMUXLIBLIST+=" ${ROOTDIR}/lib/libwebpdemux.a" 148*b2055c35SXin Li SHARPYUVLIBLIST+=" ${ROOTDIR}/lib/libsharpyuv.a" 149*b2055c35SXin Li 150*b2055c35SXin Li make clean 151*b2055c35SXin Li 152*b2055c35SXin Li export PATH=${OLDPATH} 153*b2055c35SXin Lidone 154*b2055c35SXin Li 155*b2055c35SXin Liecho "LIBLIST = ${LIBLIST}" 156*b2055c35SXin Licp -a ${SRCDIR}/src/webp/{decode,encode,types}.h ${TARGETDIR}/Headers/ 157*b2055c35SXin Li${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP 158*b2055c35SXin Li 159*b2055c35SXin Liecho "DECLIBLIST = ${DECLIBLIST}" 160*b2055c35SXin Licp -a ${SRCDIR}/src/webp/{decode,types}.h ${DECTARGETDIR}/Headers/ 161*b2055c35SXin Li${LIPO} -create ${DECLIBLIST} -output ${DECTARGETDIR}/WebPDecoder 162*b2055c35SXin Li 163*b2055c35SXin Liecho "MUXLIBLIST = ${MUXLIBLIST}" 164*b2055c35SXin Licp -a ${SRCDIR}/src/webp/{types,mux,mux_types}.h \ 165*b2055c35SXin Li ${MUXTARGETDIR}/Headers/ 166*b2055c35SXin Li${LIPO} -create ${MUXLIBLIST} -output ${MUXTARGETDIR}/WebPMux 167*b2055c35SXin Li 168*b2055c35SXin Liecho "DEMUXLIBLIST = ${DEMUXLIBLIST}" 169*b2055c35SXin Licp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \ 170*b2055c35SXin Li ${DEMUXTARGETDIR}/Headers/ 171*b2055c35SXin Li${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux 172*b2055c35SXin Li 173*b2055c35SXin Liecho "SHARPYUVLIBLIST = ${SHARPYUVLIBLIST}" 174*b2055c35SXin Licp -a ${SRCDIR}/sharpyuv/{sharpyuv,sharpyuv_csp}.h \ 175*b2055c35SXin Li ${SHARPYUVTARGETDIR}/Headers/ 176*b2055c35SXin Li${LIPO} -create ${SHARPYUVLIBLIST} -output ${SHARPYUVTARGETDIR}/SharpYuv 177*b2055c35SXin Li 178*b2055c35SXin Liecho "SUCCESS" 179