# -*- coding: utf-8 -*-
# Copyright 2018 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.

"""Installs cross toolchain libraries into a sysroot.

This script is not meant to be used by developers directly.
Run at your own risk.
"""

from __future__ import print_function

from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import sysroot_lib
from chromite.lib import toolchain


def GetParser():
  """Build the argument parser."""
  parser = commandline.ArgumentParser(description=__doc__)

  parser.add_argument('--noconfigure', dest='configure', default=True,
                      action='store_false',
                      help='Disable updating config files in <sysroot>/etc '
                           'after installation.')
  parser.add_argument('--force', default=False, action='store_true',
                      help='Install toolchain even if already up to date.')
  parser.add_argument('--toolchain',
                      help='Toolchain. For example: i686-pc-linux-gnu, '
                           'armv7a-softfloat-linux-gnueabi.')
  parser.add_argument('--sysroot', type='path', required=True,
                      help='The sysroot to install the toolchain for.')

  return parser


def _GetToolchain(toolchain_name, sysroot):
  """Get the toolchain value or exit with an error message."""
  if toolchain_name:
    # Use the CLI argument when provided.
    return toolchain_name

  # Fetch the value from the sysroot.
  toolchain_name = sysroot.GetStandardField(sysroot_lib.STANDARD_FIELD_CHOST)
  if not toolchain_name:
    cros_build_lib.Die('No toolchain specified in the sysroot or command line.')

  return toolchain_name


def _ParseArgs(argv):
  """Parse and validate arguments."""
  parser = GetParser()
  opts = parser.parse_args(argv)

  # Expand the sysroot path to a sysroot object.
  opts.sysroot = sysroot_lib.Sysroot(opts.sysroot)
  # Make sure the toolchain value reflects the toolchain we will be using.
  opts.toolchain = _GetToolchain(opts.toolchain, opts.sysroot)

  opts.Freeze()
  return opts


def main(argv):
  cros_build_lib.AssertInsideChroot()

  opts = _ParseArgs(argv)
  try:
    toolchain.InstallToolchain(sysroot=opts.sysroot,
                               toolchain=opts.toolchain,
                               force=opts.force, configure=opts.configure)
  except (toolchain.Error, cros_build_lib.RunCommandError, ValueError) as e:
    cros_build_lib.Die(e.message)
