1# Copyright (C) 2022 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15function gettop
16{
17    local TOPFILE=build/make/core/envsetup.mk
18    # The ${TOP-} expansion allows this to work even with set -u
19    if [ -n "${TOP:-}" -a -f "${TOP:-}/$TOPFILE" ] ; then
20        # The following circumlocution ensures we remove symlinks from TOP.
21        (cd "$TOP"; PWD= /bin/pwd)
22    else
23        if [ -f $TOPFILE ] ; then
24            # The following circumlocution (repeated below as well) ensures
25            # that we record the true directory name and not one that is
26            # faked up with symlink names.
27            PWD= /bin/pwd
28        else
29            local HERE=$PWD
30            local T=
31            while [ \( ! \( -f $TOPFILE \) \) -a \( "$PWD" != "/" \) ]; do
32                \cd ..
33                T=`PWD= /bin/pwd -P`
34            done
35            \cd "$HERE"
36            if [ -f "$T/$TOPFILE" ]; then
37                echo "$T"
38            fi
39        fi
40    fi
41}
42
43# Asserts that the root of the tree can be found.
44if [ -z "${IMPORTING_ENVSETUP:-}" ] ; then
45function require_top
46{
47    TOP=$(gettop)
48    if [[ ! $TOP ]] ; then
49        echo "Can not locate root of source tree. $(basename $0) must be run from within the Android source tree or TOP must be set." >&2
50        exit 1
51    fi
52}
53fi
54
55# Asserts that the lunch variables have been set
56if [ -z "${IMPORTING_ENVSETUP:-}" ] ; then
57function require_lunch
58{
59    if [[ ! $TARGET_PRODUCT || ! $TARGET_RELEASE || ! $TARGET_BUILD_VARIANT  ]] ; then
60        echo "Please run lunch and try again." >&2
61        exit 1
62    fi
63}
64fi
65
66function getoutdir
67{
68    local top=$(gettop)
69    local out_dir="${OUT_DIR:-}"
70    if [[ -z "${out_dir}" ]]; then
71        if [[ -n "${OUT_DIR_COMMON_BASE:-}" && -n "${top}" ]]; then
72            out_dir="${OUT_DIR_COMMON_BASE}/$(basename ${top})"
73        else
74            out_dir="out"
75        fi
76    fi
77    if [[ "${out_dir}" != /* ]]; then
78        out_dir="${top}/${out_dir}"
79    fi
80    echo "${out_dir}"
81}
82
83# Pretty print the build status and duration
84function _wrap_build()
85{
86    if [[ "${ANDROID_QUIET_BUILD:-}" == true ]]; then
87      "$@"
88      return $?
89    fi
90    local start_time=$(date +"%s")
91    "$@"
92    local ret=$?
93    local end_time=$(date +"%s")
94    local tdiff=$(($end_time-$start_time))
95    local hours=$(($tdiff / 3600 ))
96    local mins=$((($tdiff % 3600) / 60))
97    local secs=$(($tdiff % 60))
98    local ncolors=$(tput colors 2>/dev/null)
99    if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
100        color_failed=$'\E'"[0;31m"
101        color_success=$'\E'"[0;32m"
102        color_warning=$'\E'"[0;33m"
103        color_reset=$'\E'"[00m"
104    else
105        color_failed=""
106        color_success=""
107        color_reset=""
108    fi
109
110    echo
111    if [ $ret -eq 0 ] ; then
112        echo -n "${color_success}#### build completed successfully "
113    else
114        echo -n "${color_failed}#### failed to build some targets "
115    fi
116    if [ $hours -gt 0 ] ; then
117        printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs
118    elif [ $mins -gt 0 ] ; then
119        printf "(%02g:%02g (mm:ss))" $mins $secs
120    elif [ $secs -gt 0 ] ; then
121        printf "(%s seconds)" $secs
122    fi
123    echo " ####${color_reset}"
124    echo
125    return $ret
126}
127
128
129function log_tool_invocation()
130{
131    if [[ -z $ANDROID_TOOL_LOGGER ]]; then
132        return
133    fi
134
135    LOG_TOOL_TAG=$1
136    LOG_START_TIME=$(date +%s.%N)
137    trap '
138        exit_code=$?;
139        # Remove the trap to prevent duplicate log.
140        trap - EXIT;
141        $ANDROID_TOOL_LOGGER \
142                --tool_tag="${LOG_TOOL_TAG}" \
143                --start_timestamp="${LOG_START_TIME}" \
144                --end_timestamp="$(date +%s.%N)" \
145                --tool_args="$*" \
146                --exit_code="${exit_code}" \
147                ${ANDROID_TOOL_LOGGER_EXTRA_ARGS} \
148           > /dev/null 2>&1 &
149        exit ${exit_code}
150    ' SIGINT SIGTERM SIGQUIT EXIT
151}
152
153