Files
vendor_lineage/build/envsetup.sh
Danny Lin 41d350fa42 vendor: Disable ABI checks
ABI compatibility checks fail for several reasons:
  - The update to Clang 12 causes some changes, but no breakage has been
    observed in practice.
  - Switching to zlib-ng changes some internal structs, but not the public
    API.

We may fix these eventually by updating the ABI specifications, but it's
likely not worth the effort for us because of how many repos are affected.
We would need to fork a lot of extra repos (thus increasing maintenance
overhead) just to update the ABI specs.

For now, just skip the ABI checks to fix build errors.

Change-Id: I0967cc2680e384310f5f3859c7d8296580928046
2025-11-05 09:16:56 +00:00

944 lines
30 KiB
Bash

CLANG_VERSION=$(build/soong/scripts/get_clang_version.py)
export LLVM_AOSP_PREBUILTS_VERSION="${CLANG_VERSION}"
# check to see if the supplied product is one we can build
function check_product()
{
local T=$(gettop)
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP." >&2
return
fi
if (echo -n $1 | grep -q -e "^lineage_") ; then
LINEAGE_BUILD=$(echo -n $1 | sed -e 's/^lineage_//g')
else
LINEAGE_BUILD=
fi
export LINEAGE_BUILD
TARGET_PRODUCT=$1 \
TARGET_RELEASE=$2 \
TARGET_BUILD_VARIANT= \
TARGET_BUILD_TYPE= \
TARGET_BUILD_APPS= \
_get_build_var_cached TARGET_DEVICE > /dev/null
# hide successful answers, but allow the errors to show
}
function brunch()
{
breakfast $*
if [ $? -eq 0 ]; then
mka bacon
else
echo "No such item in brunch menu. Try 'breakfast'"
return 1
fi
return $?
}
function breakfast()
{
target=$1
local variant=$2
source ${ANDROID_BUILD_TOP}/vendor/lineage/vars/aosp_target_release
if [ $# -eq 0 ]; then
# No arguments, so let's have the full menu
lunch
else
if [[ "$target" =~ -(user|userdebug|eng)$ ]]; then
# A buildtype was specified, assume a full device name
lunch $target
else
# This is probably just the Lineage model name
if [ -z "$variant" ]; then
variant="userdebug"
fi
lunch lineage_$target-$aosp_target_release-$variant
fi
fi
return $?
}
alias bib=breakfast
function eat()
{
if [ "$OUT" ] ; then
ZIPPATH=`ls -tr "$OUT"/lineage-*.zip | tail -1`
if [ ! -f $ZIPPATH ] ; then
echo "Nothing to eat"
return 1
fi
echo "Waiting for device..."
adb wait-for-device-recovery
echo "Found device"
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD"); then
echo "Rebooting to sideload for install"
adb reboot sideload-auto-reboot
adb wait-for-sideload
adb sideload $ZIPPATH
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
fi
return $?
else
echo "Nothing to eat"
return 1
fi
}
function omnom()
{
brunch $*
eat
}
function cout()
{
if [ "$OUT" ]; then
cd $OUT
else
echo "Couldn't locate out directory. Try setting OUT."
fi
}
function dddclient()
{
local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED)
local OUT_EXE_SYMBOLS=$(get_symbols_directory)
local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
local ARCH=$(_get_build_var_cached TARGET_ARCH)
local GDB
case "$ARCH" in
arm) GDB=arm-linux-androideabi-gdb;;
arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;;
mips|mips64) GDB=mips64el-linux-android-gdb;;
x86) GDB=x86_64-linux-android-gdb;;
x86_64) GDB=x86_64-linux-android-gdb;;
*) echo "Unknown arch $ARCH"; return 1;;
esac
if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
local EXE="$1"
if [ "$EXE" ] ; then
EXE=$1
if [[ $EXE =~ ^[^/].* ]] ; then
EXE="system/bin/"$EXE
fi
else
EXE="app_process"
fi
local PORT="$2"
if [ "$PORT" ] ; then
PORT=$2
else
PORT=":5039"
fi
local PID="$3"
if [ "$PID" ] ; then
if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
PID=`pid $3`
if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
# that likely didn't work because of returning multiple processes
# try again, filtering by root processes (don't contain colon)
PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'`
if [[ ! "$PID" =~ ^[0-9]+$ ]]
then
echo "Couldn't resolve '$3' to single PID"
return 1
else
echo ""
echo "WARNING: multiple processes matching '$3' observed, using root process"
echo ""
fi
fi
fi
adb forward "tcp$PORT" "tcp$PORT"
local USE64BIT="$(is64bit $PID)"
adb shell gdbserver$USE64BIT $PORT --attach $PID &
sleep 2
else
echo ""
echo "If you haven't done so already, do this first on the device:"
echo " gdbserver $PORT /system/bin/$EXE"
echo " or"
echo " gdbserver $PORT --attach <PID>"
echo ""
fi
OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT
OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT
echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl"
echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb"
echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
# Enable special debugging for ART processes.
if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then
echo >> "$OUT_ROOT/gdbclient.cmds" "art-on"
fi
echo >>"$OUT_ROOT/gdbclient.cmds" ""
local WHICH_GDB=
# 64-bit exe found
if [ "$USE64BIT" != "" ] ; then
WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64
# 32-bit exe / 32-bit platform
elif [ "$(_get_build_var_cached TARGET_2ND_ARCH)" = "" ]; then
WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB
# 32-bit exe / 64-bit platform
else
WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB
fi
ddd --debugger $WHICH_GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
else
echo "Unable to determine build system output dir."
fi
}
function lineageremote()
{
if ! git rev-parse --git-dir &> /dev/null
then
echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up."
return 1
fi
git remote rm lineage 2> /dev/null
local REMOTE=$(git config --get remote.github.projectname)
local LINEAGE="true"
if [ -z "$REMOTE" ]
then
REMOTE=$(git config --get remote.aosp.projectname)
LINEAGE="false"
fi
if [ -z "$REMOTE" ]
then
REMOTE=$(git config --get remote.clo.projectname)
LINEAGE="false"
fi
if [ $LINEAGE = "false" ]
then
local PROJECT=$(echo $REMOTE | sed -e "s#platform/#android/#g; s#/#_#g")
local PFX="LineageOS/"
else
local PROJECT=$REMOTE
fi
local LINEAGE_USER=$(git config --get review.review.lineageos.org.username)
if [ -z "$LINEAGE_USER" ]
then
git remote add lineage ssh://review.lineageos.org:29418/$PFX$PROJECT
else
git remote add lineage ssh://$LINEAGE_USER@review.lineageos.org:29418/$PFX$PROJECT
fi
echo "Remote 'lineage' created"
}
function aospremote()
{
local T=`git rev-parse --show-toplevel 2> /dev/null`
if [ -z "$T" ]
then
echo "Git repository not found. Please run this from the directory of the Android repository you wish to set up."
return 1
fi
git remote rm aosp 2> /dev/null
if [ -f "$T/.gitupstream" ]; then
local REMOTE=$(cat "$T/.gitupstream" | cut -d ' ' -f 1)
git remote add aosp ${REMOTE}
else
local PROJECT=$(pwd -P | sed -e "s#$ANDROID_BUILD_TOP\/##; s#-caf.*##; s#\/default##")
# Google moved the repo location in Oreo
if [ $PROJECT = "build/make" ]
then
PROJECT="build"
fi
if (echo $PROJECT | grep -qv "^device")
then
local PFX="platform/"
fi
git remote add aosp https://android.googlesource.com/$PFX$PROJECT
fi
echo "Remote 'aosp' created"
}
function cloremote()
{
local T=`git rev-parse --show-toplevel 2> /dev/null`
if [ -z "$T" ]
then
echo "Git repository not found. Please run this from the directory of the Android repository you wish to set up."
return 1
fi
git remote rm clo 2> /dev/null
if [ -f "$T/.gitupstream" ]; then
local REMOTE=$(cat "$T/.gitupstream" | cut -d ' ' -f 1)
git remote add clo ${REMOTE}
else
local PROJECT=$(pwd -P | sed -e "s#$ANDROID_BUILD_TOP\/##; s#-caf.*##; s#\/default##")
# Google moved the repo location in Oreo
if [ $PROJECT = "build/make" ]
then
PROJECT="build_repo"
fi
if [[ $PROJECT =~ "qcom/opensource" ]];
then
PROJECT=$(echo $PROJECT | sed -e "s#qcom\/opensource#qcom-opensource#")
fi
if (echo $PROJECT | grep -qv "^device")
then
local PFX="platform/"
fi
git remote add clo https://git.codelinaro.org/clo/la/$PFX$PROJECT
fi
echo "Remote 'clo' created"
}
function githubremote()
{
if ! git rev-parse --git-dir &> /dev/null
then
echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up."
return 1
fi
git remote rm github 2> /dev/null
local REMOTE=$(git config --get remote.aosp.projectname)
if [ -z "$REMOTE" ]
then
REMOTE=$(git config --get remote.clo.projectname)
fi
local PROJECT=$(echo $REMOTE | sed -e "s#platform/#android/#g; s#/#_#g")
git remote add github https://github.com/LineageOS/$PROJECT
echo "Remote 'github' created"
}
function privateremote()
{
if ! git rev-parse --git-dir &> /dev/null
then
echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up."
return 1
fi
git remote rm private 2> /dev/null
local PROJECT=$(git config --get remote.github.projectname)
git remote add private git@github.com:$PROJECT.git
echo "Remote 'private' created"
}
function installboot()
{
if [ ! -e "$OUT/recovery/root/system/etc/recovery.fstab" ];
then
echo "No recovery.fstab found. Build recovery first."
return 1
fi
if [ ! -e "$OUT/boot.img" ];
then
echo "No boot.img found. Run make bootimage first."
return 1
fi
PARTITION=`grep "^\/boot" $OUT/recovery/root/system/etc/recovery.fstab | awk {'print $3'}`
if [ -z "$PARTITION" ];
then
# Try for RECOVERY_FSTAB_VERSION = 2
PARTITION=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/system/etc/recovery.fstab | awk {'print $1'}`
PARTITION_TYPE=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/system/etc/recovery.fstab | awk {'print $3'}`
if [ -z "$PARTITION" ];
then
echo "Unable to determine boot partition."
return 1
fi
fi
adb wait-for-device-recovery
adb root
adb wait-for-device-recovery
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD");
then
adb push $OUT/boot.img /cache/
adb shell dd if=/cache/boot.img of=$PARTITION
adb shell rm -rf /cache/boot.img
echo "Installation complete."
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
fi
}
function installrecovery()
{
if [ ! -e "$OUT/recovery/root/system/etc/recovery.fstab" ];
then
echo "No recovery.fstab found. Build recovery first."
return 1
fi
if [ ! -e "$OUT/recovery.img" ];
then
echo "No recovery.img found. Run make recoveryimage first."
return 1
fi
PARTITION=`grep "^\/recovery" $OUT/recovery/root/system/etc/recovery.fstab | awk {'print $3'}`
if [ -z "$PARTITION" ];
then
# Try for RECOVERY_FSTAB_VERSION = 2
PARTITION=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/system/etc/recovery.fstab | awk {'print $1'}`
PARTITION_TYPE=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/system/etc/recovery.fstab | awk {'print $3'}`
if [ -z "$PARTITION" ];
then
echo "Unable to determine recovery partition."
return 1
fi
fi
adb wait-for-device-recovery
adb root
adb wait-for-device-recovery
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD");
then
adb push $OUT/recovery.img /cache/
adb shell dd if=/cache/recovery.img of=$PARTITION
adb shell rm -rf /cache/recovery.img
echo "Installation complete."
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
fi
}
function lineagegerrit() {
if [ "$(basename $SHELL)" = "zsh" ]; then
# zsh does not define FUNCNAME, derive from funcstack
local FUNCNAME=$funcstack[1]
fi
if [ $# -eq 0 ]; then
$FUNCNAME help
return 1
fi
local user=`git config --get review.review.lineageos.org.username`
local review=`git config --get remote.github.review`
local project=`git config --get remote.github.projectname`
local command=$1
shift
case $command in
help)
if [ $# -eq 0 ]; then
cat <<EOF
Usage:
$FUNCNAME COMMAND [OPTIONS] [CHANGE-ID[/PATCH-SET]][{@|^|~|:}ARG] [-- ARGS]
Commands:
fetch Just fetch the change as FETCH_HEAD
help Show this help, or for a specific command
pull Pull a change into current branch
push Push HEAD or a local branch to Gerrit for a specific branch
Any other Git commands that support refname would work as:
git fetch URL CHANGE && git COMMAND OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
See '$FUNCNAME help COMMAND' for more information on a specific command.
Example:
$FUNCNAME checkout -b topic 1234/5
works as:
git fetch http://DOMAIN/p/PROJECT refs/changes/34/1234/5 \\
&& git checkout -b topic FETCH_HEAD
will checkout a new branch 'topic' base on patch-set 5 of change 1234.
Patch-set 1 will be fetched if omitted.
EOF
return
fi
case $1 in
__cmg_*) echo "For internal use only." ;;
changes|for)
if [ "$FUNCNAME" = "lineagegerrit" ]; then
echo "'$FUNCNAME $1' is deprecated."
fi
;;
help) $FUNCNAME help ;;
fetch|pull) cat <<EOF
usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET]
works as:
git $1 OPTIONS http://DOMAIN/p/PROJECT \\
refs/changes/HASH/CHANGE-ID/{PATCH-SET|1}
Example:
$FUNCNAME $1 1234
will $1 patch-set 1 of change 1234
EOF
;;
push) cat <<EOF
usage: $FUNCNAME push [OPTIONS] [LOCAL_BRANCH:]REMOTE_BRANCH
works as:
git push OPTIONS ssh://USER@DOMAIN:29418/PROJECT \\
{LOCAL_BRANCH|HEAD}:refs/for/REMOTE_BRANCH
Example:
$FUNCNAME push fix6789:gingerbread
will push local branch 'fix6789' to Gerrit for branch 'gingerbread'.
HEAD will be pushed from local if omitted.
EOF
;;
*)
$FUNCNAME __cmg_err_not_supported $1 && return
cat <<EOF
usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET][{@|^|~|:}ARG] [-- ARGS]
works as:
git fetch http://DOMAIN/p/PROJECT \\
refs/changes/HASH/CHANGE-ID/{PATCH-SET|1} \\
&& git $1 OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
EOF
;;
esac
;;
__cmg_get_ref)
$FUNCNAME __cmg_err_no_arg $command $# && return 1
local change_id patchset_id hash
case $1 in
*/*)
change_id=${1%%/*}
patchset_id=${1#*/}
;;
*)
change_id=$1
patchset_id=1
;;
esac
hash=$(($change_id % 100))
case $hash in
[0-9]) hash="0$hash" ;;
esac
echo "refs/changes/$hash/$change_id/$patchset_id"
;;
fetch|pull)
$FUNCNAME __cmg_err_no_arg $command $# help && return 1
$FUNCNAME __cmg_err_not_repo && return 1
local change=$1
shift
git $command $@ http://$review/p/$project \
$($FUNCNAME __cmg_get_ref $change) || return 1
;;
push)
$FUNCNAME __cmg_err_no_arg $command $# help && return 1
$FUNCNAME __cmg_err_not_repo && return 1
if [ -z "$user" ]; then
echo >&2 "Gerrit username not found."
return 1
fi
local local_branch remote_branch
case $1 in
*:*)
local_branch=${1%:*}
remote_branch=${1##*:}
;;
*)
local_branch=HEAD
remote_branch=$1
;;
esac
shift
git push $@ ssh://$user@$review:29418/$project \
${local_branch}:refs/for/$remote_branch || return 1
;;
changes|for)
if [ "$FUNCNAME" = "lineagegerrit" ]; then
echo >&2 "'$FUNCNAME $command' is deprecated."
fi
;;
__cmg_err_no_arg)
if [ $# -lt 2 ]; then
echo >&2 "'$FUNCNAME $command' missing argument."
elif [ $2 -eq 0 ]; then
if [ -n "$3" ]; then
$FUNCNAME help $1
else
echo >&2 "'$FUNCNAME $1' missing argument."
fi
else
return 1
fi
;;
__cmg_err_not_repo)
if [ -z "$review" -o -z "$project" ]; then
echo >&2 "Not currently in any reviewable repository."
else
return 1
fi
;;
__cmg_err_not_supported)
$FUNCNAME __cmg_err_no_arg $command $# && return
case $1 in
#TODO: filter more git commands that don't use refname
init|add|rm|mv|status|clone|remote|bisect|config|stash)
echo >&2 "'$FUNCNAME $1' is not supported."
;;
*) return 1 ;;
esac
;;
#TODO: other special cases?
*)
$FUNCNAME __cmg_err_not_supported $command && return 1
$FUNCNAME __cmg_err_no_arg $command $# help && return 1
$FUNCNAME __cmg_err_not_repo && return 1
local args="$@"
local change pre_args refs_arg post_args
case "$args" in
*--\ *)
pre_args=${args%%-- *}
post_args="-- ${args#*-- }"
;;
*) pre_args="$args" ;;
esac
args=($pre_args)
pre_args=
if [ ${#args[@]} -gt 0 ]; then
change=${args[${#args[@]}-1]}
fi
if [ ${#args[@]} -gt 1 ]; then
pre_args=${args[0]}
for ((i=1; i<${#args[@]}-1; i++)); do
pre_args="$pre_args ${args[$i]}"
done
fi
while ((1)); do
case $change in
""|--)
$FUNCNAME help $command
return 1
;;
*@*)
if [ -z "$refs_arg" ]; then
refs_arg="@${change#*@}"
change=${change%%@*}
fi
;;
*~*)
if [ -z "$refs_arg" ]; then
refs_arg="~${change#*~}"
change=${change%%~*}
fi
;;
*^*)
if [ -z "$refs_arg" ]; then
refs_arg="^${change#*^}"
change=${change%%^*}
fi
;;
*:*)
if [ -z "$refs_arg" ]; then
refs_arg=":${change#*:}"
change=${change%%:*}
fi
;;
*) break ;;
esac
done
$FUNCNAME fetch $change \
&& git $command $pre_args FETCH_HEAD$refs_arg $post_args \
|| return 1
;;
esac
}
function lineagerebase() {
local repo=$1
local refs=$2
local pwd="$(pwd)"
local dir="$(gettop)/$repo"
if [ -z $repo ] || [ -z $refs ]; then
echo "LineageOS Gerrit Rebase Usage: "
echo " lineagerebase <path to project> <patch IDs on Gerrit>"
echo " The patch IDs appear on the Gerrit commands that are offered."
echo " They consist on a series of numbers and slashes, after the text"
echo " refs/changes. For example, the ID in the following command is 26/8126/2"
echo ""
echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD"
echo ""
return
fi
if [ ! -d $dir ]; then
echo "Directory $dir doesn't exist in tree."
return
fi
cd $dir
repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g)
echo "Starting branch..."
repo start tmprebase .
echo "Bringing it up to date..."
repo sync .
echo "Fetching change..."
git fetch "http://review.lineageos.org/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD
if [ "$?" != "0" ]; then
echo "Error cherry-picking. Not uploading!"
return
fi
echo "Uploading..."
repo upload .
echo "Cleaning up..."
repo abandon tmprebase .
cd $pwd
}
function mka() {
m "$@"
}
function cmka() {
if [ ! -z "$1" ]; then
for i in "$@"; do
case $i in
bacon|otapackage|systemimage)
mka installclean
mka $i
;;
*)
mka clean-$i
mka $i
;;
esac
done
else
mka clean
mka
fi
}
function repolastsync() {
RLSPATH="$ANDROID_BUILD_TOP/.repo/.repo_fetchtimes.json"
RLSLOCAL=$(date -d "$(stat -c %z $RLSPATH)" +"%e %b %Y, %T %Z")
RLSUTC=$(date -d "$(stat -c %z $RLSPATH)" -u +"%e %b %Y, %T %Z")
echo "Last repo sync: $RLSLOCAL / $RLSUTC"
}
function reposync() {
repo sync -j 4 "$@"
}
function repodiff() {
if [ -z "$*" ]; then
echo "Usage: repodiff <ref-from> [[ref-to] [--numstat]]"
return
fi
diffopts=$* repo forall -c \
'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;'
}
# Return success if adb is up and not in recovery
function _adb_connected {
{
if [[ "$(adb get-state)" == device ]]
then
return 0
fi
} 2>/dev/null
return 1
};
# Credit for color strip sed: http://goo.gl/BoIcm
function dopush()
{
local func=$1
shift
adb start-server # Prevent unexpected starting server message from adb get-state in the next line
if ! _adb_connected; then
echo "No device is online. Waiting for one..."
echo "Please connect USB and/or enable USB debugging"
until _adb_connected; do
sleep 1
done
echo "Device Found."
fi
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD") || [ "$FORCE_PUSH" = "true" ];
then
# retrieve IP and PORT info if we're using a TCP connection
TCPIPPORT=$(adb devices \
| egrep '^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]):[0-9]+[^0-9]+' \
| head -1 | awk '{print $1}')
adb root &> /dev/null
sleep 0.3
if [ -n "$TCPIPPORT" ]
then
# adb root just killed our connection
# so reconnect...
adb connect "$TCPIPPORT"
fi
adb wait-for-device &> /dev/null
adb remount &> /dev/null
mkdir -p $OUT
($func $*|tee $OUT/.log;return ${PIPESTATUS[0]})
ret=$?;
if [ $ret -ne 0 ]; then
rm -f $OUT/.log;return $ret
fi
is_gnu_sed=`sed --version | head -1 | grep -c GNU`
# Install: <file>
if [ $is_gnu_sed -gt 0 ]; then
LOC="$(cat $OUT/.log | sed -r -e 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' -e 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}( [0-9]{0,2}?h?[0-9]{0,2}?m?[0-9]{0,2}s remaining)?\] +//' \
| grep '^Install: ' | cut -d ':' -f 2)"
else
LOC="$(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" -E "s/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}( [0-9]{0,2}?h?[0-9]{0,2}?m?[0-9]{0,2}s remaining)?\] +//" \
| grep '^Install: ' | cut -d ':' -f 2)"
fi
# Copy: <file>
if [ $is_gnu_sed -gt 0 ]; then
LOC="$LOC $(cat $OUT/.log | sed -r -e 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' -e 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}( [0-9]{0,2}?h?[0-9]{0,2}?m?[0-9]{0,2}s remaining)?\] +//' \
| grep '^Copy: ' | cut -d ':' -f 2)"
else
LOC="$LOC $(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" -E 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}( [0-9]{0,2}?h?[0-9]{0,2}?m?[0-9]{0,2}s remaining)?\] +//' \
| grep '^Copy: ' | cut -d ':' -f 2)"
fi
# If any files are going to /data, push an octal file permissions reader to device
if [ -n "$(echo $LOC | egrep '(^|\s)/data')" ]; then
CHKPERM="/data/local/tmp/chkfileperm.sh"
(
cat <<'EOF'
#!/system/bin/sh
FILE=$@
if [ -e $FILE ]; then
ls -l $FILE | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' | cut -d ' ' -f1
fi
EOF
) > $OUT/.chkfileperm.sh
echo "Pushing file permissions checker to device"
adb push $OUT/.chkfileperm.sh $CHKPERM
adb shell chmod 755 $CHKPERM
rm -f $OUT/.chkfileperm.sh
fi
RELOUT=$(echo $OUT | sed "s#^${ANDROID_BUILD_TOP}/##")
stop_n_start=false
for TARGET in $(echo $LOC | tr " " "\n" | sed "s#.*${RELOUT}##" | sort | uniq); do
# Make sure file is in $OUT/{system,system_ext,data,odm,oem,product,product_services,vendor}
case $TARGET in
/system/*|/system_ext/*|/data/*|/odm/*|/oem/*|/product/*|/product_services/*|/vendor/*)
# Get out file from target (i.e. /system/bin/adb)
FILE=$OUT$TARGET
;;
*) continue ;;
esac
case $TARGET in
/data/*)
# fs_config only sets permissions and se labels for files pushed to /system
if [ -n "$CHKPERM" ]; then
OLDPERM=$(adb shell $CHKPERM $TARGET)
OLDPERM=$(echo $OLDPERM | tr -d '\r' | tr -d '\n')
OLDOWN=$(adb shell ls -al $TARGET | awk '{print $2}')
OLDGRP=$(adb shell ls -al $TARGET | awk '{print $3}')
fi
echo "Pushing: $TARGET"
adb push $FILE $TARGET
if [ -n "$OLDPERM" ]; then
echo "Setting file permissions: $OLDPERM, $OLDOWN":"$OLDGRP"
adb shell chown "$OLDOWN":"$OLDGRP" $TARGET
adb shell chmod "$OLDPERM" $TARGET
else
echo "$TARGET did not exist previously, you should set file permissions manually"
fi
adb shell restorecon "$TARGET"
;;
*/SystemUI.apk|*/framework/*)
# Only need to stop services once
if ! $stop_n_start; then
adb shell stop
stop_n_start=true
fi
echo "Pushing: $TARGET"
adb push $FILE $TARGET
;;
*)
echo "Pushing: $TARGET"
adb push $FILE $TARGET
;;
esac
done
if [ -n "$CHKPERM" ]; then
adb shell rm $CHKPERM
fi
if $stop_n_start; then
adb shell start
fi
rm -f $OUT/.log
return 0
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
fi
}
alias mmp='dopush mm'
alias mmmp='dopush mmm'
alias mmap='dopush mma'
alias mmmap='dopush mmma'
alias mkap='dopush mka'
alias cmkap='dopush cmka'
function repopick() {
T=$(gettop)
$T/vendor/lineage/build/tools/repopick.py $@
}
function sort-blobs-list() {
T=$(gettop)
$T/tools/extract-utils/sort-blobs-list.py $@
}
function fixup_common_out_dir() {
common_out_dir=$(_get_build_var_cached OUT_DIR)/target/common
target_device=$(_get_build_var_cached TARGET_DEVICE)
common_target_out=common-${target_device}
if [ ! -z $LINEAGE_FIXUP_COMMON_OUT ]; then
if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then
mv ${common_out_dir} ${common_out_dir}-${target_device}
ln -s ${common_target_out} ${common_out_dir}
else
[ -L ${common_out_dir} ] && rm ${common_out_dir}
mkdir -p ${common_out_dir}-${target_device}
ln -s ${common_target_out} ${common_out_dir}
fi
else
[ -L ${common_out_dir} ] && rm ${common_out_dir}
mkdir -p ${common_out_dir}
fi
}
function generate_host_overrides() {
export BUILD_USERNAME=android-build
HEX=$(openssl rand -hex 8)
ALPHA=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 4 | head -n 1)
export BUILD_HOSTNAME="r-${HEX}-${ALPHA}"
echo "BUILD_USERNAME=$BUILD_USERNAME"
echo "BUILD_HOSTNAME=$BUILD_HOSTNAME"
}
generate_host_overrides
export SKIP_ABI_CHECKS=true
export USE_THINLTO_CACHE=true