Exclude toolchain packages from eclean.

BUG=b:187987427, chromium:1202194
TEST=./build_packages --board=${BOARD} && ./build_image --board=${BOARD}

Change-Id: Id28b7c0ab7c7327918c68b1fc5ec8e5df0b73bf9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosutils/+/2891526
Commit-Queue: Allen Webb <allenwebb@google.com>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Tested-by: Allen Webb <allenwebb@google.com>
Auto-Submit: Allen Webb <allenwebb@google.com>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Manoj Gupta <manojgupta@chromium.org>
diff --git a/build_packages b/build_packages
index 540ba59..292b2e8 100755
--- a/build_packages
+++ b/build_packages
@@ -296,7 +296,7 @@
 # regenerating the cache in case ebuilds have been removed (e.g. from a revert).
 if [[ "${FLAGS_eclean}" -eq "${FLAGS_TRUE}" ]]; then
   info "Cleaning stale binpkgs"
-  info_run "eclean-${FLAGS_board}" packages
+  get_eclean_exclusions | "eclean-${FLAGS_board}" -e /dev/stdin packages
 fi
 
 # Verify that all packages can be emerged from scratch, without any
diff --git a/common.sh b/common.sh
index 2b8f985..9a935b0 100644
--- a/common.sh
+++ b/common.sh
@@ -805,6 +805,11 @@
   fi
 }
 
+# Echo a list of cross-* ebuilds to exclude from eclean.
+get_eclean_exclusions() {
+  qlist -IC ^cross-
+}
+
 switch_to_strict_mode() {
   # Set up strict execution mode; note that the trap
   # must follow switch_to_strict_mode, else it will have no effect.
diff --git a/sdk_lib/make_chroot.sh b/sdk_lib/make_chroot.sh
index 6f9888a..2751756 100755
--- a/sdk_lib/make_chroot.sh
+++ b/sdk_lib/make_chroot.sh
@@ -564,7 +564,9 @@
 # (e.g. from a revert).
 if [[ "${FLAGS_eclean}" -eq "${FLAGS_TRUE}" ]]; then
   info "Cleaning stale binpkgs"
-  early_enter_chroot eclean packages
+  early_enter_chroot /bin/bash -c '
+    source /mnt/host/source/src/scripts/common.sh &&
+    eclean -e <(get_eclean_exclusions) packages'
 fi
 
 # Switch SDK python to Python 3 by default.
diff --git a/update_chroot b/update_chroot
index 84152ea..c85a7db 100755
--- a/update_chroot
+++ b/update_chroot
@@ -99,7 +99,7 @@
 # regenerating the cache in case ebuilds have been removed (e.g. from a revert).
 if [[ "${FLAGS_eclean}" -eq "${FLAGS_TRUE}" ]]; then
   info "Cleaning stale binpkgs"
-  info_run sudo eclean packages
+  get_eclean_exclusions | sudo eclean -e /dev/stdin packages
 fi
 
 info "Updating the SDK"
@@ -158,7 +158,7 @@
 # correspond to a currently installed package (different versions are kept).
 if [[ "${FLAGS_eclean}" -eq "${FLAGS_TRUE}" ]]; then
   info "Deep cleaning stale binpkgs"
-  info_run sudo eclean -d packages
+  get_eclean_exclusions | sudo eclean -e /dev/stdin -d packages
 fi
 
 command_completed