blob: 8a0320b100a8327fc4a8e3f56a10e6e02cff3168 [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2019 The ChromiumOS Authors
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 """
Mike Frysinger57d81cd2023-02-02 09:05:06 -050045 parser = commandline.ArgumentParser(description=__doc__, dryrun=True)
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 )
Chris McDonald32f02042019-11-12 10:30:38 -070093
Alex Klein1699fab2022-09-08 08:46:06 -060094 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="parallel_emerge no longer records failed packages. Set CROS_METRICS_DIR "
103 "in the system environment to get a log of failed packages and which "
104 "phase they failed in.",
105 )
106 parser.add_argument(
107 "--show-output",
108 action="store_true",
109 help=argparse.SUPPRESS,
110 deprecated="This option is no longer supported.",
111 )
Chris McDonald32f02042019-11-12 10:30:38 -0700112
Alex Klein1699fab2022-09-08 08:46:06 -0600113 return parser
David Jamesfcb70ef2011-02-02 16:02:30 -0800114
115
Brian Harring30675052012-02-29 12:18:22 -0800116def main(argv):
Chris McDonald32f02042019-11-12 10:30:38 -0700117
Alex Klein1699fab2022-09-08 08:46:06 -0600118 parser = ParallelEmergeArgParser()
119 parsed_args, emerge_args = parser.parse_known_args(argv)
120 parsed_args = vars(parsed_args)
Chris McDonald32f02042019-11-12 10:30:38 -0700121
Alex Klein1699fab2022-09-08 08:46:06 -0600122 os.environ["CLEAN_DELAY"] = "0"
Chris McDonald32f02042019-11-12 10:30:38 -0700123
Alex Klein1699fab2022-09-08 08:46:06 -0600124 if parsed_args.get("sysroot"):
125 emerge_args.extend(["--sysroot", parsed_args["sysroot"]])
126 os.environ["PORTAGE_CONFIGROOT"] = parsed_args["sysroot"]
Chris McDonald32f02042019-11-12 10:30:38 -0700127
Alex Klein1699fab2022-09-08 08:46:06 -0600128 if parsed_args.get("root"):
129 emerge_args.extend(["--root", parsed_args["root"]])
Chris McDonald32f02042019-11-12 10:30:38 -0700130
Alex Klein1699fab2022-09-08 08:46:06 -0600131 if parsed_args.get("rebuild"):
132 emerge_args.append("--rebuild-if-unbuilt")
Chris McDonald32f02042019-11-12 10:30:38 -0700133
Alex Klein1699fab2022-09-08 08:46:06 -0600134 if parsed_args.get("workon"):
135 emerge_args.append(
136 "--reinstall-atoms=%s" % " ".join(parsed_args["workon"])
137 )
138 emerge_args.append(
139 "--usepkg-exclude=%s" % " ".join(parsed_args["workon"])
140 )
Chris McDonald32f02042019-11-12 10:30:38 -0700141
Alex Klein1699fab2022-09-08 08:46:06 -0600142 if parsed_args.get("force_remote_binary"):
143 emerge_args.append(
144 "--useoldpkg-atoms=%s"
145 % " ".join(parsed_args["force_remote_binary"])
146 )
Chris McDonald32f02042019-11-12 10:30:38 -0700147
Alex Klein1699fab2022-09-08 08:46:06 -0600148 if parsed_args.get("root_deps") is not None:
149 emerge_args.append("--root-deps=%s" % parsed_args["root_deps"])
150 else:
151 emerge_args.append("--root-deps")
Chris McDonald32f02042019-11-12 10:30:38 -0700152
Alex Klein1699fab2022-09-08 08:46:06 -0600153 emerge_args.append("--jobs=%s" % parsed_args["jobs"])
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600154
Alex Klein04417c62022-10-06 13:02:56 -0600155 # The -v/--verbose flag gets eaten by the commandline.ArgumentParser to
156 # set the log_level, but it was almost certainly meant to be passed through
157 # to emerge. Check for -v/--verbose directly to avoid coupling this to the
158 # semantics of chromite logging CLI args.
159 if "-v" in argv or "--verbose" in argv:
160 emerge_args.append("--verbose")
161
Alex Klein1699fab2022-09-08 08:46:06 -0600162 emerge_args.append("--rebuild-exclude=chromeos-base/chromeos-chrome")
163 for pkg in constants.OTHER_CHROME_PACKAGES:
164 emerge_args.append("--rebuild-exclude=%s" % pkg)
Chris McDonald32f02042019-11-12 10:30:38 -0700165
Alex Klein1699fab2022-09-08 08:46:06 -0600166 cmd = ["emerge"] + emerge_args
167 cmd_str = cros_build_lib.CmdToStr(cmd)
Mike Frysinger57d81cd2023-02-02 09:05:06 -0500168 if parsed_args.get("dryrun"):
Alex Klein1699fab2022-09-08 08:46:06 -0600169 logging.notice("Would have run: %s", cmd_str)
170 return
Alex Kleinb11c7002021-09-29 15:35:57 -0600171
Alex Klein1699fab2022-09-08 08:46:06 -0600172 logging.info("Running: %s", cmd_str)
173 os.execvp("emerge", cmd)