blob: 1b04cbc30352f4043602fd6043f2886cc1de6e70 [file] [log] [blame] [edit]
# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Script to check if the package(s) have prebuilts.
The script must be run inside the chroot. The output is a json dict mapping the
package atoms to a boolean for whether a prebuilt exists.
"""
import json
import os
from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import osutils
from chromite.lib import portage_util
from chromite.lib.parser import package_info
if cros_build_lib.IsInsideChroot():
from chromite.lib import depgraph
def GetParser():
"""Build the argument parser."""
parser = commandline.ArgumentParser(description=__doc__)
parser.add_argument(
"-b",
"--build-target",
dest="build_target_name",
help="The build target that is being checked.",
)
parser.add_argument(
"--output",
type="path",
required=True,
help="The file path where the result json should be stored.",
)
parser.add_argument(
"packages", nargs="+", help="The package atoms that are being checked."
)
return parser
def _ParseArguments(argv):
"""Parse and validate arguments."""
parser = GetParser()
opts = parser.parse_args(argv)
if not os.path.exists(os.path.dirname(opts.output)):
parser.error("Path containing the output file does not exist.")
# Manually parse the packages as CPVs.
packages = []
for pkg in opts.packages:
cpv = package_info.parse(pkg)
if not cpv.atom:
parser.error("Invalid package atom: %s" % pkg)
packages.append(cpv)
opts.packages = packages
opts.Freeze()
return opts
def main(argv):
opts = _ParseArguments(argv)
cros_build_lib.AssertInsideChroot()
board = opts.build_target_name
bests = {}
for cpv in opts.packages:
bests[cpv.atom] = portage_util.PortageqBestVisible(
cpv.atom, board=board
)
# Emerge args:
# g: use binpkgs (needed to find if we have one)
# u: update packages to the latest version (want updates to invalidate
# binpkgs)
# D: deep -- consider full tree rather that just immediate deps
# (changes in dependencies and transitive deps can invalidate a binpkg)
# N: Packages with changed use flags should be considered
# (changes in dependencies and transitive deps can invalidate a binpkg)
# q: quiet (simplifies output)
# p: pretend (don't actually install it)
args = ["-guDNqp", "--with-bdeps=y", "--color=n"]
if board:
args.append("--board=%s" % board)
args.extend("=%s" % best.cpvr for best in bests.values())
generator = depgraph.DepGraphGenerator()
generator.Initialize(args)
results = {}
for atom, best in bests.items():
results[atom] = generator.HasPrebuilt(best.cpvr)
osutils.WriteFile(opts.output, json.dumps(results))