# Copyright 2020 The Bazel Authors. 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.

"""Semantics for Bazel Objc rules"""

load("//cc/common:cc_common.bzl", "cc_common")

def _check_toolchain_supports_objc_compile(ctx, cc_toolchain, requested_features = None, unsupported_features = None):
    if requested_features == None:
        requested_features = ctx.features
    if unsupported_features == None:
        unsupported_features = ctx.disabled_features
    feature_configuration = cc_common.configure_features(
        ctx = ctx,
        cc_toolchain = cc_toolchain,
        language = "objc",
        requested_features = requested_features,
        unsupported_features = unsupported_features,
    )

    if not cc_common.action_is_enabled(
        feature_configuration = feature_configuration,
        action_name = "objc-compile",
    ):
        fail("Compiling objc_library targets requires the Apple CC toolchain " +
             "which can be found here: https://github.com/bazelbuild/apple_support#toolchain-setup")

def _get_apple_vendor_attr():
    # TODO(b/528985527): Change to the apple vendor platform constraint if safe.
    return {}

def _get_licenses_attr():
    # TODO(b/182226065): Change to applicable_licenses
    return {}

def _get_repo():
    return "bazel_tools"

semantics = struct(
    check_toolchain_supports_objc_compile = _check_toolchain_supports_objc_compile,
    get_apple_vendor_attr = _get_apple_vendor_attr,
    get_repo = _get_repo,
    get_licenses_attr = _get_licenses_attr,
    apple_crosstool_transition = None,
    is_enable_modules_attr_allowed = True,
    is_module_map_attr_allowed = True,
    is_module_name_attr_allowed = True,
)
