blob: 2d96e0bd1726f24e4604521274b33e1d2c4783e7 [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
21
Chris McDonald32f02042019-11-12 10:30:38 -070022from chromite.lib import commandline
23from 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):
30 sysroot = cros_build_lib.GetSysroot(values)
31 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 )
93
94 parser.add_argument(
95 '--retries',
96 help=argparse.SUPPRESS,
97 deprecated='Build retries are no longer supported.',
98 )
99 parser.add_argument(
100 '--eventlogfile',
101 help=argparse.SUPPRESS,
102 deprecated=
103 'parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR '
104 'in the system environment to get a log of failed packages and which '
105 'phase they failed in.',
106 )
107 parser.add_argument(
108 '--show-output',
109 action='store_true',
110 help=argparse.SUPPRESS,
111 deprecated='This option is no longer supported.',
112 )
113
114 return parser
David Jamesfcb70ef2011-02-02 16:02:30 -0800115
116
Brian Harring30675052012-02-29 12:18:22 -0800117def main(argv):
Chris McDonald32f02042019-11-12 10:30:38 -0700118
119 parser = ParallelEmergeArgParser()
120 parsed_args, emerge_args = parser.parse_known_args(argv)
121 parsed_args = vars(parsed_args)
122
123 os.environ['CLEAN_DELAY'] = '0'
124
125 if parsed_args.get('sysroot'):
126 emerge_args.extend(['--sysroot', parsed_args['sysroot']])
127 os.environ['PORTAGE_CONFIGROOT'] = parsed_args['sysroot']
128
129 if parsed_args.get('root'):
130 emerge_args.extend(['--root', parsed_args['root']])
131
132 if parsed_args.get('rebuild'):
133 emerge_args.append('--rebuild-if-unbuilt')
134
135 if parsed_args.get('workon'):
136 emerge_args.append('--reinstall-atoms=%s' % ' '.join(parsed_args['workon']))
137 emerge_args.append('--usepkg-exclude=%s' % ' '.join(parsed_args['workon']))
138
139 if parsed_args.get('force_remote_binary'):
140 emerge_args.append(
141 '--useoldpkg-atoms=%s' % ' '.join(parsed_args['force_remote_binary']))
142
143 if parsed_args.get('root_deps') is not None:
144 emerge_args.append('--root-deps=%s' % parsed_args['root_deps'])
Chris McDonaldd2fa6162019-07-30 15:30:58 -0600145 else:
Chris McDonald32f02042019-11-12 10:30:38 -0700146 emerge_args.append('--root-deps')
147
148 emerge_args.append('--jobs=%s' % parsed_args['jobs'])
149 emerge_args.append('--rebuild-exclude=chromeos-base/chromeos-chrome')
150
Mike Frysingere743f0d2019-12-11 15:07:03 -0500151 os.execvp('emerge', ['emerge'] + emerge_args)