# Copyright 2019 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

"""Common Bazel definitions for IREE."""

load("@llvm-project//mlir:tblgen.bzl", "gentbl_cc_library", "gentbl_filegroup", "td_library")

def defaulting_select(selector):
    """Pass through to select() with special semantics when converting to CMake.

    Args:
        selector: The selector which is passed through to select(). Must
          include a "//conditions:default" branch, which is used by tooling
          outside of Bazel when converting to other build systems.
    """
    if "//conditions:default" not in selector:
        fail("defaulting_select requires a //conditions:default branch")
    return select(selector)

def platform_trampoline_deps(basename, path = "runtime/src/iree/base"):
    """Produce a list of deps for the given `basename` platform target.

    Example:
      "file_mapping" -> ["//iree/base/internal/file_mapping_internal"]

    This is used for compatibility with various methods of including the
    library in foreign source control systems.

    Args:
      basename: Library name prefix for a library in [path]/internal.
      path: Folder name to work within.
    Returns:
      A list of dependencies for depending on the library in a platform
      sensitive way.
    """
    return [
        "//%s/internal:%s_internal" % (path, basename),
    ]

def iree_build_test(name, targets):
    """Dummy rule to ensure that targets build.

    This is currently undefined in bazel and is preserved for compatibility.
    """
    pass

def iree_cmake_extra_content(content = "", inline = False):
    """Tool for inserting arbitrary content during Bazel->CMake conversion.

    This does nothing in Bazel, while the contents are inserted as-is in
    converted CMakeLists.txt files.

    Args:
      content: The text to insert into the converted file.
      inline: If true, the content will be inserted inline. Otherwise, it will
        be inserted near the top of the converted file.
    """
    pass

def iree_compiler_cc_library(deps = [], **kwargs):
    """Used for cc_library targets within the //compiler tree.

    This is a pass-through to the native cc_library which adds specific
    compiler specific options and deps.
    """
    native.cc_library(
        deps = deps + [
            "//compiler/src:defs",
        ],
        **kwargs
    )

def iree_compiler_register_plugin(plugin_id, target):
    """Mirror of the CMake iree_compiler_register_plugin function.

    Does nothing in bazel currently.
    """
    pass

def iree_compiler_cc_test(deps = [], **kwargs):
    """Used for cc_test targets within the //compiler tree.

    This is a pass-through to the native cc_test which adds specific
    runtime specific options and deps.
    """
    native.cc_test(
        deps = deps + [
            "//compiler/src:defs",
        ],
        **kwargs
    )

def iree_compiler_cc_binary(deps = [], **kwargs):
    """Used for cc_binary targets within the //compiler tree.

    This is a pass-through to the native cc_binary which adds specific
    runtime specific options and deps.
    """
    native.cc_binary(
        deps = deps + [
            "//compiler/src:defs",
        ],
        **kwargs
    )

def iree_runtime_cc_library(deps = [], **kwargs):
    """Used for cc_library targets within the //runtime tree.

    This is a pass-through to the native cc_library which adds specific
    runtime specific options and deps.
    """
    native.cc_library(
        deps = deps + [
            # TODO: Rename to //runtime/src:defs to match compiler.
            "//runtime/src:runtime_defines",
        ],
        **kwargs
    )

def iree_runtime_cc_test(deps = [], **kwargs):
    """Used for cc_test targets within the //runtime tree.

    This is a pass-through to the native cc_test which adds specific
    runtime specific options and deps.
    """
    native.cc_test(
        deps = deps + [
            # TODO: Rename to //runtime/src:defs to match compiler.
            "//runtime/src:runtime_defines",
        ],
        **kwargs
    )

def iree_runtime_cc_binary(deps = [], **kwargs):
    """Used for cc_binary targets within the //runtime tree.

    This is a pass-through to the native cc_binary which adds specific
    runtime specific options and deps.
    """
    native.cc_binary(
        deps = deps + [
            # TODO: Rename to //runtime/src:defs to match compiler.
            "//runtime/src:runtime_defines",
        ],
        **kwargs
    )

def iree_tablegen_doc(includes = [], **kwargs):
    """iree_tablegen_doc() generates documentation from a table definition file.

    This is a simple wrapper over gentbl() so we can differentiate between
    documentation and others. See gentbl() for details regarding arguments.
    """

    gentbl_filegroup(includes = includes + [
        "/compiler/src",
    ], **kwargs)

def iree_gentbl_cc_library(includes = [], **kwargs):
    """IREE version of gentbl_cc_library which sets up includes properly."""

    gentbl_cc_library(includes = includes + [
        "/compiler/src",
    ], **kwargs)

def iree_td_library(includes = [], **kwargs):
    """IREE version of td_library."""

    td_library(includes = includes + [
        "/compiler/src",
    ], **kwargs)
