blob: e798c1f772d56547e6e002b225860e023b9ce3f1 [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:
Alex Klein2e989bc2023-05-02 14:19:25 -060042 commandline.ArgumentParser that captures arguments specific to
43 parallel_emerge.
Alex Klein1699fab2022-09-08 08:46:06 -060044 """
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,
Alex Klein2e989bc2023-05-02 14:19:25 -0600102 deprecated="parallel_emerge no longer records failed packages. Set "
103 "CROS_METRICS_DIR in the system environment to get a log of failed "
104 "packages and which phase they failed in.",
Alex Klein1699fab2022-09-08 08:46:06 -0600105 )
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):
Alex Klein1699fab2022-09-08 08:46:06 -0600117 parser = ParallelEmergeArgParser()
118 parsed_args, emerge_args = parser.parse_known_args(argv)
119 parsed_args = vars(parsed_args)
Chris McDonald32f02042019-11-12 10:30:38 -0700120
Alex Klein1699fab2022-09-08 08:46:06 -0600121 os.environ["CLEAN_DELAY"] = "0"
Chris McDonald32f02042019-11-12 10:30:38 -0700122
Alex Klein1699fab2022-09-08 08:46:06 -0600123 if parsed_args.get("sysroot"):
124 emerge_args.extend(["--sysroot", parsed_args["sysroot"]])
125 os.environ["PORTAGE_CONFIGROOT"] = parsed_args["sysroot"]
Chris McDonald32f02042019-11-12 10:30:38 -0700126
Alex Klein1699fab2022-09-08 08:46:06 -0600127 if parsed_args.get("root"):
128 emerge_args.extend(["--root", parsed_args["root"]])
Chris McDonald32f02042019-11-12 10:30:38 -0700129
Alex Klein1699fab2022-09-08 08:46:06 -0600130 if parsed_args.get("rebuild"):
131 emerge_args.append("--rebuild-if-unbuilt")
Chris McDonald32f02042019-11-12 10:30:38 -0700132
Alex Klein1699fab2022-09-08 08:46:06 -0600133 if parsed_args.get("workon"):
134 emerge_args.append(
Alex Klein2e989bc2023-05-02 14:19:25 -0600135 f"--reinstall-atoms={' '.join(parsed_args['workon'])}"
Alex Klein1699fab2022-09-08 08:46:06 -0600136 )
137 emerge_args.append(
Alex Klein2e989bc2023-05-02 14:19:25 -0600138 f"--usepkg-exclude={' '.join(parsed_args['workon'])}"
Alex Klein1699fab2022-09-08 08:46:06 -0600139 )
Chris McDonald32f02042019-11-12 10:30:38 -0700140
Alex Klein1699fab2022-09-08 08:46:06 -0600141 if parsed_args.get("force_remote_binary"):
142 emerge_args.append(
Alex Klein2e989bc2023-05-02 14:19:25 -0600143 f"--useoldpkg-atoms={' '.join(parsed_args['force_remote_binary'])}"
Alex Klein1699fab2022-09-08 08:46:06 -0600144 )
Chris McDonald32f02042019-11-12 10:30:38 -0700145
Alex Klein1699fab2022-09-08 08:46:06 -0600146 if parsed_args.get("root_deps") is not None:
Alex Klein2e989bc2023-05-02 14:19:25 -0600147 emerge_args.append(f"--root-deps={parsed_args['root_deps']}")
Alex Klein1699fab2022-09-08 08:46:06 -0600148 else:
149 emerge_args.append("--root-deps")
Chris McDonald32f02042019-11-12 10:30:38 -0700150
Alex Klein2e989bc2023-05-02 14:19:25 -0600151 emerge_args.append(f"--jobs={parsed_args['jobs']}")
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600152
Alex Klein04417c62022-10-06 13:02:56 -0600153 # The -v/--verbose flag gets eaten by the commandline.ArgumentParser to
154 # set the log_level, but it was almost certainly meant to be passed through
155 # to emerge. Check for -v/--verbose directly to avoid coupling this to the
156 # semantics of chromite logging CLI args.
157 if "-v" in argv or "--verbose" in argv:
158 emerge_args.append("--verbose")
159
Alex Klein1699fab2022-09-08 08:46:06 -0600160 emerge_args.append("--rebuild-exclude=chromeos-base/chromeos-chrome")
161 for pkg in constants.OTHER_CHROME_PACKAGES:
162 emerge_args.append("--rebuild-exclude=%s" % pkg)
Chris McDonald32f02042019-11-12 10:30:38 -0700163
Alex Klein1699fab2022-09-08 08:46:06 -0600164 cmd = ["emerge"] + emerge_args
165 cmd_str = cros_build_lib.CmdToStr(cmd)
Mike Frysinger57d81cd2023-02-02 09:05:06 -0500166 if parsed_args.get("dryrun"):
Alex Klein1699fab2022-09-08 08:46:06 -0600167 logging.notice("Would have run: %s", cmd_str)
168 return
Alex Kleinb11c7002021-09-29 15:35:57 -0600169
Alex Klein1699fab2022-09-08 08:46:06 -0600170 logging.info("Running: %s", cmd_str)
171 os.execvp("emerge", cmd)