xref: /aosp_15_r20/external/webp/iosbuild.sh (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
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
14set -e
15
16# Set this variable based on the desired minimum deployment target.
17readonly IOS_MIN_VERSION=6.0
18
19# Extract the latest SDK version from the final field of the form: iphoneosX.Y
20readonly SDK=$(xcodebuild -showsdks \
21  | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}'
22)
23# Extract Xcode version.
24readonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2)
25if [[ -z "${XCODE}" ]]; then
26  echo "Xcode not available"
27  exit 1
28fi
29
30readonly 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.
34PLATFORMS="iPhoneSimulator iPhoneSimulator64"
35PLATFORMS+=" iPhoneOS-V7 iPhoneOS-V7s iPhoneOS-V7-arm64"
36readonly PLATFORMS
37readonly SRCDIR=$(dirname $0)
38readonly TOPDIR=$(pwd)
39readonly BUILDDIR="${TOPDIR}/iosbuild"
40readonly TARGETDIR="${TOPDIR}/WebP.framework"
41readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.framework"
42readonly MUXTARGETDIR="${TOPDIR}/WebPMux.framework"
43readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.framework"
44readonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.framework"
45readonly DEVELOPER=$(xcode-select --print-path)
46readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
47readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
48LIBLIST=''
49DECLIBLIST=''
50MUXLIBLIST=''
51DEMUXLIBLIST=''
52
53if [[ -z "${SDK}" ]]; then
54  echo "iOS SDK not available"
55  exit 1
56elif [[ ${SDK%%.*} -gt 8 ]]; then
57  EXTRA_CFLAGS="-fembed-bitcode"
58elif [[ ${SDK%%.*} -le 6 ]]; then
59  echo "You need iOS SDK version 6.0 or above"
60  exit 1
61fi
62
63echo "Xcode Version: ${XCODE}"
64echo "iOS SDK Version: ${SDK}"
65
66if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
67      || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \
68      || -e "${SHARPYUVTARGETDIR}" ]]; then
69  cat << EOF
70WARNING: The following directories will be deleted:
71WARNING:   ${BUILDDIR}
72WARNING:   ${TARGETDIR}
73WARNING:   ${DECTARGETDIR}
74WARNING:   ${MUXTARGETDIR}
75WARNING:   ${DEMUXTARGETDIR}
76WARNING:   ${SHARPYUVTARGETDIR}
77WARNING: The build will continue in 5 seconds...
78EOF
79  sleep 5
80fi
81rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
82    ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR}
83mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \
84    ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/ \
85    ${SHARPYUVTARGETDIR}/Headers/
86
87if [[ ! -e ${SRCDIR}/configure ]]; then
88  if ! (cd ${SRCDIR} && sh autogen.sh); then
89    cat << EOF
90Error creating configure script!
91This script requires the autoconf/automake and libtool to build. MacPorts can
92be used to obtain these:
93https://www.macports.org/install.php
94EOF
95    exit 1
96  fi
97fi
98
99for 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}
153done
154
155echo "LIBLIST = ${LIBLIST}"
156cp -a ${SRCDIR}/src/webp/{decode,encode,types}.h ${TARGETDIR}/Headers/
157${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP
158
159echo "DECLIBLIST = ${DECLIBLIST}"
160cp -a ${SRCDIR}/src/webp/{decode,types}.h ${DECTARGETDIR}/Headers/
161${LIPO} -create ${DECLIBLIST} -output ${DECTARGETDIR}/WebPDecoder
162
163echo "MUXLIBLIST = ${MUXLIBLIST}"
164cp -a ${SRCDIR}/src/webp/{types,mux,mux_types}.h \
165    ${MUXTARGETDIR}/Headers/
166${LIPO} -create ${MUXLIBLIST} -output ${MUXTARGETDIR}/WebPMux
167
168echo "DEMUXLIBLIST = ${DEMUXLIBLIST}"
169cp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \
170    ${DEMUXTARGETDIR}/Headers/
171${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux
172
173echo "SHARPYUVLIBLIST = ${SHARPYUVLIBLIST}"
174cp -a ${SRCDIR}/sharpyuv/{sharpyuv,sharpyuv_csp}.h \
175    ${SHARPYUVTARGETDIR}/Headers/
176${LIPO} -create ${SHARPYUVLIBLIST} -output ${SHARPYUVTARGETDIR}/SharpYuv
177
178echo  "SUCCESS"
179