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 66# This function sets up the build environment to be appropriate for Cog. 67function setup_cog_env_if_needed() { 68 local top=$(gettop) 69 70 # return early if not in a cog workspace 71 if [[ ! "$top" =~ ^/google/cog ]]; then 72 return 0 73 fi 74 75 setup_cog_symlink 76 77 export ANDROID_BUILD_ENVIRONMENT_CONFIG="googler-cog" 78 79 # Running repo command within Cog workspaces is not supported, so override 80 # it with this function. If the user is running repo within a Cog workspace, 81 # we'll fail with an error, otherwise, we run the original repo command with 82 # the given args. 83 if ! ORIG_REPO_PATH=`which repo`; then 84 return 0 85 fi 86 function repo { 87 if [[ "${PWD}" == /google/cog/* ]]; then 88 echo -e "\e[01;31mERROR:\e[0mrepo command is disallowed within Cog workspaces." 89 kill -INT $$ # exits the script without exiting the user's shell 90 fi 91 ${ORIG_REPO_PATH} "$@" 92 } 93} 94 95# creates a symlink for the out/ dir when inside a cog workspace. 96function setup_cog_symlink() { 97 local out_dir=$(getoutdir) 98 local top=$(gettop) 99 100 # return early if out dir is already a symlink 101 if [[ -L "$out_dir" ]]; then 102 return 0 103 fi 104 105 # return early if out dir is not in the workspace 106 if [[ ! "$out_dir" =~ ^$top/ ]]; then 107 return 0 108 fi 109 110 local link_destination="${HOME}/.cog/android-build-out" 111 112 # remove existing out/ dir if it exists 113 if [[ -d "$out_dir" ]]; then 114 echo "Detected existing out/ directory in the Cog workspace which is not supported. Repairing workspace by removing it and creating the symlink to ~/.cog/android-build-out" 115 if ! rm -rf "$out_dir"; then 116 echo "Failed to remove existing out/ directory: $out_dir" >&2 117 kill -INT $$ # exits the script without exiting the user's shell 118 fi 119 fi 120 121 # create symlink 122 echo "Creating symlink: $out_dir -> $link_destination" 123 mkdir -p ${link_destination} 124 if ! ln -s "$link_destination" "$out_dir"; then 125 echo "Failed to create cog symlink: $out_dir -> $link_destination" >&2 126 kill -INT $$ # exits the script without exiting the user's shell 127 fi 128} 129 130function getoutdir 131{ 132 local top=$(gettop) 133 local out_dir="${OUT_DIR:-}" 134 if [[ -z "${out_dir}" ]]; then 135 if [[ -n "${OUT_DIR_COMMON_BASE:-}" && -n "${top}" ]]; then 136 out_dir="${OUT_DIR_COMMON_BASE}/$(basename ${top})" 137 else 138 out_dir="out" 139 fi 140 fi 141 if [[ "${out_dir}" != /* ]]; then 142 out_dir="${top}/${out_dir}" 143 fi 144 echo "${out_dir}" 145} 146 147# Pretty print the build status and duration 148function _wrap_build() 149{ 150 if [[ "${ANDROID_QUIET_BUILD:-}" == true ]]; then 151 "$@" 152 return $? 153 fi 154 local start_time=$(date +"%s") 155 "$@" 156 local ret=$? 157 local end_time=$(date +"%s") 158 local tdiff=$(($end_time-$start_time)) 159 local hours=$(($tdiff / 3600 )) 160 local mins=$((($tdiff % 3600) / 60)) 161 local secs=$(($tdiff % 60)) 162 local ncolors=$(tput colors 2>/dev/null) 163 if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then 164 color_failed=$'\E'"[0;31m" 165 color_success=$'\E'"[0;32m" 166 color_warning=$'\E'"[0;33m" 167 color_reset=$'\E'"[00m" 168 else 169 color_failed="" 170 color_success="" 171 color_reset="" 172 fi 173 174 echo 175 if [ $ret -eq 0 ] ; then 176 echo -n "${color_success}#### build completed successfully " 177 else 178 echo -n "${color_failed}#### failed to build some targets " 179 fi 180 if [ $hours -gt 0 ] ; then 181 printf "(%02d:%02d:%02d (hh:mm:ss))" $hours $mins $secs 182 elif [ $mins -gt 0 ] ; then 183 printf "(%02d:%02d (mm:ss))" $mins $secs 184 elif [ $secs -gt 0 ] ; then 185 printf "(%d seconds)" $secs 186 fi 187 echo " ####${color_reset}" 188 echo 189 return $ret 190} 191 192 193function log_tool_invocation() 194{ 195 if [[ -z $ANDROID_TOOL_LOGGER ]]; then 196 return 197 fi 198 199 LOG_TOOL_TAG=$1 200 LOG_START_TIME=$(date +%s.%N) 201 trap ' 202 exit_code=$?; 203 # Remove the trap to prevent duplicate log. 204 trap - EXIT; 205 $ANDROID_TOOL_LOGGER \ 206 --tool_tag="${LOG_TOOL_TAG}" \ 207 --start_timestamp="${LOG_START_TIME}" \ 208 --end_timestamp="$(date +%s.%N)" \ 209 --tool_args="$*" \ 210 --exit_code="${exit_code}" \ 211 ${ANDROID_TOOL_LOGGER_EXTRA_ARGS} \ 212 > /dev/null 2>&1 & 213 exit ${exit_code} 214 ' SIGINT SIGTERM SIGQUIT EXIT 215} 216 217