blob: 441443a86ed65ca92f09b2ff6ca72f29bd6dfd10 [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
24from chromite.lib import cros_build_lib
Thiago Goncalesf4acc422013-07-17 10:26:35 -070025
David Jamesfcb70ef2011-02-02 16:02:30 -080026
Mike Frysinger6165cdc2020-02-21 02:38:07 -050027assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
28
29
Chris McDonald32f02042019-11-12 10:30:38 -070030class 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
38def 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 Jamesfcb70ef2011-02-02 16:02:30 -0800119
120
Brian Harring30675052012-02-29 12:18:22 -0800121def main(argv):
Chris McDonald32f02042019-11-12 10:30:38 -0700122
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 McDonaldd2fa6162019-07-30 15:30:58 -0600149 else:
Chris McDonald32f02042019-11-12 10:30:38 -0700150 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 Frysingere743f0d2019-12-11 15:07:03 -0500155 os.execvp('emerge', ['emerge'] + emerge_args)