iosbuild.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. set -e
  14. # Set this variable based on the desired minimum deployment target.
  15. readonly IOS_MIN_VERSION=6.0
  16. # Extract the latest SDK version from the final field of the form: iphoneosX.Y
  17. readonly SDK=$(xcodebuild -showsdks \
  18. | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}'
  19. )
  20. # Extract Xcode version.
  21. readonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2)
  22. if [[ -z "${XCODE}" ]]; then
  23. echo "Xcode not available"
  24. exit 1
  25. fi
  26. readonly OLDPATH=${PATH}
  27. # Add iPhoneOS-V6 to the list of platforms below if you need armv6 support.
  28. # Note that iPhoneOS-V6 support is not available with the iOS6 SDK.
  29. PLATFORMS="iPhoneSimulator iPhoneSimulator64"
  30. PLATFORMS+=" iPhoneOS-V7 iPhoneOS-V7s iPhoneOS-V7-arm64"
  31. readonly PLATFORMS
  32. readonly SRCDIR=$(dirname $0)
  33. readonly TOPDIR=$(pwd)
  34. readonly BUILDDIR="${TOPDIR}/iosbuild"
  35. readonly TARGETDIR="${TOPDIR}/WebP.framework"
  36. readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.framework"
  37. readonly MUXTARGETDIR="${TOPDIR}/WebPMux.framework"
  38. readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.framework"
  39. readonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.framework"
  40. readonly DEVELOPER=$(xcode-select --print-path)
  41. readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
  42. readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
  43. LIBLIST=''
  44. DECLIBLIST=''
  45. MUXLIBLIST=''
  46. DEMUXLIBLIST=''
  47. if [[ -z "${SDK}" ]]; then
  48. echo "iOS SDK not available"
  49. exit 1
  50. elif [[ ${SDK%%.*} -gt 8 ]]; then
  51. EXTRA_CFLAGS="-fembed-bitcode"
  52. elif [[ ${SDK%%.*} -le 6 ]]; then
  53. echo "You need iOS SDK version 6.0 or above"
  54. exit 1
  55. fi
  56. echo "Xcode Version: ${XCODE}"
  57. echo "iOS SDK Version: ${SDK}"
  58. if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
  59. || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \
  60. || -e "${SHARPYUVTARGETDIR}" ]]; then
  61. cat << EOF
  62. WARNING: The following directories will be deleted:
  63. WARNING: ${BUILDDIR}
  64. WARNING: ${TARGETDIR}
  65. WARNING: ${DECTARGETDIR}
  66. WARNING: ${MUXTARGETDIR}
  67. WARNING: ${DEMUXTARGETDIR}
  68. WARNING: ${SHARPYUVTARGETDIR}
  69. WARNING: The build will continue in 5 seconds...
  70. EOF
  71. sleep 5
  72. fi
  73. rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
  74. ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR}
  75. mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \
  76. ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/ \
  77. ${SHARPYUVTARGETDIR}/Headers/
  78. if [[ ! -e ${SRCDIR}/configure ]]; then
  79. if ! (cd ${SRCDIR} && sh autogen.sh); then
  80. cat << EOF
  81. Error creating configure script!
  82. This script requires the autoconf/automake and libtool to build. MacPorts can
  83. be used to obtain these:
  84. https://www.macports.org/install.php
  85. EOF
  86. exit 1
  87. fi
  88. fi
  89. for PLATFORM in ${PLATFORMS}; do
  90. ARCH2=""
  91. if [[ "${PLATFORM}" == "iPhoneOS-V7-arm64" ]]; then
  92. PLATFORM="iPhoneOS"
  93. ARCH="aarch64"
  94. ARCH2="arm64"
  95. elif [[ "${PLATFORM}" == "iPhoneOS-V7s" ]]; then
  96. PLATFORM="iPhoneOS"
  97. ARCH="armv7s"
  98. elif [[ "${PLATFORM}" == "iPhoneOS-V7" ]]; then
  99. PLATFORM="iPhoneOS"
  100. ARCH="armv7"
  101. elif [[ "${PLATFORM}" == "iPhoneOS-V6" ]]; then
  102. PLATFORM="iPhoneOS"
  103. ARCH="armv6"
  104. elif [[ "${PLATFORM}" == "iPhoneSimulator64" ]]; then
  105. PLATFORM="iPhoneSimulator"
  106. ARCH="x86_64"
  107. else
  108. ARCH="i386"
  109. fi
  110. ROOTDIR="${BUILDDIR}/${PLATFORM}-${SDK}-${ARCH}"
  111. mkdir -p "${ROOTDIR}"
  112. DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain"
  113. SDKROOT="${PLATFORMSROOT}/"
  114. SDKROOT+="${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK}.sdk/"
  115. CFLAGS="-arch ${ARCH2:-${ARCH}} -pipe -isysroot ${SDKROOT} -O3 -DNDEBUG"
  116. CFLAGS+=" -miphoneos-version-min=${IOS_MIN_VERSION} ${EXTRA_CFLAGS}"
  117. set -x
  118. export PATH="${DEVROOT}/usr/bin:${OLDPATH}"
  119. ${SRCDIR}/configure --host=${ARCH}-apple-darwin --prefix=${ROOTDIR} \
  120. --build=$(${SRCDIR}/config.guess) \
  121. --disable-shared --enable-static \
  122. --enable-libwebpdecoder --enable-swap-16bit-csp \
  123. --enable-libwebpmux \
  124. CFLAGS="${CFLAGS}"
  125. set +x
  126. # Build only the libraries, skip the examples.
  127. make V=0 -C sharpyuv install
  128. make V=0 -C src install
  129. LIBLIST+=" ${ROOTDIR}/lib/libwebp.a"
  130. DECLIBLIST+=" ${ROOTDIR}/lib/libwebpdecoder.a"
  131. MUXLIBLIST+=" ${ROOTDIR}/lib/libwebpmux.a"
  132. DEMUXLIBLIST+=" ${ROOTDIR}/lib/libwebpdemux.a"
  133. SHARPYUVLIBLIST+=" ${ROOTDIR}/lib/libsharpyuv.a"
  134. make clean
  135. export PATH=${OLDPATH}
  136. done
  137. echo "LIBLIST = ${LIBLIST}"
  138. cp -a ${SRCDIR}/src/webp/{decode,encode,types}.h ${TARGETDIR}/Headers/
  139. ${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP
  140. echo "DECLIBLIST = ${DECLIBLIST}"
  141. cp -a ${SRCDIR}/src/webp/{decode,types}.h ${DECTARGETDIR}/Headers/
  142. ${LIPO} -create ${DECLIBLIST} -output ${DECTARGETDIR}/WebPDecoder
  143. echo "MUXLIBLIST = ${MUXLIBLIST}"
  144. cp -a ${SRCDIR}/src/webp/{types,mux,mux_types}.h \
  145. ${MUXTARGETDIR}/Headers/
  146. ${LIPO} -create ${MUXLIBLIST} -output ${MUXTARGETDIR}/WebPMux
  147. echo "DEMUXLIBLIST = ${DEMUXLIBLIST}"
  148. cp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \
  149. ${DEMUXTARGETDIR}/Headers/
  150. ${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux
  151. echo "SHARPYUVLIBLIST = ${SHARPYUVLIBLIST}"
  152. cp -a ${SRCDIR}/sharpyuv/{sharpyuv,sharpyuv_csp}.h \
  153. ${SHARPYUVTARGETDIR}/Headers/
  154. ${LIPO} -create ${SHARPYUVLIBLIST} -output ${SHARPYUVTARGETDIR}/SharpYuv
  155. echo "SUCCESS"