# Copyright 2012-2023 The Meson development team

# 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

#     https://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.

# Core public classes for linkers.
from __future__ import annotations

import enum
import typing as T

if T.TYPE_CHECKING:
    from ..environment import Environment


@enum.unique
class RSPFileSyntax(enum.Enum):

    """Which RSP file syntax the compiler supports."""

    MSVC = enum.auto()
    GCC = enum.auto()


class ArLikeLinker:
    # POSIX requires supporting the dash, GNU permits omitting it
    std_args = ['-csr']

    def can_linker_accept_rsp(self) -> bool:
        # armar / AIX can't accept arguments using the @rsp syntax
        # in fact, only the 'ar' id can
        return False

    def get_std_link_args(self, env: 'Environment', is_thin: bool) -> T.List[str]:
        return self.std_args

    def get_output_args(self, target: str) -> T.List[str]:
        return [target]

    def rsp_file_syntax(self) -> RSPFileSyntax:
        return RSPFileSyntax.GCC
