123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #!/bin/bash
- #
- # This script generates 'WebP.framework' and 'WebPDecoder.framework',
- # 'WebPDemux.framework' and 'WebPMux.framework'.
- # An iOS app can decode WebP images by including 'WebPDecoder.framework' and
- # both encode and decode WebP images by including 'WebP.framework'.
- #
- # Run ./iosbuild.sh to generate the frameworks under the current directory
- # (the previous build will be erased if it exists).
- #
- # This script is inspired by the build script written by Carson McDonald.
- # (https://www.ioncannon.net/programming/1483/using-webp-to-reduce-native-ios-app-size/).
- set -e
- # Set this variable based on the desired minimum deployment target.
- readonly IOS_MIN_VERSION=6.0
- # Extract the latest SDK version from the final field of the form: iphoneosX.Y
- readonly SDK=$(xcodebuild -showsdks \
- | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}'
- )
- # Extract Xcode version.
- readonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2)
- if [[ -z "${XCODE}" ]]; then
- echo "Xcode not available"
- exit 1
- fi
- readonly OLDPATH=${PATH}
- # Add iPhoneOS-V6 to the list of platforms below if you need armv6 support.
- # Note that iPhoneOS-V6 support is not available with the iOS6 SDK.
- PLATFORMS="iPhoneSimulator iPhoneSimulator64"
- PLATFORMS+=" iPhoneOS-V7 iPhoneOS-V7s iPhoneOS-V7-arm64"
- readonly PLATFORMS
- readonly SRCDIR=$(dirname $0)
- readonly TOPDIR=$(pwd)
- readonly BUILDDIR="${TOPDIR}/iosbuild"
- readonly TARGETDIR="${TOPDIR}/WebP.framework"
- readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.framework"
- readonly MUXTARGETDIR="${TOPDIR}/WebPMux.framework"
- readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.framework"
- readonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.framework"
- readonly DEVELOPER=$(xcode-select --print-path)
- readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
- readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
- LIBLIST=''
- DECLIBLIST=''
- MUXLIBLIST=''
- DEMUXLIBLIST=''
- if [[ -z "${SDK}" ]]; then
- echo "iOS SDK not available"
- exit 1
- elif [[ ${SDK%%.*} -gt 8 ]]; then
- EXTRA_CFLAGS="-fembed-bitcode"
- elif [[ ${SDK%%.*} -le 6 ]]; then
- echo "You need iOS SDK version 6.0 or above"
- exit 1
- fi
- echo "Xcode Version: ${XCODE}"
- echo "iOS SDK Version: ${SDK}"
- if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
- || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \
- || -e "${SHARPYUVTARGETDIR}" ]]; then
- cat << EOF
- WARNING: The following directories will be deleted:
- WARNING: ${BUILDDIR}
- WARNING: ${TARGETDIR}
- WARNING: ${DECTARGETDIR}
- WARNING: ${MUXTARGETDIR}
- WARNING: ${DEMUXTARGETDIR}
- WARNING: ${SHARPYUVTARGETDIR}
- WARNING: The build will continue in 5 seconds...
- EOF
- sleep 5
- fi
- rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
- ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR}
- mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \
- ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/ \
- ${SHARPYUVTARGETDIR}/Headers/
- if [[ ! -e ${SRCDIR}/configure ]]; then
- if ! (cd ${SRCDIR} && sh autogen.sh); then
- cat << EOF
- Error creating configure script!
- This script requires the autoconf/automake and libtool to build. MacPorts can
- be used to obtain these:
- https://www.macports.org/install.php
- EOF
- exit 1
- fi
- fi
- for PLATFORM in ${PLATFORMS}; do
- ARCH2=""
- if [[ "${PLATFORM}" == "iPhoneOS-V7-arm64" ]]; then
- PLATFORM="iPhoneOS"
- ARCH="aarch64"
- ARCH2="arm64"
- elif [[ "${PLATFORM}" == "iPhoneOS-V7s" ]]; then
- PLATFORM="iPhoneOS"
- ARCH="armv7s"
- elif [[ "${PLATFORM}" == "iPhoneOS-V7" ]]; then
- PLATFORM="iPhoneOS"
- ARCH="armv7"
- elif [[ "${PLATFORM}" == "iPhoneOS-V6" ]]; then
- PLATFORM="iPhoneOS"
- ARCH="armv6"
- elif [[ "${PLATFORM}" == "iPhoneSimulator64" ]]; then
- PLATFORM="iPhoneSimulator"
- ARCH="x86_64"
- else
- ARCH="i386"
- fi
- ROOTDIR="${BUILDDIR}/${PLATFORM}-${SDK}-${ARCH}"
- mkdir -p "${ROOTDIR}"
- DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain"
- SDKROOT="${PLATFORMSROOT}/"
- SDKROOT+="${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK}.sdk/"
- CFLAGS="-arch ${ARCH2:-${ARCH}} -pipe -isysroot ${SDKROOT} -O3 -DNDEBUG"
- CFLAGS+=" -miphoneos-version-min=${IOS_MIN_VERSION} ${EXTRA_CFLAGS}"
- set -x
- export PATH="${DEVROOT}/usr/bin:${OLDPATH}"
- ${SRCDIR}/configure --host=${ARCH}-apple-darwin --prefix=${ROOTDIR} \
- --build=$(${SRCDIR}/config.guess) \
- --disable-shared --enable-static \
- --enable-libwebpdecoder --enable-swap-16bit-csp \
- --enable-libwebpmux \
- CFLAGS="${CFLAGS}"
- set +x
- # Build only the libraries, skip the examples.
- make V=0 -C sharpyuv install
- make V=0 -C src install
- LIBLIST+=" ${ROOTDIR}/lib/libwebp.a"
- DECLIBLIST+=" ${ROOTDIR}/lib/libwebpdecoder.a"
- MUXLIBLIST+=" ${ROOTDIR}/lib/libwebpmux.a"
- DEMUXLIBLIST+=" ${ROOTDIR}/lib/libwebpdemux.a"
- SHARPYUVLIBLIST+=" ${ROOTDIR}/lib/libsharpyuv.a"
- make clean
- export PATH=${OLDPATH}
- done
- echo "LIBLIST = ${LIBLIST}"
- cp -a ${SRCDIR}/src/webp/{decode,encode,types}.h ${TARGETDIR}/Headers/
- ${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP
- echo "DECLIBLIST = ${DECLIBLIST}"
- cp -a ${SRCDIR}/src/webp/{decode,types}.h ${DECTARGETDIR}/Headers/
- ${LIPO} -create ${DECLIBLIST} -output ${DECTARGETDIR}/WebPDecoder
- echo "MUXLIBLIST = ${MUXLIBLIST}"
- cp -a ${SRCDIR}/src/webp/{types,mux,mux_types}.h \
- ${MUXTARGETDIR}/Headers/
- ${LIPO} -create ${MUXLIBLIST} -output ${MUXTARGETDIR}/WebPMux
- echo "DEMUXLIBLIST = ${DEMUXLIBLIST}"
- cp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \
- ${DEMUXTARGETDIR}/Headers/
- ${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux
- echo "SHARPYUVLIBLIST = ${SHARPYUVLIBLIST}"
- cp -a ${SRCDIR}/sharpyuv/{sharpyuv,sharpyuv_csp}.h \
- ${SHARPYUVTARGETDIR}/Headers/
- ${LIPO} -create ${SHARPYUVLIBLIST} -output ${SHARPYUVTARGETDIR}/SharpYuv
- echo "SUCCESS"
|