go-libwebp

Experimental translation from libwebp to Go source.
Log | Files | Refs | README | LICENSE

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"