Mike Frysinger | f1ba7ad | 2022-09-12 05:42:57 -0400 | [diff] [blame] | 1 | # Copyright 2019 The ChromiumOS Authors |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
Sloan Johnson | a1c89eb | 2022-06-07 22:49:05 +0000 | [diff] [blame] | 5 | """Wrapper script to run emerge, with reasonable defaults. |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 6 | |
| 7 | Usage: |
| 8 | ./parallel_emerge [--board=BOARD] [--workon=PKGS] |
| 9 | [--force-remote-binary=PKGS] [emerge args] package |
| 10 | |
| 11 | This script is a simple wrapper around emerge that handles legacy command line |
| 12 | arguments as well as setting reasonable defaults for parallelism. |
| 13 | """ |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 14 | |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 15 | import argparse |
Alex Klein | b11c700 | 2021-09-29 15:35:57 -0600 | [diff] [blame] | 16 | import logging |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 17 | import multiprocessing |
Chris McDonald | 16438a8 | 2019-10-01 19:01:30 +0000 | [diff] [blame] | 18 | import os |
| 19 | |
Mike Frysinger | 06a51c8 | 2021-04-06 11:39:17 -0400 | [diff] [blame] | 20 | from chromite.lib import build_target_lib |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 21 | from chromite.lib import commandline |
George Engelbrecht | aabc6a5 | 2020-03-24 18:40:18 -0600 | [diff] [blame] | 22 | from chromite.lib import constants |
Alex Klein | b11c700 | 2021-09-29 15:35:57 -0600 | [diff] [blame] | 23 | from chromite.lib import cros_build_lib |
Thiago Goncales | f4acc42 | 2013-07-17 10:26:35 -0700 | [diff] [blame] | 24 | |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 25 | |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 26 | class LookupBoardSysroot(argparse.Action): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 27 | """Translates board argument to sysroot location.""" |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 28 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 29 | 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 McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 32 | |
| 33 | |
| 34 | def ParallelEmergeArgParser(): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 35 | """Helper function to create command line argument parser for this wrapper. |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 36 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 37 | 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 McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 40 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 41 | Returns: |
| 42 | commandline.ArgumentParser that captures arguments specific to |
| 43 | parallel_emerge |
| 44 | """ |
| 45 | parser = commandline.ArgumentParser() |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 46 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 47 | 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 McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 58 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 59 | 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 McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 103 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 104 | 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 McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 122 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 123 | return parser |
David James | fcb70ef | 2011-02-02 16:02:30 -0800 | [diff] [blame] | 124 | |
| 125 | |
Brian Harring | 3067505 | 2012-02-29 12:18:22 -0800 | [diff] [blame] | 126 | def main(argv): |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 127 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 128 | parser = ParallelEmergeArgParser() |
| 129 | parsed_args, emerge_args = parser.parse_known_args(argv) |
| 130 | parsed_args = vars(parsed_args) |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 131 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 132 | os.environ["CLEAN_DELAY"] = "0" |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 133 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 134 | if parsed_args.get("sysroot"): |
| 135 | emerge_args.extend(["--sysroot", parsed_args["sysroot"]]) |
| 136 | os.environ["PORTAGE_CONFIGROOT"] = parsed_args["sysroot"] |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 137 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 138 | if parsed_args.get("root"): |
| 139 | emerge_args.extend(["--root", parsed_args["root"]]) |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 140 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 141 | if parsed_args.get("rebuild"): |
| 142 | emerge_args.append("--rebuild-if-unbuilt") |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 143 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 144 | 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 McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 151 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 152 | if parsed_args.get("force_remote_binary"): |
| 153 | emerge_args.append( |
| 154 | "--useoldpkg-atoms=%s" |
| 155 | % " ".join(parsed_args["force_remote_binary"]) |
| 156 | ) |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 157 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 158 | 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 McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 162 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 163 | emerge_args.append("--jobs=%s" % parsed_args["jobs"]) |
George Engelbrecht | aabc6a5 | 2020-03-24 18:40:18 -0600 | [diff] [blame] | 164 | |
Alex Klein | 04417c6 | 2022-10-06 13:02:56 -0600 | [diff] [blame] | 165 | # The -v/--verbose flag gets eaten by the commandline.ArgumentParser to |
| 166 | # set the log_level, but it was almost certainly meant to be passed through |
| 167 | # to emerge. Check for -v/--verbose directly to avoid coupling this to the |
| 168 | # semantics of chromite logging CLI args. |
| 169 | if "-v" in argv or "--verbose" in argv: |
| 170 | emerge_args.append("--verbose") |
| 171 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 172 | emerge_args.append("--rebuild-exclude=chromeos-base/chromeos-chrome") |
| 173 | for pkg in constants.OTHER_CHROME_PACKAGES: |
| 174 | emerge_args.append("--rebuild-exclude=%s" % pkg) |
Chris McDonald | 32f0204 | 2019-11-12 10:30:38 -0700 | [diff] [blame] | 175 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 176 | cmd = ["emerge"] + emerge_args |
| 177 | cmd_str = cros_build_lib.CmdToStr(cmd) |
| 178 | if parsed_args.get("dry_run"): |
| 179 | logging.notice("Would have run: %s", cmd_str) |
| 180 | return |
Alex Klein | b11c700 | 2021-09-29 15:35:57 -0600 | [diff] [blame] | 181 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 182 | logging.info("Running: %s", cmd_str) |
| 183 | os.execvp("emerge", cmd) |