1*a67afe4dSAndroid Build Coastguard Worker# Copyright (c) 2019-2024 Cosmin Truta. 2*a67afe4dSAndroid Build Coastguard Worker# 3*a67afe4dSAndroid Build Coastguard Worker# Use, modification and distribution are subject to the MIT License. 4*a67afe4dSAndroid Build Coastguard Worker# Please see the accompanying file LICENSE_MIT.txt 5*a67afe4dSAndroid Build Coastguard Worker# 6*a67afe4dSAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT 7*a67afe4dSAndroid Build Coastguard Worker 8*a67afe4dSAndroid Build Coastguard Workertest -f "$BASH_SOURCE" || { 9*a67afe4dSAndroid Build Coastguard Worker echo >&2 "warning: this module requires Bash version 3 or newer" 10*a67afe4dSAndroid Build Coastguard Worker} 11*a67afe4dSAndroid Build Coastguard Workertest "${#BASH_SOURCE[@]}" -gt 1 || { 12*a67afe4dSAndroid Build Coastguard Worker echo >&2 "warning: this module should be sourced from a Bash script" 13*a67afe4dSAndroid Build Coastguard Worker} 14*a67afe4dSAndroid Build Coastguard Worker 15*a67afe4dSAndroid Build Coastguard Worker# Reset the locale to avoid surprises from locale-dependent commands. 16*a67afe4dSAndroid Build Coastguard Workerexport LC_ALL=C 17*a67afe4dSAndroid Build Coastguard Workerexport LANG=C 18*a67afe4dSAndroid Build Coastguard Workerexport LANGUAGE=C 19*a67afe4dSAndroid Build Coastguard Worker 20*a67afe4dSAndroid Build Coastguard Worker# Reset CDPATH to avoid surprises from the "cd" command. 21*a67afe4dSAndroid Build Coastguard Workerexport CDPATH="" 22*a67afe4dSAndroid Build Coastguard Worker 23*a67afe4dSAndroid Build Coastguard Worker# Initialize the global constants CI_SCRIPT_{NAME,DIR} and CI_TOPLEVEL_DIR. 24*a67afe4dSAndroid Build Coastguard WorkerCI_SCRIPT_NAME="$(basename -- "$0")" 25*a67afe4dSAndroid Build Coastguard WorkerCI_SCRIPT_DIR="$(cd "$(dirname -- "$0")" && pwd)" 26*a67afe4dSAndroid Build Coastguard WorkerCI_TOPLEVEL_DIR="$(cd "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" 27*a67afe4dSAndroid Build Coastguard Worker 28*a67afe4dSAndroid Build Coastguard Worker# Initialize the global constants CI_BUILD_{...} for the host build platform. 29*a67afe4dSAndroid Build Coastguard WorkerCI_BUILD_ARCH="${CI_BUILD_ARCH:-"$(uname -m | tr 'A-Z/\.-' 'a-z____')"}" 30*a67afe4dSAndroid Build Coastguard WorkerCI_BUILD_SYSTEM="${CI_BUILD_SYSTEM:-"$(uname -s | tr 'A-Z/\.-' 'a-z____')"}" 31*a67afe4dSAndroid Build Coastguard Worker 32*a67afe4dSAndroid Build Coastguard Worker# Initialize the global constants CI_TARGET_{...} for the target platform. 33*a67afe4dSAndroid Build Coastguard WorkerCI_TARGET_ARCH="${CI_TARGET_ARCH:-"$CI_BUILD_ARCH"}" 34*a67afe4dSAndroid Build Coastguard WorkerCI_TARGET_SYSTEM="${CI_TARGET_SYSTEM:-"$CI_BUILD_SYSTEM"}" 35*a67afe4dSAndroid Build Coastguard Worker 36*a67afe4dSAndroid Build Coastguard Workerfunction ci_info { 37*a67afe4dSAndroid Build Coastguard Worker printf >&2 "%s: %s\\n" "$CI_SCRIPT_NAME" "$*" 38*a67afe4dSAndroid Build Coastguard Worker} 39*a67afe4dSAndroid Build Coastguard Worker 40*a67afe4dSAndroid Build Coastguard Workerfunction ci_warn { 41*a67afe4dSAndroid Build Coastguard Worker printf >&2 "%s: warning: %s\\n" "$CI_SCRIPT_NAME" "$*" 42*a67afe4dSAndroid Build Coastguard Worker} 43*a67afe4dSAndroid Build Coastguard Worker 44*a67afe4dSAndroid Build Coastguard Workerfunction ci_err { 45*a67afe4dSAndroid Build Coastguard Worker printf >&2 "%s: error: %s\\n" "$CI_SCRIPT_NAME" "$*" 46*a67afe4dSAndroid Build Coastguard Worker exit 2 47*a67afe4dSAndroid Build Coastguard Worker} 48*a67afe4dSAndroid Build Coastguard Worker 49*a67afe4dSAndroid Build Coastguard Workerfunction ci_err_internal { 50*a67afe4dSAndroid Build Coastguard Worker printf >&2 "%s: internal error: %s\\n" "$CI_SCRIPT_NAME" "$*" 51*a67afe4dSAndroid Build Coastguard Worker printf >&2 "ABORTED\\n" 52*a67afe4dSAndroid Build Coastguard Worker # Exit with the conventional SIGABRT code. 53*a67afe4dSAndroid Build Coastguard Worker exit 134 54*a67afe4dSAndroid Build Coastguard Worker} 55*a67afe4dSAndroid Build Coastguard Worker 56*a67afe4dSAndroid Build Coastguard Workerfunction ci_expr { 57*a67afe4dSAndroid Build Coastguard Worker if [[ ${*:-0} == [0-9] ]] 58*a67afe4dSAndroid Build Coastguard Worker then 59*a67afe4dSAndroid Build Coastguard Worker # This is the same as in the else-branch below, albeit much faster 60*a67afe4dSAndroid Build Coastguard Worker # for our intended use cases. 61*a67afe4dSAndroid Build Coastguard Worker return $((!$1)) 62*a67afe4dSAndroid Build Coastguard Worker else 63*a67afe4dSAndroid Build Coastguard Worker # The funny-looking compound command "... && return $? || return $?" 64*a67afe4dSAndroid Build Coastguard Worker # allows the execution to continue uninterrupted under "set -e". 65*a67afe4dSAndroid Build Coastguard Worker expr >/dev/null "$@" && return $? || return $? 66*a67afe4dSAndroid Build Coastguard Worker fi 67*a67afe4dSAndroid Build Coastguard Worker} 68*a67afe4dSAndroid Build Coastguard Worker 69*a67afe4dSAndroid Build Coastguard Workerfunction ci_spawn { 70*a67afe4dSAndroid Build Coastguard Worker printf >&2 "%s: executing:" "$CI_SCRIPT_NAME" 71*a67afe4dSAndroid Build Coastguard Worker printf >&2 " %q" "$@" 72*a67afe4dSAndroid Build Coastguard Worker printf >&2 "\\n" 73*a67afe4dSAndroid Build Coastguard Worker "$@" 74*a67afe4dSAndroid Build Coastguard Worker} 75*a67afe4dSAndroid Build Coastguard Worker 76*a67afe4dSAndroid Build Coastguard Worker# Ensure that the internal initialization is correct. 77*a67afe4dSAndroid Build Coastguard Worker[[ $CI_TOPLEVEL_DIR/ci/lib/ci.lib.sh -ef ${BASH_SOURCE[0]} ]] || { 78*a67afe4dSAndroid Build Coastguard Worker ci_err_internal "bad or missing \$CI_TOPLEVEL_DIR" 79*a67afe4dSAndroid Build Coastguard Worker} 80*a67afe4dSAndroid Build Coastguard Worker[[ $CI_SCRIPT_DIR/$CI_SCRIPT_NAME -ef $0 ]] || { 81*a67afe4dSAndroid Build Coastguard Worker ci_err_internal "bad or missing \$CI_SCRIPT_DIR/\$CI_SCRIPT_NAME" 82*a67afe4dSAndroid Build Coastguard Worker} 83*a67afe4dSAndroid Build Coastguard Worker[[ $CI_BUILD_ARCH && $CI_BUILD_SYSTEM ]] || { 84*a67afe4dSAndroid Build Coastguard Worker ci_err_internal "missing \$CI_BUILD_ARCH or \$CI_BUILD_SYSTEM" 85*a67afe4dSAndroid Build Coastguard Worker} 86*a67afe4dSAndroid Build Coastguard Worker[[ $CI_TARGET_ARCH && $CI_TARGET_SYSTEM ]] || { 87*a67afe4dSAndroid Build Coastguard Worker ci_err_internal "missing \$CI_TARGET_ARCH or \$CI_TARGET_SYSTEM" 88*a67afe4dSAndroid Build Coastguard Worker} 89*a67afe4dSAndroid Build Coastguard Worker 90*a67afe4dSAndroid Build Coastguard Worker# Ensure that the user initialization is correct. 91*a67afe4dSAndroid Build Coastguard Worker[[ ${CI_FORCE:-0} == [01] ]] || { 92*a67afe4dSAndroid Build Coastguard Worker ci_err "bad boolean option: \$CI_FORCE: '$CI_FORCE'" 93*a67afe4dSAndroid Build Coastguard Worker} 94*a67afe4dSAndroid Build Coastguard Worker[[ ${CI_NO_TEST:-0} == [01] ]] || { 95*a67afe4dSAndroid Build Coastguard Worker ci_err "bad boolean option: \$CI_NO_TEST: '$CI_NO_TEST'" 96*a67afe4dSAndroid Build Coastguard Worker} 97*a67afe4dSAndroid Build Coastguard Worker[[ ${CI_NO_INSTALL:-0} == [01] ]] || { 98*a67afe4dSAndroid Build Coastguard Worker ci_err "bad boolean option: \$CI_NO_INSTALL: '$CI_NO_INSTALL'" 99*a67afe4dSAndroid Build Coastguard Worker} 100*a67afe4dSAndroid Build Coastguard Worker[[ ${CI_NO_CLEAN:-0} == [01] ]] || { 101*a67afe4dSAndroid Build Coastguard Worker ci_err "bad boolean option: \$CI_NO_CLEAN: '$CI_NO_CLEAN'" 102*a67afe4dSAndroid Build Coastguard Worker} 103