blob: 5441e2950d38e0a8947bd7990fadd5c959975324 [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
Chris McDonaldd2fa6162019-07-30 15:30:58 -06002# Copyright 2019 The Chromium OS Authors. All rights reserved.
David Jamesfcb70ef2011-02-02 16:02:30 -08003# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
Chris McDonald32f02042019-11-12 10:30:38 -07006"""Wrapper script to run emerge, with sane defaults.
7
8Usage:
9 ./parallel_emerge [--board=BOARD] [--workon=PKGS]
10 [--force-remote-binary=PKGS] [emerge args] package
11
12This script is a simple wrapper around emerge that handles legacy command line
13arguments as well as setting reasonable defaults for parallelism.
14"""
David Jamesfcb70ef2011-02-02 16:02:30 -080015
Mike Frysinger383367e2014-09-16 15:06:17 -040016from __future__ import print_function
17
Chris McDonald32f02042019-11-12 10:30:38 -070018import argparse
19import multiprocessing
Chris McDonald16438a82019-10-01 19:01:30 +000020import os
Mike Frysinger6165cdc2020-02-21 02:38:07 -050021import sys
Chris McDonald16438a82019-10-01 19:01:30 +000022
Chris McDonald32f02042019-11-12 10:30:38 -070023from chromite.lib import commandline
George Engelbrechtaabc6a52020-03-24 18:40:18 -060024from chromite.lib import constants
Chris McDonald32f02042019-11-12 10:30:38 -070025from chromite.lib import cros_build_lib
Thiago Goncalesf4acc422013-07-17 10:26:35 -070026
David Jamesfcb70ef2011-02-02 16:02:30 -080027
Mike Frysinger6165cdc2020-02-21 02:38:07 -050028assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
29
30
Chris McDonald32f02042019-11-12 10:30:38 -070031class LookupBoardSysroot(argparse.Action):
32 """Translates board argument to sysroot location."""
33
34 def __call__(self, parser, namespace, values, option_string=None):
35 sysroot = cros_build_lib.GetSysroot(values)
36 setattr(namespace, 'sysroot', sysroot)
37
38
39def ParallelEmergeArgParser():
40 """Helper function to create command line argument parser for this wrapper.
41
42 We need to be compatible with emerge arg format. We scrape arguments that
43 are specific to parallel_emerge, and pass through the rest directly to
44 emerge.
45
46 Returns:
47 commandline.ArgumentParser that captures arguments specific to
48 parallel_emerge
49 """
50 parser = commandline.ArgumentParser()
51
52 board_group = parser.add_mutually_exclusive_group()
53 board_group.add_argument(
54 '--board',
55 default=None,
56 action=LookupBoardSysroot,
57 )
58 board_group.add_argument(
59 '--sysroot',
60 action='store',
61 metavar='PATH',
62 )
63
64 parser.add_argument(
65 '--root',
66 action='store',
67 metavar='PATH',
68 )
69 parser.add_argument(
70 '--workon',
71 action='append',
72 metavar='PKGS',
73 )
74 parser.add_argument(
75 '--rebuild',
76 action='store_true',
77 default=False,
78 )
79 parser.add_argument(
80 '--force-remote-binary',
81 action='append',
82 help=argparse.SUPPRESS,
83 )
84 parser.add_argument(
85 '--root-deps',
86 action='store',
87 nargs='?',
88 default=None,
89 dest='root_deps',
90 help=argparse.SUPPRESS,
91 )
92 parser.add_argument(
93 '-j',
94 '--jobs',
95 default=multiprocessing.cpu_count(),
96 metavar='PARALLEL_JOBCOUNT',
97 )
98
99 parser.add_argument(
100 '--retries',
101 help=argparse.SUPPRESS,
102 deprecated='Build retries are no longer supported.',
103 )
104 parser.add_argument(
105 '--eventlogfile',
106 help=argparse.SUPPRESS,
107 deprecated=
108 'parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR '
109 'in the system environment to get a log of failed packages and which '
110 'phase they failed in.',
111 )
112 parser.add_argument(
113 '--show-output',
114 action='store_true',
115 help=argparse.SUPPRESS,
116 deprecated='This option is no longer supported.',
117 )
118
119 return parser
David Jamesfcb70ef2011-02-02 16:02:30 -0800120
121
Brian Harring30675052012-02-29 12:18:22 -0800122def main(argv):
Chris McDonald32f02042019-11-12 10:30:38 -0700123
124 parser = ParallelEmergeArgParser()
125 parsed_args, emerge_args = parser.parse_known_args(argv)
126 parsed_args = vars(parsed_args)
127
128 os.environ['CLEAN_DELAY'] = '0'
129
130 if parsed_args.get('sysroot'):
131 emerge_args.extend(['--sysroot', parsed_args['sysroot']])
132 os.environ['PORTAGE_CONFIGROOT'] = parsed_args['sysroot']
133
134 if parsed_args.get('root'):
135 emerge_args.extend(['--root', parsed_args['root']])
136
137 if parsed_args.get('rebuild'):
138 emerge_args.append('--rebuild-if-unbuilt')
139
140 if parsed_args.get('workon'):
141 emerge_args.append('--reinstall-atoms=%s' % ' '.join(parsed_args['workon']))
142 emerge_args.append('--usepkg-exclude=%s' % ' '.join(parsed_args['workon']))
143
144 if parsed_args.get('force_remote_binary'):
145 emerge_args.append(
146 '--useoldpkg-atoms=%s' % ' '.join(parsed_args['force_remote_binary']))
147
148 if parsed_args.get('root_deps') is not None:
149 emerge_args.append('--root-deps=%s' % parsed_args['root_deps'])
Chris McDonaldd2fa6162019-07-30 15:30:58 -0600150 else:
Chris McDonald32f02042019-11-12 10:30:38 -0700151 emerge_args.append('--root-deps')
152
153 emerge_args.append('--jobs=%s' % parsed_args['jobs'])
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600154
Chris McDonald32f02042019-11-12 10:30:38 -0700155 emerge_args.append('--rebuild-exclude=chromeos-base/chromeos-chrome')
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600156 for pkg in constants.OTHER_CHROME_PACKAGES:
157 emerge_args.append('--rebuild-exclude=%s' % pkg)
Chris McDonald32f02042019-11-12 10:30:38 -0700158
Mike Frysingere743f0d2019-12-11 15:07:03 -0500159 os.execvp('emerge', ['emerge'] + emerge_args)