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