# Copyright 2018 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.

from starboard.tools.toolchain import abstract
from starboard.tools.toolchain import clangxx


class SharedLibraryLinker(clangxx.DynamicLinkerBase,
                          abstract.SharedLibraryLinker):
  """Links shared libraries using the LLVM Project's lld."""

  def __init__(self, **kwargs):  # pylint: disable=useless-super-delegation
    super(SharedLibraryLinker, self).__init__(**kwargs)

  def GetCommand(self, path, extra_flags, flags, shell):
    lld_path = '{0}/bin/ld.lld'.format(self.GetPath())

    return shell.And('{0} '
                     '--build-id '
                     '-X '
                     '-v '
                     '--eh-frame-hdr '
                     '--fini=__cxa_finalize '
                     '{2} '
                     '-shared '
                     '-o $out '
                     '-L{1} '
                     '-L/usr/lib '
                     '-L/lib '
                     '-soname=$soname '
                     '-nostdlib '
                     '--whole-archive '
                     '--no-whole-archive '
                     '@$rspfile'.format(lld_path, self.GetPath(), *extra_flags))
