blob: 7398485588c6b6fbd4176fb1a627a8ba0d365c4a [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
Sloan Johnsona1c89eb2022-06-07 22:49:05 +00005"""Wrapper script to run emerge, with reasonable defaults.
Chris McDonald32f02042019-11-12 10:30:38 -07006
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):
Alex Klein1699fab2022-09-08 08:46:06 -060027 """Translates board argument to sysroot location."""
Chris McDonald32f02042019-11-12 10:30:38 -070028
Alex Klein1699fab2022-09-08 08:46:06 -060029 def __call__(self, parser, namespace, values, option_string=None):
30 sysroot = build_target_lib.get_default_sysroot_path(values)
31 setattr(namespace, "sysroot", sysroot)
Chris McDonald32f02042019-11-12 10:30:38 -070032
33
34def ParallelEmergeArgParser():
Alex Klein1699fab2022-09-08 08:46:06 -060035 """Helper function to create command line argument parser for this wrapper.
Chris McDonald32f02042019-11-12 10:30:38 -070036
Alex Klein1699fab2022-09-08 08:46:06 -060037 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.
Chris McDonald32f02042019-11-12 10:30:38 -070040
Alex Klein1699fab2022-09-08 08:46:06 -060041 Returns:
42 commandline.ArgumentParser that captures arguments specific to
43 parallel_emerge
44 """
45 parser = commandline.ArgumentParser()
Chris McDonald32f02042019-11-12 10:30:38 -070046
Alex Klein1699fab2022-09-08 08:46:06 -060047 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 )
Chris McDonald32f02042019-11-12 10:30:38 -070058
Alex Klein1699fab2022-09-08 08:46:06 -060059 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 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
Alex Klein1699fab2022-09-08 08:46:06 -0600104 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="parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR "
113 "in the system environment to get a log of failed packages and which "
114 "phase they failed in.",
115 )
116 parser.add_argument(
117 "--show-output",
118 action="store_true",
119 help=argparse.SUPPRESS,
120 deprecated="This option is no longer supported.",
121 )
Chris McDonald32f02042019-11-12 10:30:38 -0700122
Alex Klein1699fab2022-09-08 08:46:06 -0600123 return parser
David Jamesfcb70ef2011-02-02 16:02:30 -0800124
125
Brian Harring30675052012-02-29 12:18:22 -0800126def main(argv):
Chris McDonald32f02042019-11-12 10:30:38 -0700127
Alex Klein1699fab2022-09-08 08:46:06 -0600128 parser = ParallelEmergeArgParser()
129 parsed_args, emerge_args = parser.parse_known_args(argv)
130 parsed_args = vars(parsed_args)
Chris McDonald32f02042019-11-12 10:30:38 -0700131
Alex Klein1699fab2022-09-08 08:46:06 -0600132 os.environ["CLEAN_DELAY"] = "0"
Chris McDonald32f02042019-11-12 10:30:38 -0700133
Alex Klein1699fab2022-09-08 08:46:06 -0600134 if parsed_args.get("sysroot"):
135 emerge_args.extend(["--sysroot", parsed_args["sysroot"]])
136 os.environ["PORTAGE_CONFIGROOT"] = parsed_args["sysroot"]
Chris McDonald32f02042019-11-12 10:30:38 -0700137
Alex Klein1699fab2022-09-08 08:46:06 -0600138 if parsed_args.get("root"):
139 emerge_args.extend(["--root", parsed_args["root"]])
Chris McDonald32f02042019-11-12 10:30:38 -0700140
Alex Klein1699fab2022-09-08 08:46:06 -0600141 if parsed_args.get("rebuild"):
142 emerge_args.append("--rebuild-if-unbuilt")
Chris McDonald32f02042019-11-12 10:30:38 -0700143
Alex Klein1699fab2022-09-08 08:46:06 -0600144 if parsed_args.get("workon"):
145 emerge_args.append(
146 "--reinstall-atoms=%s" % " ".join(parsed_args["workon"])
147 )
148 emerge_args.append(
149 "--usepkg-exclude=%s" % " ".join(parsed_args["workon"])
150 )
Chris McDonald32f02042019-11-12 10:30:38 -0700151
Alex Klein1699fab2022-09-08 08:46:06 -0600152 if parsed_args.get("force_remote_binary"):
153 emerge_args.append(
154 "--useoldpkg-atoms=%s"
155 % " ".join(parsed_args["force_remote_binary"])
156 )
Chris McDonald32f02042019-11-12 10:30:38 -0700157
Alex Klein1699fab2022-09-08 08:46:06 -0600158 if parsed_args.get("root_deps") is not None:
159 emerge_args.append("--root-deps=%s" % parsed_args["root_deps"])
160 else:
161 emerge_args.append("--root-deps")
Chris McDonald32f02042019-11-12 10:30:38 -0700162
Alex Klein1699fab2022-09-08 08:46:06 -0600163 emerge_args.append("--jobs=%s" % parsed_args["jobs"])
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600164
Alex Klein1699fab2022-09-08 08:46:06 -0600165 emerge_args.append("--rebuild-exclude=chromeos-base/chromeos-chrome")
166 for pkg in constants.OTHER_CHROME_PACKAGES:
167 emerge_args.append("--rebuild-exclude=%s" % pkg)
Chris McDonald32f02042019-11-12 10:30:38 -0700168
Alex Klein1699fab2022-09-08 08:46:06 -0600169 cmd = ["emerge"] + emerge_args
170 cmd_str = cros_build_lib.CmdToStr(cmd)
171 if parsed_args.get("dry_run"):
172 logging.notice("Would have run: %s", cmd_str)
173 return
Alex Kleinb11c7002021-09-29 15:35:57 -0600174
Alex Klein1699fab2022-09-08 08:46:06 -0600175 logging.info("Running: %s", cmd_str)
176 os.execvp("emerge", cmd)