blob: 3124db598c5e3ff8bb519fd02277f35c58a81861 [file] [log] [blame] [edit]
# Copyright (C) 2022 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
function gettop
{
local TOPFILE=build/make/core/envsetup.mk
# The ${TOP-} expansion allows this to work even with set -u
if [ -n "${TOP:-}" -a -f "${TOP:-}/$TOPFILE" ] ; then
# The following circumlocution ensures we remove symlinks from TOP.
(cd "$TOP"; PWD= /bin/pwd)
else
if [ -f $TOPFILE ] ; then
# The following circumlocution (repeated below as well) ensures
# that we record the true directory name and not one that is
# faked up with symlink names.
PWD= /bin/pwd
else
local HERE=$PWD
local T=
while [ \( ! \( -f $TOPFILE \) \) -a \( "$PWD" != "/" \) ]; do
\cd ..
T=`PWD= /bin/pwd -P`
done
\cd "$HERE"
if [ -f "$T/$TOPFILE" ]; then
echo "$T"
fi
fi
fi
}
# Asserts that the root of the tree can be found.
if [ -z "${IMPORTING_ENVSETUP:-}" ] ; then
function require_top
{
TOP=$(gettop)
if [[ ! $TOP ]] ; then
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
exit 1
fi
}
fi
# Asserts that the lunch variables have been set
if [ -z "${IMPORTING_ENVSETUP:-}" ] ; then
function require_lunch
{
if [[ ! $TARGET_PRODUCT || ! $TARGET_RELEASE || ! $TARGET_BUILD_VARIANT ]] ; then
echo "Please run lunch and try again." >&2
exit 1
fi
}
fi
# This function sets up the build environment to be appropriate for Cog.
function setup_cog_env_if_needed() {
local top=$(gettop)
# return early if not in a cog workspace
if [[ ! "$top" =~ ^/google/cog ]]; then
return 0
fi
setup_cog_symlink
export ANDROID_BUILD_ENVIRONMENT_CONFIG="googler-cog"
# Running repo command within Cog workspaces is not supported, so override
# it with this function. If the user is running repo within a Cog workspace,
# we'll fail with an error, otherwise, we run the original repo command with
# the given args.
if ! ORIG_REPO_PATH=`which repo`; then
return 0
fi
function repo {
if [[ "${PWD}" == /google/cog/* ]]; then
echo -e "\e[01;31mERROR:\e[0mrepo command is disallowed within Cog workspaces."
kill -INT $$ # exits the script without exiting the user's shell
fi
${ORIG_REPO_PATH} "$@"
}
}
# creates a symlink for the out/ dir when inside a cog workspace.
function setup_cog_symlink() {
local out_dir=$(getoutdir)
local top=$(gettop)
# return early if out dir is already a symlink
if [[ -L "$out_dir" ]]; then
return 0
fi
# return early if out dir is not in the workspace
if [[ ! "$out_dir" =~ ^$top/ ]]; then
return 0
fi
local link_destination="${HOME}/.cog/android-build-out"
# remove existing out/ dir if it exists
if [[ -d "$out_dir" ]]; then
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"
if ! rm -rf "$out_dir"; then
echo "Failed to remove existing out/ directory: $out_dir" >&2
kill -INT $$ # exits the script without exiting the user's shell
fi
fi
# create symlink
echo "Creating symlink: $out_dir -> $link_destination"
mkdir -p ${link_destination}
if ! ln -s "$link_destination" "$out_dir"; then
echo "Failed to create cog symlink: $out_dir -> $link_destination" >&2
kill -INT $$ # exits the script without exiting the user's shell
fi
}
function getoutdir
{
local top=$(gettop)
local out_dir="${OUT_DIR:-}"
if [[ -z "${out_dir}" ]]; then
if [[ -n "${OUT_DIR_COMMON_BASE:-}" && -n "${top}" ]]; then
out_dir="${OUT_DIR_COMMON_BASE}/$(basename ${top})"
else
out_dir="out"
fi
fi
if [[ "${out_dir}" != /* ]]; then
out_dir="${top}/${out_dir}"
fi
echo "${out_dir}"
}
# Pretty print the build status and duration
function _wrap_build()
{
if [[ "${ANDROID_QUIET_BUILD:-}" == true ]]; then
"$@"
return $?
fi
local start_time=$(date +"%s")
"$@"
local ret=$?
local end_time=$(date +"%s")
local tdiff=$(($end_time-$start_time))
local hours=$(($tdiff / 3600 ))
local mins=$((($tdiff % 3600) / 60))
local secs=$(($tdiff % 60))
local ncolors=$(tput colors 2>/dev/null)
if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
color_failed=$'\E'"[0;31m"
color_success=$'\E'"[0;32m"
color_warning=$'\E'"[0;33m"
color_reset=$'\E'"[00m"
else
color_failed=""
color_success=""
color_reset=""
fi
echo
if [ $ret -eq 0 ] ; then
echo -n "${color_success}#### build completed successfully "
else
echo -n "${color_failed}#### failed to build some targets "
fi
if [ $hours -gt 0 ] ; then
printf "(%02d:%02d:%02d (hh:mm:ss))" $hours $mins $secs
elif [ $mins -gt 0 ] ; then
printf "(%02d:%02d (mm:ss))" $mins $secs
elif [ $secs -gt 0 ] ; then
printf "(%d seconds)" $secs
fi
echo " ####${color_reset}"
echo
return $ret
}
function log_tool_invocation()
{
if [[ -z $ANDROID_TOOL_LOGGER ]]; then
return
fi
LOG_TOOL_TAG=$1
LOG_START_TIME=$(date +%s.%N)
trap '
exit_code=$?;
# Remove the trap to prevent duplicate log.
trap - EXIT;
$ANDROID_TOOL_LOGGER \
--tool_tag="${LOG_TOOL_TAG}" \
--start_timestamp="${LOG_START_TIME}" \
--end_timestamp="$(date +%s.%N)" \
--tool_args="$*" \
--exit_code="${exit_code}" \
${ANDROID_TOOL_LOGGER_EXTRA_ARGS} \
> /dev/null 2>&1 &
exit ${exit_code}
' SIGINT SIGTERM SIGQUIT EXIT
}
# Import the build variables supplied as arguments into this shell's environment.
# For absolute variables, prefix the variable name with a '/'. For example:
# import_build_vars OUT_DIR DIST_DIR /HOST_OUT_EXECUTABLES
# Returns nonzero if the build command failed. Stderr is passed through.
function import_build_vars()
{
require_top
local script
script=$(cd $TOP && build/soong/bin/get_build_vars "$@")
local ret=$?
if [ $ret -ne 0 ] ; then
return $ret
fi
eval "$script"
return $?
}