Merge branch 'upstream' into tizen_base
[platform/upstream/libwebp.git] / iosbuild.sh
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 DEVELOPER=$(xcode-select --print-path)
45 readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
46 readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
47 LIBLIST=''
48 DECLIBLIST=''
49 MUXLIBLIST=''
50 DEMUXLIBLIST=''
51
52 if [[ -z "${SDK}" ]]; then
53   echo "iOS SDK not available"
54   exit 1
55 elif [[ ${SDK%%.*} -gt 8 ]]; then
56   EXTRA_CFLAGS="-fembed-bitcode"
57 elif [[ ${SDK%%.*} -le 6 ]]; then
58   echo "You need iOS SDK version 6.0 or above"
59   exit 1
60 fi
61
62 echo "Xcode Version: ${XCODE}"
63 echo "iOS SDK Version: ${SDK}"
64
65 if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
66       || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" ]]; then
67   cat << EOF
68 WARNING: The following directories will be deleted:
69 WARNING:   ${BUILDDIR}
70 WARNING:   ${TARGETDIR}
71 WARNING:   ${DECTARGETDIR}
72 WARNING:   ${MUXTARGETDIR}
73 WARNING:   ${DEMUXTARGETDIR}
74 WARNING: The build will continue in 5 seconds...
75 EOF
76   sleep 5
77 fi
78 rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
79     ${MUXTARGETDIR} ${DEMUXTARGETDIR}
80 mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \
81     ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/
82
83 if [[ ! -e ${SRCDIR}/configure ]]; then
84   if ! (cd ${SRCDIR} && sh autogen.sh); then
85     cat << EOF
86 Error creating configure script!
87 This script requires the autoconf/automake and libtool to build. MacPorts can
88 be used to obtain these:
89 https://www.macports.org/install.php
90 EOF
91     exit 1
92   fi
93 fi
94
95 for PLATFORM in ${PLATFORMS}; do
96   ARCH2=""
97   if [[ "${PLATFORM}" == "iPhoneOS-V7-arm64" ]]; then
98     PLATFORM="iPhoneOS"
99     ARCH="aarch64"
100     ARCH2="arm64"
101   elif [[ "${PLATFORM}" == "iPhoneOS-V7s" ]]; then
102     PLATFORM="iPhoneOS"
103     ARCH="armv7s"
104   elif [[ "${PLATFORM}" == "iPhoneOS-V7" ]]; then
105     PLATFORM="iPhoneOS"
106     ARCH="armv7"
107   elif [[ "${PLATFORM}" == "iPhoneOS-V6" ]]; then
108     PLATFORM="iPhoneOS"
109     ARCH="armv6"
110   elif [[ "${PLATFORM}" == "iPhoneSimulator64" ]]; then
111     PLATFORM="iPhoneSimulator"
112     ARCH="x86_64"
113   else
114     ARCH="i386"
115   fi
116
117   ROOTDIR="${BUILDDIR}/${PLATFORM}-${SDK}-${ARCH}"
118   mkdir -p "${ROOTDIR}"
119
120   DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain"
121   SDKROOT="${PLATFORMSROOT}/"
122   SDKROOT+="${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK}.sdk/"
123   CFLAGS="-arch ${ARCH2:-${ARCH}} -pipe -isysroot ${SDKROOT} -O3 -DNDEBUG"
124   CFLAGS+=" -miphoneos-version-min=${IOS_MIN_VERSION} ${EXTRA_CFLAGS}"
125
126   set -x
127   export PATH="${DEVROOT}/usr/bin:${OLDPATH}"
128   ${SRCDIR}/configure --host=${ARCH}-apple-darwin --prefix=${ROOTDIR} \
129     --build=$(${SRCDIR}/config.guess) \
130     --disable-shared --enable-static \
131     --enable-libwebpdecoder --enable-swap-16bit-csp \
132     --enable-libwebpmux \
133     CFLAGS="${CFLAGS}"
134   set +x
135
136   # Build only the libraries, skip the examples.
137   make V=0 -C sharpyuv
138   make V=0 -C src install
139
140   LIBLIST+=" ${ROOTDIR}/lib/libwebp.a"
141   DECLIBLIST+=" ${ROOTDIR}/lib/libwebpdecoder.a"
142   MUXLIBLIST+=" ${ROOTDIR}/lib/libwebpmux.a"
143   DEMUXLIBLIST+=" ${ROOTDIR}/lib/libwebpdemux.a"
144
145   make clean
146
147   export PATH=${OLDPATH}
148 done
149
150 echo "LIBLIST = ${LIBLIST}"
151 cp -a ${SRCDIR}/src/webp/{decode,encode,types}.h ${TARGETDIR}/Headers/
152 ${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP
153
154 echo "DECLIBLIST = ${DECLIBLIST}"
155 cp -a ${SRCDIR}/src/webp/{decode,types}.h ${DECTARGETDIR}/Headers/
156 ${LIPO} -create ${DECLIBLIST} -output ${DECTARGETDIR}/WebPDecoder
157
158 echo "MUXLIBLIST = ${MUXLIBLIST}"
159 cp -a ${SRCDIR}/src/webp/{types,mux,mux_types}.h \
160     ${MUXTARGETDIR}/Headers/
161 ${LIPO} -create ${MUXLIBLIST} -output ${MUXTARGETDIR}/WebPMux
162
163 echo "DEMUXLIBLIST = ${DEMUXLIBLIST}"
164 cp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \
165     ${DEMUXTARGETDIR}/Headers/
166 ${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux
167
168 echo  "SUCCESS"