# Copyright 2021 Google LLC
#
# 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.
"""Configures a separate workspace for IREE's TF integrations.

This is siloed to limit TF complexity from leaking into the main project. It
adds the core IREE project and its submodules as repo aliases based on relative
directory paths."""

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")

IREE_PATH = "../.."

#################################### Skylib ####################################
http_archive(
    name = "bazel_skylib",
    sha256 = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
    ],
)

load("@bazel_skylib//lib:paths.bzl", "paths")
################################################################################

################################## TensorFlow ##################################
maybe(
    local_repository,
    name = "org_tensorflow",
    path = paths.join(IREE_PATH, "third_party/tensorflow"),
)

# Import all of the tensorflow dependencies. Note that we are deliberately
# letting TensorFlow take control of all the dependencies it sets up, whereas
# ours are initialized with `maybe`. Actually tracking this with Bazel is PITA
# and for now this gets TF stuff building. This includes, for instance,
# @llvm-project and @com_google_absl.
load("@org_tensorflow//tensorflow:workspace3.bzl", "tf_workspace3")

tf_workspace3()

load("@org_tensorflow//tensorflow:workspace2.bzl", "tf_workspace2")

tf_workspace2()

load("@org_tensorflow//tensorflow:workspace1.bzl", "tf_workspace1")

tf_workspace1()

load("@org_tensorflow//tensorflow:workspace0.bzl", "tf_workspace0")

tf_workspace0()
################################################################################

##################################### IREE #####################################
# We need a shim here to make this use the version of mlir-hlo present in
# TensorFlow. This shim is just alias rules that forward to the TF rule. Note
# that because configure_iree_submodule_deps uses `maybe` and we define this
# first we will use this definition instead of the one there.
maybe(
    local_repository,
    name = "mlir-hlo",
    path = "build_tools/overlay/mlir-hlo",
)

maybe(
    local_repository,
    name = "iree",
    path = IREE_PATH,
)

load("@iree//build_tools/bazel:workspace.bzl", "configure_iree_submodule_deps")

configure_iree_submodule_deps(
    iree_path = IREE_PATH,
    iree_repo_alias = "@iree",
)
################################################################################
