Mike Frysinger | e58c0e2 | 2017-10-04 15:43:30 -0400 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
Chris McDonald | d2fa616 | 2019-07-30 15:30:58 -0600 | [diff] [blame] | 2 | # Copyright 2019 The Chromium OS Authors. All rights reserved. |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 6 | """Wrapper script to run emerge, with sane defaults. |
| 7 | |
| 8 | Usage: |
| 9 | ./parallel_emerge [--board=BOARD] [--workon=PKGS] |
| 10 | [--force-remote-binary=PKGS] [emerge args] package |
| 11 | |
| 12 | This script is a simple wrapper around emerge that handles legacy command line |
| 13 | arguments as well as setting reasonable defaults for parallelism. |
| 14 | """ |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 15 | |
Mike Frysinger | 383367e | 2014-09-16 15:06:17 -0400 | [diff] [blame] | 16 | from __future__ import print_function |
| 17 | |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 18 | import argparse |
| 19 | import multiprocessing |
Chris McDonald | 16438a8 | 2019-10-01 19:01:30 +0000 | [diff] [blame] | 20 | import os |
Mike Frysinger | 6165cdc | 2020-02-21 02:38:07 -0500 | [diff] [blame^] | 21 | import sys |
Chris McDonald | 16438a8 | 2019-10-01 19:01:30 +0000 | [diff] [blame] | 22 | |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 23 | from chromite.lib import commandline |
| 24 | from chromite.lib import cros_build_lib |
Thiago Goncales | f4acc42 | 2013-07-17 10:26:35 -0700 | [diff] [blame] | 25 | |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 26 | |
Mike Frysinger | 6165cdc | 2020-02-21 02:38:07 -0500 | [diff] [blame^] | 27 | assert sys.version_info >= (3, 6), 'This module requires Python 3.6+' |
| 28 | |
| 29 | |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 30 | class LookupBoardSysroot(argparse.Action): |
| 31 | """Translates board argument to sysroot location.""" |
| 32 | |
| 33 | def __call__(self, parser, namespace, values, option_string=None): |
| 34 | sysroot = cros_build_lib.GetSysroot(values) |
| 35 | setattr(namespace, 'sysroot', sysroot) |
| 36 | |
| 37 | |
| 38 | def ParallelEmergeArgParser(): |
| 39 | """Helper function to create command line argument parser for this wrapper. |
| 40 | |
| 41 | We need to be compatible with emerge arg format. We scrape arguments that |
| 42 | are specific to parallel_emerge, and pass through the rest directly to |
| 43 | emerge. |
| 44 | |
| 45 | Returns: |
| 46 | commandline.ArgumentParser that captures arguments specific to |
| 47 | parallel_emerge |
| 48 | """ |
| 49 | parser = commandline.ArgumentParser() |
| 50 | |
| 51 | board_group = parser.add_mutually_exclusive_group() |
| 52 | board_group.add_argument( |
| 53 | '--board', |
| 54 | default=None, |
| 55 | action=LookupBoardSysroot, |
| 56 | ) |
| 57 | board_group.add_argument( |
| 58 | '--sysroot', |
| 59 | action='store', |
| 60 | metavar='PATH', |
| 61 | ) |
| 62 | |
| 63 | parser.add_argument( |
| 64 | '--root', |
| 65 | action='store', |
| 66 | metavar='PATH', |
| 67 | ) |
| 68 | parser.add_argument( |
| 69 | '--workon', |
| 70 | action='append', |
| 71 | metavar='PKGS', |
| 72 | ) |
| 73 | parser.add_argument( |
| 74 | '--rebuild', |
| 75 | action='store_true', |
| 76 | default=False, |
| 77 | ) |
| 78 | parser.add_argument( |
| 79 | '--force-remote-binary', |
| 80 | action='append', |
| 81 | help=argparse.SUPPRESS, |
| 82 | ) |
| 83 | parser.add_argument( |
| 84 | '--root-deps', |
| 85 | action='store', |
| 86 | nargs='?', |
| 87 | default=None, |
| 88 | dest='root_deps', |
| 89 | help=argparse.SUPPRESS, |
| 90 | ) |
| 91 | parser.add_argument( |
| 92 | '-j', |
| 93 | '--jobs', |
| 94 | default=multiprocessing.cpu_count(), |
| 95 | metavar='PARALLEL_JOBCOUNT', |
| 96 | ) |
| 97 | |
| 98 | parser.add_argument( |
| 99 | '--retries', |
| 100 | help=argparse.SUPPRESS, |
| 101 | deprecated='Build retries are no longer supported.', |
| 102 | ) |
| 103 | parser.add_argument( |
| 104 | '--eventlogfile', |
| 105 | help=argparse.SUPPRESS, |
| 106 | deprecated= |
| 107 | 'parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR ' |
| 108 | 'in the system environment to get a log of failed packages and which ' |
| 109 | 'phase they failed in.', |
| 110 | ) |
| 111 | parser.add_argument( |
| 112 | '--show-output', |
| 113 | action='store_true', |
| 114 | help=argparse.SUPPRESS, |
| 115 | deprecated='This option is no longer supported.', |
| 116 | ) |
| 117 | |
| 118 | return parser |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 119 | |
| 120 | |
Brian Harring | 3067505 | 2012-02-29 12:18:22 -0800 | [diff] [blame] | 121 | def main(argv): |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 122 | |
| 123 | parser = ParallelEmergeArgParser() |
| 124 | parsed_args, emerge_args = parser.parse_known_args(argv) |
| 125 | parsed_args = vars(parsed_args) |
| 126 | |
| 127 | os.environ['CLEAN_DELAY'] = '0' |
| 128 | |
| 129 | if parsed_args.get('sysroot'): |
| 130 | emerge_args.extend(['--sysroot', parsed_args['sysroot']]) |
| 131 | os.environ['PORTAGE_CONFIGROOT'] = parsed_args['sysroot'] |
| 132 | |
| 133 | if parsed_args.get('root'): |
| 134 | emerge_args.extend(['--root', parsed_args['root']]) |
| 135 | |
| 136 | if parsed_args.get('rebuild'): |
| 137 | emerge_args.append('--rebuild-if-unbuilt') |
| 138 | |
| 139 | if parsed_args.get('workon'): |
| 140 | emerge_args.append('--reinstall-atoms=%s' % ' '.join(parsed_args['workon'])) |
| 141 | emerge_args.append('--usepkg-exclude=%s' % ' '.join(parsed_args['workon'])) |
| 142 | |
| 143 | if parsed_args.get('force_remote_binary'): |
| 144 | emerge_args.append( |
| 145 | '--useoldpkg-atoms=%s' % ' '.join(parsed_args['force_remote_binary'])) |
| 146 | |
| 147 | if parsed_args.get('root_deps') is not None: |
| 148 | emerge_args.append('--root-deps=%s' % parsed_args['root_deps']) |
Chris McDonald | d2fa616 | 2019-07-30 15:30:58 -0600 | [diff] [blame] | 149 | else: |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 150 | emerge_args.append('--root-deps') |
| 151 | |
| 152 | emerge_args.append('--jobs=%s' % parsed_args['jobs']) |
| 153 | emerge_args.append('--rebuild-exclude=chromeos-base/chromeos-chrome') |
| 154 | |
Mike Frysinger | e743f0d | 2019-12-11 15:07:03 -0500 | [diff] [blame] | 155 | os.execvp('emerge', ['emerge'] + emerge_args) |