xref: /aosp_15_r20/external/webp/iosbuild.sh (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
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