blob: 33a7a42b8a1126ea1b17a2f9be643ff1ed1394a2 [file] [log] [blame]
Chris McDonaldd2fa6162019-07-30 15:30:58 -06001# Copyright 2019 The Chromium OS Authors. All rights reserved.
David Jamesfcb70ef2011-02-02 16:02:30 -08002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
Chris McDonald32f02042019-11-12 10:30:38 -07005"""Wrapper script to run emerge, with sane defaults.
6
7Usage:
8 ./parallel_emerge [--board=BOARD] [--workon=PKGS]
9 [--force-remote-binary=PKGS] [emerge args] package
10
11This script is a simple wrapper around emerge that handles legacy command line
12arguments as well as setting reasonable defaults for parallelism.
13"""
David Jamesfcb70ef2011-02-02 16:02:30 -080014
Chris McDonald32f02042019-11-12 10:30:38 -070015import argparse
16import multiprocessing
Chris McDonald16438a82019-10-01 19:01:30 +000017import os
18
Mike Frysinger06a51c82021-04-06 11:39:17 -040019from chromite.lib import build_target_lib
Chris McDonald32f02042019-11-12 10:30:38 -070020from chromite.lib import commandline
George Engelbrechtaabc6a52020-03-24 18:40:18 -060021from chromite.lib import constants
Thiago Goncalesf4acc422013-07-17 10:26:35 -070022
David Jamesfcb70ef2011-02-02 16:02:30 -080023
Chris McDonald32f02042019-11-12 10:30:38 -070024class LookupBoardSysroot(argparse.Action):
25 """Translates board argument to sysroot location."""
26
27 def __call__(self, parser, namespace, values, option_string=None):
Mike Frysinger06a51c82021-04-06 11:39:17 -040028 sysroot = build_target_lib.get_default_sysroot_path(values)
Chris McDonald32f02042019-11-12 10:30:38 -070029 setattr(namespace, 'sysroot', sysroot)
30
31
32def ParallelEmergeArgParser():
33 """Helper function to create command line argument parser for this wrapper.
34
35 We need to be compatible with emerge arg format. We scrape arguments that
36 are specific to parallel_emerge, and pass through the rest directly to
37 emerge.
38
39 Returns:
40 commandline.ArgumentParser that captures arguments specific to
41 parallel_emerge
42 """
43 parser = commandline.ArgumentParser()
44
45 board_group = parser.add_mutually_exclusive_group()
46 board_group.add_argument(
47 '--board',
48 default=None,
49 action=LookupBoardSysroot,
50 )
51 board_group.add_argument(
52 '--sysroot',
53 action='store',
54 metavar='PATH',
55 )
56
57 parser.add_argument(
58 '--root',
59 action='store',
60 metavar='PATH',
61 )
62 parser.add_argument(
63 '--workon',
64 action='append',
65 metavar='PKGS',
66 )
67 parser.add_argument(
68 '--rebuild',
69 action='store_true',
70 default=False,
71 )
72 parser.add_argument(
73 '--force-remote-binary',
74 action='append',
75 help=argparse.SUPPRESS,
76 )
77 parser.add_argument(
78 '--root-deps',
79 action='store',
80 nargs='?',
81 default=None,
82 dest='root_deps',
83 help=argparse.SUPPRESS,
84 )
85 parser.add_argument(
86 '-j',
87 '--jobs',
88 default=multiprocessing.cpu_count(),
89 metavar='PARALLEL_JOBCOUNT',
90 )
91
92 parser.add_argument(
93 '--retries',
94 help=argparse.SUPPRESS,
95 deprecated='Build retries are no longer supported.',
96 )
97 parser.add_argument(
98 '--eventlogfile',
99 help=argparse.SUPPRESS,
100 deprecated=
101 'parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR '
102 'in the system environment to get a log of failed packages and which '
103 'phase they failed in.',
104 )
105 parser.add_argument(
106 '--show-output',
107 action='store_true',
108 help=argparse.SUPPRESS,
109 deprecated='This option is no longer supported.',
110 )
111
112 return parser
David Jamesfcb70ef2011-02-02 16:02:30 -0800113
114
Brian Harring30675052012-02-29 12:18:22 -0800115def main(argv):
Chris McDonald32f02042019-11-12 10:30:38 -0700116
117 parser = ParallelEmergeArgParser()
118 parsed_args, emerge_args = parser.parse_known_args(argv)
119 parsed_args = vars(parsed_args)
120
121 os.environ['CLEAN_DELAY'] = '0'
122
123 if parsed_args.get('sysroot'):
124 emerge_args.extend(['--sysroot', parsed_args['sysroot']])
125 os.environ['PORTAGE_CONFIGROOT'] = parsed_args['sysroot']
126
127 if parsed_args.get('root'):
128 emerge_args.extend(['--root', parsed_args['root']])
129
130 if parsed_args.get('rebuild'):
131 emerge_args.append('--rebuild-if-unbuilt')
132
133 if parsed_args.get('workon'):
134 emerge_args.append('--reinstall-atoms=%s' % ' '.join(parsed_args['workon']))
135 emerge_args.append('--usepkg-exclude=%s' % ' '.join(parsed_args['workon']))
136
137 if parsed_args.get('force_remote_binary'):
138 emerge_args.append(
139 '--useoldpkg-atoms=%s' % ' '.join(parsed_args['force_remote_binary']))
140
141 if parsed_args.get('root_deps') is not None:
142 emerge_args.append('--root-deps=%s' % parsed_args['root_deps'])
Chris McDonaldd2fa6162019-07-30 15:30:58 -0600143 else:
Chris McDonald32f02042019-11-12 10:30:38 -0700144 emerge_args.append('--root-deps')
145
146 emerge_args.append('--jobs=%s' % parsed_args['jobs'])
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600147
Chris McDonald32f02042019-11-12 10:30:38 -0700148 emerge_args.append('--rebuild-exclude=chromeos-base/chromeos-chrome')
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600149 for pkg in constants.OTHER_CHROME_PACKAGES:
150 emerge_args.append('--rebuild-exclude=%s' % pkg)
Chris McDonald32f02042019-11-12 10:30:38 -0700151
Mike Frysingere743f0d2019-12-11 15:07:03 -0500152 os.execvp('emerge', ['emerge'] + emerge_args)