Stabilize parallel_emerge_new
The new implementation has been in use and looks to be stable. We have
enough BDEPEND packages that going back to parallel_emerge_old is not
an option, so remove the dispatch wrapper.
BUG=chromium:989962
TEST=`update_chroot`
Change-Id: I56721d1500c6073cd585239ae83fa4d81952246c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1911426
Tested-by: Chris McDonald <cjmcdonald@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Chris McDonald <cjmcdonald@chromium.org>
diff --git a/scripts/parallel_emerge.py b/scripts/parallel_emerge.py
index c754dfa..6d4340a 100644
--- a/scripts/parallel_emerge.py
+++ b/scripts/parallel_emerge.py
@@ -3,26 +3,151 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-"""Thin wrapper to dispatch to old or new parallel_emerge implementation."""
+"""Wrapper script to run emerge, with sane defaults.
+
+Usage:
+ ./parallel_emerge [--board=BOARD] [--workon=PKGS]
+ [--force-remote-binary=PKGS] [emerge args] package
+
+This script is a simple wrapper around emerge that handles legacy command line
+arguments as well as setting reasonable defaults for parallelism.
+"""
from __future__ import print_function
+import argparse
+import multiprocessing
import os
-from chromite.lib import cros_logging
-from chromite.scripts import parallel_emerge_new as NEW_WRAPPER
+from chromite.lib import commandline
+from chromite.lib import cros_build_lib
-_USE_NEW = os.environ.get('USE_NEW_PARALLEL_EMERGE', '1') == '1'
-# parallel_emerge_old.py runs code at import time, so only import it if we
-# intend to use it. This avoids getting a mix of the old and new behaviors.
-if not _USE_NEW:
- from chromite.scripts import parallel_emerge_old as PARALLEL_EMERGE_OLD
+class LookupBoardSysroot(argparse.Action):
+ """Translates board argument to sysroot location."""
+
+ def __call__(self, parser, namespace, values, option_string=None):
+ sysroot = cros_build_lib.GetSysroot(values)
+ setattr(namespace, 'sysroot', sysroot)
+
+
+def ParallelEmergeArgParser():
+ """Helper function to create command line argument parser for this wrapper.
+
+ We need to be compatible with emerge arg format. We scrape arguments that
+ are specific to parallel_emerge, and pass through the rest directly to
+ emerge.
+
+ Returns:
+ commandline.ArgumentParser that captures arguments specific to
+ parallel_emerge
+ """
+ parser = commandline.ArgumentParser()
+
+ board_group = parser.add_mutually_exclusive_group()
+ board_group.add_argument(
+ '--board',
+ default=None,
+ action=LookupBoardSysroot,
+ )
+ board_group.add_argument(
+ '--sysroot',
+ action='store',
+ metavar='PATH',
+ )
+
+ parser.add_argument(
+ '--root',
+ action='store',
+ metavar='PATH',
+ )
+ parser.add_argument(
+ '--workon',
+ action='append',
+ metavar='PKGS',
+ )
+ parser.add_argument(
+ '--rebuild',
+ action='store_true',
+ default=False,
+ )
+ parser.add_argument(
+ '--force-remote-binary',
+ action='append',
+ help=argparse.SUPPRESS,
+ )
+ parser.add_argument(
+ '--root-deps',
+ action='store',
+ nargs='?',
+ default=None,
+ dest='root_deps',
+ help=argparse.SUPPRESS,
+ )
+ parser.add_argument(
+ '-j',
+ '--jobs',
+ default=multiprocessing.cpu_count(),
+ metavar='PARALLEL_JOBCOUNT',
+ )
+
+ parser.add_argument(
+ '--retries',
+ help=argparse.SUPPRESS,
+ deprecated='Build retries are no longer supported.',
+ )
+ parser.add_argument(
+ '--eventlogfile',
+ help=argparse.SUPPRESS,
+ deprecated=
+ 'parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR '
+ 'in the system environment to get a log of failed packages and which '
+ 'phase they failed in.',
+ )
+ parser.add_argument(
+ '--show-output',
+ action='store_true',
+ help=argparse.SUPPRESS,
+ deprecated='This option is no longer supported.',
+ )
+
+ return parser
def main(argv):
- if _USE_NEW:
- cros_logging.notice('Using new parallel_emerge implementation.')
- NEW_WRAPPER.main(argv)
+
+ parser = ParallelEmergeArgParser()
+ parsed_args, emerge_args = parser.parse_known_args(argv)
+ parsed_args = vars(parsed_args)
+
+ os.environ['CLEAN_DELAY'] = '0'
+
+ if parsed_args.get('sysroot'):
+ emerge_args.extend(['--sysroot', parsed_args['sysroot']])
+ os.environ['PORTAGE_CONFIGROOT'] = parsed_args['sysroot']
+
+ if parsed_args.get('root'):
+ emerge_args.extend(['--root', parsed_args['root']])
+
+ if parsed_args.get('rebuild'):
+ emerge_args.append('--rebuild-if-unbuilt')
+
+ if parsed_args.get('workon'):
+ emerge_args.append('--reinstall-atoms=%s' % ' '.join(parsed_args['workon']))
+ emerge_args.append('--usepkg-exclude=%s' % ' '.join(parsed_args['workon']))
+
+ if parsed_args.get('force_remote_binary'):
+ emerge_args.append(
+ '--useoldpkg-atoms=%s' % ' '.join(parsed_args['force_remote_binary']))
+
+ if parsed_args.get('root_deps') is not None:
+ emerge_args.append('--root-deps=%s' % parsed_args['root_deps'])
else:
- PARALLEL_EMERGE_OLD.main(argv)
+ emerge_args.append('--root-deps')
+
+ emerge_args.append('--jobs=%s' % parsed_args['jobs'])
+ emerge_args.append('--rebuild-exclude=chromeos-base/chromeos-chrome')
+
+ # TODO(cjmcdonald): Change the exec target back to just 'emerge' once
+ # python3 is the default in the SDK.
+ os.execvp('/usr/lib64/python-exec/python3.6/emerge', ['emerge'] + emerge_args)