blob: 810d34af8c182ca1ae3f90aba5c4b997e0312e93 [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Script for calculating compatible binhosts.
Generates a file that sets the specified board's binhosts to include all of the
other compatible boards in this buildroot.
"""
import collections
import glob
import optparse
import os
import sys
from chromite.buildbot import cbuildbot_config
from chromite.lib import cros_build_lib
def FindCandidateBoards():
"""Find candidate local boards to grab prebuilts from."""
portageq_prefix = "/usr/local/bin/portageq-"
for path in sorted(glob.glob("%s*" % portageq_prefix)):
# Strip off the portageq prefix, leaving only the board.
yield path.replace(portageq_prefix, "")
def SummarizeCompatibility(board):
"""Returns a string that will be the same for compatible boards."""
cmd = ["portageq-%s" % board, "envvar", "ARCH", "CFLAGS"]
return cros_build_lib.RunCommand(cmd, redirect_stdout=True,
print_cmd=False).output.rstrip()
def GenerateBinhostLine(build_root, compatible_boards):
"""Generate a binhost line pulling binaries from the specified boards."""
local_binhosts = " ".join([
"file://localhost" + os.path.join(build_root, x, "packages")
for x in sorted(compatible_boards)])
return "LOCAL_BINHOST='%s'" % local_binhosts
def main(argv):
parser = optparse.OptionParser(usage="USAGE: ./%prog --board=board [options]")
parser.add_option("--build_root", default="/build",
dest="build_root",
help="Location of boards (normally /build)")
parser.add_option("--board", default=None,
dest="board",
help="Board name (required).")
flags, remaining_arguments = parser.parse_args(argv)
if remaining_arguments or not flags.board:
parser.print_help()
sys.exit(1)
by_compatibility = collections.defaultdict(set)
compatible_boards = None
for other_board in FindCandidateBoards():
compat_id = SummarizeCompatibility(other_board)
if other_board == flags.board:
compatible_boards = by_compatibility[compat_id]
else:
by_compatibility[compat_id].add(other_board)
if compatible_boards is None:
print >> sys.stderr, "Missing portageq wrapper for %s" % flags.board
sys.exit(1)
# If a non-generic prebuilt is available, ignore the generic ones,
# since the non-generic ones will be better matches.
compatible_specific_boards = \
compatible_boards - set(cbuildbot_config.generic_boards)
if compatible_specific_boards:
compatible_boards = compatible_specific_boards
print "# Generated by cros_generate_local_binhosts."
print GenerateBinhostLine(flags.build_root, compatible_boards)