blob: 89391d56cfed69d2ee3771950c5e2c52e2008456 [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
Alex Kleinb11c7002021-09-29 15:35:57 -060022from chromite.lib import cros_build_lib
Thiago Goncalesf4acc422013-07-17 10:26:35 -070023
David Jamesfcb70ef2011-02-02 16:02:30 -080024
Chris McDonald32f02042019-11-12 10:30:38 -070025class LookupBoardSysroot(argparse.Action):
Alex Klein1699fab2022-09-08 08:46:06 -060026 """Translates board argument to sysroot location."""
Chris McDonald32f02042019-11-12 10:30:38 -070027
Alex Klein1699fab2022-09-08 08:46:06 -060028 def __call__(self, parser, namespace, values, option_string=None):
29 sysroot = build_target_lib.get_default_sysroot_path(values)
30 setattr(namespace, "sysroot", sysroot)
Chris McDonald32f02042019-11-12 10:30:38 -070031
32
33def ParallelEmergeArgParser():
Alex Klein1699fab2022-09-08 08:46:06 -060034 """Helper function to create command line argument parser for this wrapper.
Chris McDonald32f02042019-11-12 10:30:38 -070035
Alex Klein1699fab2022-09-08 08:46:06 -060036 We need to be compatible with emerge arg format. We scrape arguments that
37 are specific to parallel_emerge, and pass through the rest directly to
38 emerge.
Chris McDonald32f02042019-11-12 10:30:38 -070039
Alex Klein1699fab2022-09-08 08:46:06 -060040 Returns:
Alex Klein2e989bc2023-05-02 14:19:25 -060041 commandline.ArgumentParser that captures arguments specific to
42 parallel_emerge.
Alex Klein1699fab2022-09-08 08:46:06 -060043 """
Mike Frysinger57d81cd2023-02-02 09:05:06 -050044 parser = commandline.ArgumentParser(description=__doc__, dryrun=True)
Chris McDonald32f02042019-11-12 10:30:38 -070045
Alex Klein1699fab2022-09-08 08:46:06 -060046 board_group = parser.add_mutually_exclusive_group()
47 board_group.add_argument(
48 "--board",
49 default=None,
50 action=LookupBoardSysroot,
51 )
52 board_group.add_argument(
53 "--sysroot",
54 action="store",
55 metavar="PATH",
56 )
Chris McDonald32f02042019-11-12 10:30:38 -070057
Alex Klein1699fab2022-09-08 08:46:06 -060058 parser.add_argument(
59 "--root",
60 action="store",
61 metavar="PATH",
62 )
63 parser.add_argument(
64 "--workon",
65 action="append",
66 metavar="PKGS",
67 )
68 parser.add_argument(
69 "--rebuild",
70 action="store_true",
71 default=False,
72 )
73 parser.add_argument(
74 "--force-remote-binary",
75 action="append",
76 help=argparse.SUPPRESS,
77 )
78 parser.add_argument(
79 "--root-deps",
80 action="store",
81 nargs="?",
82 default=None,
83 dest="root_deps",
84 help=argparse.SUPPRESS,
85 )
86 parser.add_argument(
87 "-j",
88 "--jobs",
89 default=multiprocessing.cpu_count(),
90 metavar="PARALLEL_JOBCOUNT",
91 )
Chris McDonald32f02042019-11-12 10:30:38 -070092
Alex Klein1699fab2022-09-08 08:46:06 -060093 parser.add_argument(
94 "--retries",
95 help=argparse.SUPPRESS,
96 deprecated="Build retries are no longer supported.",
97 )
98 parser.add_argument(
99 "--eventlogfile",
100 help=argparse.SUPPRESS,
Alex Klein2e989bc2023-05-02 14:19:25 -0600101 deprecated="parallel_emerge no longer records failed packages. Set "
102 "CROS_METRICS_DIR in the system environment to get a log of failed "
103 "packages and which phase they failed in.",
Alex Klein1699fab2022-09-08 08:46:06 -0600104 )
105 parser.add_argument(
106 "--show-output",
107 action="store_true",
108 help=argparse.SUPPRESS,
109 deprecated="This option is no longer supported.",
110 )
Chris McDonald32f02042019-11-12 10:30:38 -0700111
Alex Klein1699fab2022-09-08 08:46:06 -0600112 return parser
David Jamesfcb70ef2011-02-02 16:02:30 -0800113
114
Brian Harring30675052012-02-29 12:18:22 -0800115def main(argv):
Alex Klein1699fab2022-09-08 08:46:06 -0600116 parser = ParallelEmergeArgParser()
117 parsed_args, emerge_args = parser.parse_known_args(argv)
118 parsed_args = vars(parsed_args)
Chris McDonald32f02042019-11-12 10:30:38 -0700119
Alex Klein1699fab2022-09-08 08:46:06 -0600120 os.environ["CLEAN_DELAY"] = "0"
Chris McDonald32f02042019-11-12 10:30:38 -0700121
Alex Klein1699fab2022-09-08 08:46:06 -0600122 if parsed_args.get("sysroot"):
123 emerge_args.extend(["--sysroot", parsed_args["sysroot"]])
124 os.environ["PORTAGE_CONFIGROOT"] = parsed_args["sysroot"]
Chris McDonald32f02042019-11-12 10:30:38 -0700125
Alex Klein1699fab2022-09-08 08:46:06 -0600126 if parsed_args.get("root"):
127 emerge_args.extend(["--root", parsed_args["root"]])
Chris McDonald32f02042019-11-12 10:30:38 -0700128
Alex Klein1699fab2022-09-08 08:46:06 -0600129 if parsed_args.get("rebuild"):
130 emerge_args.append("--rebuild-if-unbuilt")
Chris McDonald32f02042019-11-12 10:30:38 -0700131
Alex Klein1699fab2022-09-08 08:46:06 -0600132 if parsed_args.get("workon"):
133 emerge_args.append(
Alex Klein2e989bc2023-05-02 14:19:25 -0600134 f"--reinstall-atoms={' '.join(parsed_args['workon'])}"
Alex Klein1699fab2022-09-08 08:46:06 -0600135 )
136 emerge_args.append(
Alex Klein2e989bc2023-05-02 14:19:25 -0600137 f"--usepkg-exclude={' '.join(parsed_args['workon'])}"
Alex Klein1699fab2022-09-08 08:46:06 -0600138 )
Chris McDonald32f02042019-11-12 10:30:38 -0700139
Alex Klein1699fab2022-09-08 08:46:06 -0600140 if parsed_args.get("force_remote_binary"):
141 emerge_args.append(
Alex Klein2e989bc2023-05-02 14:19:25 -0600142 f"--useoldpkg-atoms={' '.join(parsed_args['force_remote_binary'])}"
Alex Klein1699fab2022-09-08 08:46:06 -0600143 )
Chris McDonald32f02042019-11-12 10:30:38 -0700144
Alex Klein1699fab2022-09-08 08:46:06 -0600145 if parsed_args.get("root_deps") is not None:
Alex Klein2e989bc2023-05-02 14:19:25 -0600146 emerge_args.append(f"--root-deps={parsed_args['root_deps']}")
Alex Klein1699fab2022-09-08 08:46:06 -0600147 else:
148 emerge_args.append("--root-deps")
Chris McDonald32f02042019-11-12 10:30:38 -0700149
Alex Klein2e989bc2023-05-02 14:19:25 -0600150 emerge_args.append(f"--jobs={parsed_args['jobs']}")
George Engelbrechtaabc6a52020-03-24 18:40:18 -0600151
Alex Klein04417c62022-10-06 13:02:56 -0600152 # The -v/--verbose flag gets eaten by the commandline.ArgumentParser to
153 # set the log_level, but it was almost certainly meant to be passed through
154 # to emerge. Check for -v/--verbose directly to avoid coupling this to the
155 # semantics of chromite logging CLI args.
156 if "-v" in argv or "--verbose" in argv:
157 emerge_args.append("--verbose")
158
Alex Klein1699fab2022-09-08 08:46:06 -0600159 cmd = ["emerge"] + emerge_args
160 cmd_str = cros_build_lib.CmdToStr(cmd)
Mike Frysinger57d81cd2023-02-02 09:05:06 -0500161 if parsed_args.get("dryrun"):
Alex Klein1699fab2022-09-08 08:46:06 -0600162 logging.notice("Would have run: %s", cmd_str)
163 return
Alex Kleinb11c7002021-09-29 15:35:57 -0600164
Alex Klein1699fab2022-09-08 08:46:06 -0600165 logging.info("Running: %s", cmd_str)
166 os.execvp("emerge", cmd)