
# Copyright 2023 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# buildifier: disable=load-on-top
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
# Set up bazel skylib and its dependencies
http_archive(
    name = "bazel_skylib",
    sha256 = "f7be3474d42aae265405a592bb7da8e171919d74c16f082a5457840f06054728",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz",
    ],
)
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")

bazel_skylib_workspace()

# The fuchsia_infra repository provides rules which allow us to work inside of
# fuchsia's infrastructure.
local_repository(
    name = "fuchsia_infra",
    path = "fuchsia-build/third_party/fuchsia-infra-bazel-rules",
)

load("@fuchsia_infra//:workspace.bzl", "fuchsia_infra_workspace")
load("@fuchsia_infra//cipd:defs.bzl", "cipd_repository")
load("@fuchsia_infra//shac:shac.bzl", "shac_deps")

fuchsia_infra_workspace()

shac_deps()

# Fetch the Fuchsia SDK and register it as a repostiory. The version that is
# used is stored in the manifests/bazel_sdk.ensure file so it can be updated by
# our autoroller infrastructure. When the version changes bazel will fetch the
# new prebuilts.
cipd_repository(
    name = "fuchsia_sdk",
    ensure_file = "//fuchsia-build/manifests:bazel_sdk.ensure",
)

# The fuchsia toolchain contains tools like ffx and fidlc.
register_toolchains("@fuchsia_sdk//:fuchsia_toolchain_sdk")

load(
    "@fuchsia_sdk//fuchsia:products.bzl",
    "fuchsia_products_repository",
)

fuchsia_products_repository(
    name = "fuchsia_products",
    cipd_bin = "@cipd_tool//:cipd",
    ensure_file = "//fuchsia-build/manifests:product_bundles.ensure",
)

load(
    "@fuchsia_sdk//fuchsia:clang.bzl",
    "fuchsia_clang_repository",
)

# Set up our clang repository.
fuchsia_clang_repository(
    name = "fuchsia_clang",
    cipd_bin = "@cipd_tool//:cipd",
    cipd_ensure_file = "//fuchsia-build/manifests:clang.ensure",
)

load("@fuchsia_clang//:defs.bzl", "register_clang_toolchains")

# Register a clang toolchain which will be used to compile fuchsia targets
register_clang_toolchains()

load("@fuchsia_infra//infra:host_toolchains.bzl", "configure_fuchsia_clang_host_toolchain")

local_repository(
    name = "rules_fuchsia",
    path = "@@fuchsia_sdk/fuchsia_bazel_rules",
)

# Configure a host toolchain for local execution. This is not used to compile
# fuchsia targets but is made available so we don't try to access the host gcc
# which is not available in infrastructure builds. This call must happen after
# you create a fuchsia_clang repository.
configure_fuchsia_clang_host_toolchain(name = "host_clang_toolchain")
# gTest.
local_repository(
    name = "com_google_googletest",
    path = "third_party/googletest",
)
local_repository(
    name = "zlib",
    path = "fuchsia-build/third_party/zlib-1.3.1",
)
