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