# Copyright 2017 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Allows to use GNU ar as a static linker."""

from starboard.tools.toolchain import abstract
from starboard.tools.toolchain import common


class StaticLinkerBase(object):
  """A base class for GNU ar-based static linkers."""

  def __init__(self, **kwargs):
    self._path = common.GetPath('ar', **kwargs)
    self._extra_flags = kwargs.get('extra_flags', [])

  def GetPath(self):
    return self._path

  def GetExtraFlags(self):
    return self._extra_flags

  def GetMaxConcurrentProcesses(self):
    # Run as much concurrent processes as possible.
    return None

  def GetDescription(self):
    return 'AR $out'

  def GetRspFilePath(self):
    return '$out.rsp'

  def GetRspFileContent(self):
    return '$in_newline'


class StaticLinker(StaticLinkerBase, abstract.StaticLinker):
  """Creates self-contained archives using GNU ar."""

  def __init__(self, **kwargs):
    super(StaticLinker, self).__init__(**kwargs)

  def GetCommand(self, path, extra_flags, flags):
    return '{0} rcs {1} $out @$rspfile'.format(path, extra_flags)


class StaticThinLinker(StaticLinkerBase, abstract.StaticThinLinker):
  """Creates thin archives using GNU ar."""

  def __init__(self, **kwargs):
    super(StaticThinLinker, self).__init__(**kwargs)

  def GetCommand(self, path, extra_flags, flags):
    return '{0} rcsT {1} $out @$rspfile'.format(path, extra_flags)
