blob: cfa9307128d48ae9de2e8adc84cd7e9404586067 [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
Alex Kleinb11c7002021-09-29 15:35:57 -060016import logging
Chris McDonald32f02042019-11-12 10:30:38 -070017import multiprocessing
Chris McDonald16438a82019-10-01 19:01:30 +000018import os
19
Mike Frysinger06a51c82021-04-06 11:39:17 -040020from chromite.lib import build_target_lib
Chris McDonald32f02042019-11-12 10:30:38 -070021from chromite.lib import commandline
George Engelbrechtaabc6a52020-03-24 18:40:18 -060022from chromite.lib import constants
Alex Kleinb11c7002021-09-29 15:35:57 -060023from chromite.lib import cros_build_lib
Thiago Goncalesf4acc422013-07-17 10:26:35 -070024
David Jamesfcb70ef2011-02-02 16:02:30 -080025
Chris McDonald32f02042019-11-12 10:30:38 -070026class LookupBoardSysroot(argparse.Action):
27 """Translates board argument to sysroot location."""
28
29 def __call__(self, parser, namespace, values, option_string=None):
Mike Frysinger06a51c82021-04-06 11:39:17 -040030 sysroot = build_target_lib.get_default_sysroot_path(values)
Chris McDonald32f02042019-11-12 10:30:38 -070031 setattr(namespace, 'sysroot', sysroot)
32
33
34def ParallelEmergeArgParser():
35 """Helper function to create command line argument parser for this wrapper.
36
37 We need to be compatible with emerge arg format. We scrape arguments that
38 are specific to parallel_emerge, and pass through the rest directly to
39 emerge.
40
41 Returns:
42 commandline.ArgumentParser that captures arguments specific to
43 parallel_emerge
44 """
45 parser = commandline.ArgumentParser()
46
47 board_group = parser.add_mutually_exclusive_group()
48 board_group.add_argument(
49 '--board',
50 default=None,
51 action=LookupBoardSysroot,
52 )
53 board_group.add_argument(
54 '--sysroot',
55 action='store',
56 metavar='PATH',
57 )
58
59 parser.add_argument(
60 '--root',
61 action='store',
62 metavar='PATH',
63 )
64 parser.add_argument(
65 '--workon',
66 action='append',
67 metavar='PKGS',
68 )
69 parser.add_argument(
70 '--rebuild',
71 action='store_true',
72 default=False,
73 )
74 parser.add_argument(
75 '--force-remote-binary',
76 action='append',
77 help=argparse.SUPPRESS,
78 )
79 parser.add_argument(
80 '--root-deps',
81 action='store',
82 nargs='?',
83 default=None,
84 dest='root_deps',
85 help=argparse.SUPPRESS,
86 )
87 parser.add_argument(
88 '-j',
89 '--jobs',
90 default=multiprocessing.cpu_count(),
91 metavar='PARALLEL_JOBCOUNT',
92 )
Alex Kleinb11c7002021-09-29 15:35:57 -060093 parser.add_argument(
94 '-n',
95 '--dryrun',
96 '--dry-run',
97 dest='dry_run',
98 action='store_true',
99 default=False,
100 help='Print the emerge command that would have been run instead of '
101 'actually running it.',
102 )
Chris McDonald32f02042019-11-12 10:30:38 -0700103
104 parser.add_argument(
105 '--retries',
106 help=argparse.SUPPRESS,
107 deprecated='Build retries are no longer supported.',
108 )
109 parser.add_argument(
110 '--eventlogfile',
111 help=argparse.SUPPRESS,
112 deprecated=
113 'parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR '
114 'in the system environment to get a log of failed packages and which '
115 'phase they failed in.',
116 )
117 parser.add_argument(
118 '--show-output',
119 action='store_true',
120 help=argparse.SUPPRESS,
121 deprecated='This option is no longer supported.',
122 )
123
124 return parser
David Jamesfcb70ef2011-02-02 16:02:30 -0800125
126
Brian Harring30675052012-02-29 12:18:22 -0800127def main(argv):
Chris McDonald32f02042019-11-12 10:30:38 -0700128
129 parser = ParallelEmergeArgParser()
130 parsed_args, emerge_args = parser.parse_known_args(argv)
131 parsed_args = vars(parsed_args)
132
133 os.environ['CLEAN_DELAY'] = '0'
134
135 if parsed_args.get('sysroot'):
136 emerge_args.extend(['--sysroot', parsed_args['sysroot']])
137 os.environ['PORTAGE_CONFIGROOT'] = parsed_args['sysroot']
138
139 if parsed_args.get('root'):
140 emerge_args.extend(['--root', parsed_args['root']])
141
142 if parsed_args.get('rebuild'):
143 emerge_args.append('--rebuild-if-unbuilt')
144
145 if parsed_args.get('workon'):
146 emerge_args.append('--reinstall-atoms=%s' % ' '.join(parsed_args['workon']))
147 emerge_args.append('--usepkg-exclude=%s' % ' '.join(parsed_args['workon']))
148
149 if parsed_args.get('force_remote_binary'):
150 emerge_args.append(
151 '--useoldpkg-atoms=%s' % ' '.join(parsed_args['force_remote_binary']))
152
153 if parsed_args.get('root_deps') is not None:
154 emerge_args.append('--root-deps=%s' % parsed_args['root_deps'])
Chris McDonaldd2fa6162019-07-30 15:30:58 -0600155 else:
Chris McDonald32f02042019-11-12 10:30:38 -0700156 emerge_args.append('--root-deps')
157
158 emerge_args.append('--jobs=%s' % parsed_args['jobs'])
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600159
Chris McDonald32f02042019-11-12 10:30:38 -0700160 emerge_args.append('--rebuild-exclude=chromeos-base/chromeos-chrome')
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600161 for pkg in constants.OTHER_CHROME_PACKAGES:
162 emerge_args.append('--rebuild-exclude=%s' % pkg)
Chris McDonald32f02042019-11-12 10:30:38 -0700163
Alex Kleinb11c7002021-09-29 15:35:57 -0600164 cmd = ['emerge'] + emerge_args
165 cmd_str = cros_build_lib.CmdToStr(cmd)
166 if parsed_args.get('dry_run'):
167 logging.notice('Would have run: %s', cmd_str)
168 return
169
170 logging.info('Running: %s', cmd_str)
171 os.execvp('emerge', cmd)