# 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

load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")

"""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_cc_library(includes = [], system_includes = [], **kwargs):
    """Base function for all cc_library targets.

    This is a pass-through to the native cc_library, which integrators can
    customize with additional flags as needed. Prefer to use the compiler
    and runtime versions instead.

    Note that Bazel does not distinguish between includes and system_includes,
    but CMake does. So we allow them to be separate and glom them together
    here.
    """
    cc_library(
        includes = includes + system_includes,
        **kwargs
    )

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.
    """
    iree_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.
    """
    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.
    """
    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.
    """
    iree_cc_library(
        deps = deps + [
            # TODO: Rename to //runtime/src:defs to match compiler.
            "//runtime/src:runtime_defines",
        ],
        **kwargs
    )

def iree_runtime_cc_test(deps = [], group = None, **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.
    """
    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.
    """
    cc_binary(
        deps = deps + [
            # TODO: Rename to //runtime/src:defs to match compiler.
            "//runtime/src:runtime_defines",
        ],
        **kwargs
    )

def iree_tablegen_doc(category, 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)
