blob: 5441e2950d38e0a8947bd7990fadd5c959975324 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""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
import sys
from chromite.lib import commandline
from chromite.lib import constants
from chromite.lib import cros_build_lib
assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
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):
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:
emerge_args.append('--root-deps')
emerge_args.append('--jobs=%s' % parsed_args['jobs'])
emerge_args.append('--rebuild-exclude=chromeos-base/chromeos-chrome')
for pkg in constants.OTHER_CHROME_PACKAGES:
emerge_args.append('--rebuild-exclude=%s' % pkg)
os.execvp('emerge', ['emerge'] + emerge_args)