1*b2055c35SXin Li#!/bin/bash 2*b2055c35SXin Li# Copyright (c) 2021, Google Inc. All rights reserved. 3*b2055c35SXin Li# 4*b2055c35SXin Li# Redistribution and use in source and binary forms, with or without 5*b2055c35SXin Li# modification, are permitted provided that the following conditions are 6*b2055c35SXin Li# met: 7*b2055c35SXin Li# 8*b2055c35SXin Li# * Redistributions of source code must retain the above copyright 9*b2055c35SXin Li# notice, this list of conditions and the following disclaimer. 10*b2055c35SXin Li# 11*b2055c35SXin Li# * Redistributions in binary form must reproduce the above copyright 12*b2055c35SXin Li# notice, this list of conditions and the following disclaimer in 13*b2055c35SXin Li# the documentation and/or other materials provided with the 14*b2055c35SXin Li# distribution. 15*b2055c35SXin Li# 16*b2055c35SXin Li# * Neither the name of Google nor the names of its contributors may 17*b2055c35SXin Li# be used to endorse or promote products derived from this software 18*b2055c35SXin Li# without specific prior written permission. 19*b2055c35SXin Li# 20*b2055c35SXin Li# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*b2055c35SXin Li# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*b2055c35SXin Li# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23*b2055c35SXin Li# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24*b2055c35SXin Li# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25*b2055c35SXin Li# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26*b2055c35SXin Li# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*b2055c35SXin Li# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*b2055c35SXin Li# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*b2055c35SXin Li# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30*b2055c35SXin Li# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*b2055c35SXin Li 32*b2055c35SXin Liset -xe 33*b2055c35SXin LiLIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")" 34*b2055c35SXin Lireadonly LIBWEBP_ROOT 35*b2055c35SXin Lireadonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.android.XXX)"} 36*b2055c35SXin Li# shellcheck source=infra/common.sh 37*b2055c35SXin Lisource "${LIBWEBP_ROOT}/infra/common.sh" 38*b2055c35SXin Li 39*b2055c35SXin Liusage() { 40*b2055c35SXin Li cat << EOF 41*b2055c35SXin LiUsage: $(basename "$0") BUILD_TYPE APP_ABI 42*b2055c35SXin LiOptions: 43*b2055c35SXin LiBUILD_TYPE supported build types: 44*b2055c35SXin Li static 45*b2055c35SXin Li static-debug 46*b2055c35SXin Li shared 47*b2055c35SXin Li shared-debug 48*b2055c35SXin LiAPP_ABI supported application binary interfaces: 49*b2055c35SXin Li armeabi-v7a 50*b2055c35SXin Li arm64-v8a 51*b2055c35SXin Li x86 52*b2055c35SXin Li x86_64 53*b2055c35SXin LiEnvironment variables: 54*b2055c35SXin LiWORKSPACE directory where the build is done. 55*b2055c35SXin LiANDROID_NDK_DIR directory where the android ndk tools are. 56*b2055c35SXin LiEOF 57*b2055c35SXin Li} 58*b2055c35SXin Li 59*b2055c35SXin Li################################################################################ 60*b2055c35SXin Liecho "Building libwebp for Android in ${WORKSPACE}" 61*b2055c35SXin Li 62*b2055c35SXin Liif [[ ! -d "${WORKSPACE}" ]]; then 63*b2055c35SXin Li log_err "${WORKSPACE} directory does not exist." 64*b2055c35SXin Li exit 1 65*b2055c35SXin Lifi 66*b2055c35SXin Li 67*b2055c35SXin Lireadonly BUILD_TYPE=${1:?"BUILD_TYPE is not defined.$( 68*b2055c35SXin Li echo 69*b2055c35SXin Li usage 70*b2055c35SXin Li)"} 71*b2055c35SXin Lireadonly APP_ABI=${2:?"APP_ABI not defined.$( 72*b2055c35SXin Li echo 73*b2055c35SXin Li usage 74*b2055c35SXin Li)"} 75*b2055c35SXin Lireadonly ANDROID_NDK_DIR=${ANDROID_NDK_DIR:?"ANDROID_NDK_DIR is not defined.$( 76*b2055c35SXin Li echo 77*b2055c35SXin Li usage 78*b2055c35SXin Li)"} 79*b2055c35SXin Lireadonly BUILD_DIR="${WORKSPACE}/build-${BUILD_TYPE}" 80*b2055c35SXin Lireadonly STANDALONE_ANDROID_DIR="${WORKSPACE}/android" 81*b2055c35SXin Li 82*b2055c35SXin Liif [[ ! -x "${ANDROID_NDK_DIR}/ndk-build" ]]; then 83*b2055c35SXin Li log_err "unable to find ndk-build in ANDROID_NDK_DIR: ${ANDROID_NDK_DIR}." 84*b2055c35SXin Li exit 1 85*b2055c35SXin Lifi 86*b2055c35SXin Li 87*b2055c35SXin LiCFLAGS= 88*b2055c35SXin LiLDFLAGS= 89*b2055c35SXin Liopts=() 90*b2055c35SXin Licase "${BUILD_TYPE}" in 91*b2055c35SXin Li *debug) 92*b2055c35SXin Li readonly APP_OPTIM="debug" 93*b2055c35SXin Li CFLAGS="-O0 -g" 94*b2055c35SXin Li opts+=("--enable-asserts") 95*b2055c35SXin Li ;; 96*b2055c35SXin Li static* | shared*) 97*b2055c35SXin Li readonly APP_OPTIM="release" 98*b2055c35SXin Li CFLAGS="-O2 -g" 99*b2055c35SXin Li ;; 100*b2055c35SXin Li *) 101*b2055c35SXin Li usage 102*b2055c35SXin Li exit 1 103*b2055c35SXin Li ;; 104*b2055c35SXin Liesac 105*b2055c35SXin Li 106*b2055c35SXin Licase "${BUILD_TYPE}" in 107*b2055c35SXin Li shared*) readonly SHARED="1" ;; 108*b2055c35SXin Li *) 109*b2055c35SXin Li readonly SHARED="0" 110*b2055c35SXin Li CFLAGS="${CFLAGS} -fPIE" 111*b2055c35SXin Li LDFLAGS="${LDFLAGS} -Wl,-pie" 112*b2055c35SXin Li opts+=("--disable-shared") 113*b2055c35SXin Li ;; 114*b2055c35SXin Liesac 115*b2055c35SXin Li 116*b2055c35SXin Li# Create a fresh build directory 117*b2055c35SXin Limake_build_dir "${BUILD_DIR}" 118*b2055c35SXin Licd "${BUILD_DIR}" 119*b2055c35SXin Liln -s "${LIBWEBP_ROOT}" jni 120*b2055c35SXin Li 121*b2055c35SXin Li"${ANDROID_NDK_DIR}/ndk-build" -j2 \ 122*b2055c35SXin Li APP_ABI="${APP_ABI}" \ 123*b2055c35SXin Li APP_OPTIM="${APP_OPTIM}" \ 124*b2055c35SXin Li ENABLE_SHARED="${SHARED}" 125*b2055c35SXin Li 126*b2055c35SXin Licd "${LIBWEBP_ROOT}" 127*b2055c35SXin Li./autogen.sh 128*b2055c35SXin Li 129*b2055c35SXin Licase "${APP_ABI}" in 130*b2055c35SXin Li armeabi*) arch="arm" ;; 131*b2055c35SXin Li arm64*) arch="arm64" ;; 132*b2055c35SXin Li *) arch="${APP_ABI}" ;; 133*b2055c35SXin Liesac 134*b2055c35SXin Li# TODO(b/185520507): remove this and use the binaries from 135*b2055c35SXin Li# toolchains/llvm/prebuilt/ directly. 136*b2055c35SXin Lirm -rf "${STANDALONE_ANDROID_DIR}" 137*b2055c35SXin Li"${ANDROID_NDK_DIR}/build/tools/make_standalone_toolchain.py" \ 138*b2055c35SXin Li --api 24 --arch "${arch}" --stl gnustl --install-dir \ 139*b2055c35SXin Li "${STANDALONE_ANDROID_DIR}" 140*b2055c35SXin Liexport PATH="${STANDALONE_ANDROID_DIR}/bin:${PATH}" 141*b2055c35SXin Li 142*b2055c35SXin Lirm -rf "${BUILD_DIR}" 143*b2055c35SXin Limake_build_dir "${BUILD_DIR}" 144*b2055c35SXin Licd "${BUILD_DIR}" 145*b2055c35SXin Li 146*b2055c35SXin Licase "${arch}" in 147*b2055c35SXin Li arm) 148*b2055c35SXin Li host="arm-linux-androideabi" 149*b2055c35SXin Li case "${APP_ABI}" in 150*b2055c35SXin Li armeabi) ;; 151*b2055c35SXin Li armeabi-v7a) 152*b2055c35SXin Li CFLAGS="${CFLAGS} -march=armv7-a -mfpu=neon -mfloat-abi=softfp" 153*b2055c35SXin Li ;; 154*b2055c35SXin Li *) ;; # No configuration needed 155*b2055c35SXin Li esac 156*b2055c35SXin Li ;; 157*b2055c35SXin Li arm64) 158*b2055c35SXin Li host="aarch64-linux-android" 159*b2055c35SXin Li ;; 160*b2055c35SXin Li x86) 161*b2055c35SXin Li host="i686-linux-android" 162*b2055c35SXin Li ;; 163*b2055c35SXin Li x86_64) 164*b2055c35SXin Li host="x86_64-linux-android" 165*b2055c35SXin Li ;; 166*b2055c35SXin Li *) ;; # Skip configuration 167*b2055c35SXin Liesac 168*b2055c35SXin Li 169*b2055c35SXin Lisetup_ccache 170*b2055c35SXin LiCC="clang" 171*b2055c35SXin Li 172*b2055c35SXin Li"${LIBWEBP_ROOT}/configure" --host "${host}" --build \ 173*b2055c35SXin Li "$("${LIBWEBP_ROOT}/config.guess")" CC="${CC}" CFLAGS="${CFLAGS}" \ 174*b2055c35SXin Li LDFLAGS="${LDFLAGS}" "${opts[@]}" 175*b2055c35SXin Limake -j 176*b2055c35SXin Li 177*b2055c35SXin Liif [[ "${GERRIT_REFSPEC:-}" = "refs/heads/portable-intrinsics" ]] \ 178*b2055c35SXin Li || [[ "${GERRIT_BRANCH:-}" = "portable-intrinsics" ]]; then 179*b2055c35SXin Li cd "${WORKSPACE}" 180*b2055c35SXin Li rm -rf build && mkdir build 181*b2055c35SXin Li cd build 182*b2055c35SXin Li standalone="${WORKSPACE}/android" 183*b2055c35SXin Li cmake ../libwebp \ 184*b2055c35SXin Li -DWEBP_BUILD_DWEBP=1 \ 185*b2055c35SXin Li -DCMAKE_C_COMPILER="${standalone}/bin/clang" \ 186*b2055c35SXin Li -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \ 187*b2055c35SXin Li -DCMAKE_C_FLAGS=-fPIE \ 188*b2055c35SXin Li -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \ 189*b2055c35SXin Li -DCMAKE_BUILD_TYPE=Release \ 190*b2055c35SXin Li -DWEBP_ENABLE_WASM=1 191*b2055c35SXin Li make -j2 192*b2055c35SXin Li 193*b2055c35SXin Li cd "${WORKSPACE}" 194*b2055c35SXin Li make_build_dir "${BUILD_DIR}" 195*b2055c35SXin Li cd "${BUILD_DIR}" 196*b2055c35SXin Li case "${APP_ABI}" in 197*b2055c35SXin Li armeabi-v7a | arm64*) 198*b2055c35SXin Li cmake "${LIBWEBP_ROOT}" \ 199*b2055c35SXin Li -DWEBP_BUILD_DWEBP=1 \ 200*b2055c35SXin Li -DCMAKE_C_COMPILER="${standalone}/bin/clang" \ 201*b2055c35SXin Li -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \ 202*b2055c35SXin Li -DCMAKE_C_FLAGS='-fPIE -DENABLE_NEON_BUILTIN_MULHI_INT16X8' \ 203*b2055c35SXin Li -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \ 204*b2055c35SXin Li -DCMAKE_BUILD_TYPE=Release \ 205*b2055c35SXin Li -DWEBP_ENABLE_WASM=1 206*b2055c35SXin Li make -j2 207*b2055c35SXin Li ;; 208*b2055c35SXin Li x86*) 209*b2055c35SXin Li cmake "${LIBWEBP_ROOT}" \ 210*b2055c35SXin Li -DWEBP_BUILD_DWEBP=1 \ 211*b2055c35SXin Li -DCMAKE_C_COMPILER="${standalone}/bin/clang" \ 212*b2055c35SXin Li -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \ 213*b2055c35SXin Li -DCMAKE_C_FLAGS='-fPIE -DENABLE_X86_BUILTIN_MULHI_INT16X8' \ 214*b2055c35SXin Li -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \ 215*b2055c35SXin Li -DCMAKE_BUILD_TYPE=Release \ 216*b2055c35SXin Li -DWEBP_ENABLE_WASM=1 217*b2055c35SXin Li make -j2 218*b2055c35SXin Li ;; 219*b2055c35SXin Li *) 220*b2055c35SXin Li log_err "APP_ABI not supported." 221*b2055c35SXin Li exit 1 222*b2055c35SXin Li ;; 223*b2055c35SXin Li esac 224*b2055c35SXin Lifi 225