# ===----------------------------------------------------------------------===## # # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # # ===----------------------------------------------------------------------===## # Bash functions for managing the names of emulator system images. # Parse the image name and set variables: API, TYPE, and ARCH. __parse_emu_img() { if [[ "${1}" =~ ([0-9]+)-(def|goog|play)-(arm|arm64|x86|x86_64)$ ]]; then API=${BASH_REMATCH[1]} case ${BASH_REMATCH[2]} in def) TYPE=default ;; goog) TYPE=google_apis ;; play) TYPE=google_apis_playstore ;; esac ARCH=${BASH_REMATCH[3]} return 0 else return 1 fi } # Check that the emulator image name has valid syntax. validate_emu_img_syntax() { local EMU_IMG="${1}" local API TYPE ARCH if ! __parse_emu_img "${EMU_IMG}"; then echo "\ error: invalid emulator image name: ${EMU_IMG} expected \"\${API}-\${TYPE}-\${ARCH}\" where API is a number, TYPE is one of (def|goog|play), and ARCH is one of arm, arm64, x86, or x86_64." >&2 return 1 fi } docker_image_of_emu_img() { echo "android-emulator-${1}" } # Check that the emulator image name has valid syntax and that the Docker image # is present. On failure, writes an error to stderr and exits the script. validate_emu_img() { local EMU_IMG="${1}" if ! validate_emu_img_syntax "${EMU_IMG}"; then return 1 fi # Make sure Docker is working before trusting other Docker commands. # Temporarily suppress command echoing so we only show 'docker info' output # on failure, and only once. if (set +x; !(docker info &>/dev/null || docker info)); then echo "error: Docker is required for emulator usage but 'docker info' failed" >&2 return 1 fi local DOCKER_IMAGE=$(docker_image_of_emu_img ${EMU_IMG}) if ! docker image inspect ${DOCKER_IMAGE} &>/dev/null; then echo "error: emulator Docker image (${DOCKER_IMAGE}) is not installed" >&2 return 1 fi } api_of_emu_img() { local API TYPE ARCH __parse_emu_img "${1}" echo ${API} } type_of_emu_img() { local API TYPE ARCH __parse_emu_img "${1}" echo ${TYPE} } arch_of_emu_img() { local API TYPE ARCH __parse_emu_img "${1}" echo ${ARCH} } # Expand the short emu_img string into the full SDK package string identifying # the system image. sdk_package_of_emu_img() { local API TYPE ARCH __parse_emu_img "${1}" echo "system-images;android-${API};${TYPE};$(abi_of_arch ${ARCH})" } # Return the Android ABI string for an architecture. abi_of_arch() { case "${1}" in arm) echo armeabi-v7a ;; arm64) echo aarch64-v8a ;; x86) echo x86 ;; x86_64) echo x86_64 ;; *) echo "error: unhandled arch ${1}" >&2; exit 1 ;; esac } triple_of_arch() { case "${1}" in arm) echo armv7a-linux-androideabi ;; arm64) echo aarch64-linux-android ;; x86) echo i686-linux-android ;; x86_64) echo x86_64-linux-android ;; *) echo "error: unhandled arch ${1}" >&2; exit 1 ;; esac }