# Part of the Crubit project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

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

# TODO: this is an ancient version; refresh and also wire up in MODULE.bazel
http_archive(
    name = "rules_rust",
    patch_args = [
        "-p1",
    ],
    patches = [
        "@@//bazel/rules_rust:attach_rust_bindings_from_cc_aspect.patch",
    ],
    sha256 = "4a9cb4fda6ccd5b5ec393b2e944822a62e050c7c06f1ea41607f14c4fdec57a2",
    urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.25.1/rules_rust-v0.25.1.tar.gz"],
)

load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains")

rules_rust_dependencies()

RUST_TOOLCHAIN_VERSION = "nightly/2025-06-02"

rust_register_toolchains(
    allocator_library = "@//common:rust_allocator_shims",
    dev_components = True,
    edition = "2021",
    versions = [
        RUST_TOOLCHAIN_VERSION,
    ],
)

load("@rules_rust//crate_universe:repositories.bzl", "crate_universe_dependencies")

crate_universe_dependencies()

load("@rules_rust//crate_universe:defs.bzl", "crate", "crates_repository", "render_config")

# after changing `packages`, re-generate Cargo.Bazel.lock:
#   CARGO_BAZEL_REPIN=1 bazelisk sync --only=crate_index
crates_repository(
    name = "crate_index",
    cargo_lockfile = "//:Cargo.Bazel.lock",
    packages = {
        "anyhow": crate.spec(
            version = ">0.0.0",
        ),
        "clap": crate.spec(
            features = [
                "derive",
                "color",
                "derive",
                "env",
                "std",
                "string",
                "suggestions",
            ],
            version = ">=4.3.12",
        ),
        "cxx": crate.spec(
            version = ">1.0.0",
        ),
        "either": crate.spec(
            version = ">1.0.0",
        ),
        "flagset": crate.spec(
            version = ">=0.4.7",
        ),
        "googletest": crate.spec(
            version = ">0.0.0",
        ),
        "heck": crate.spec(
            version = "=0.5",
        ),
        "itertools": crate.spec(
            version = ">0.0.0",
        ),
        "maplit": crate.spec(
            version = ">0.0.0",
        ),
        "phf": crate.spec(
            version = "=0.11",
            features = ["macros"],
        ),
        "pin-project": crate.spec(
            version = ">0.0.0",
        ),
        "proc-macro2": crate.spec(
            version = ">0.0.0",
        ),
        "quote": crate.spec(
            version = ">0.0.0",
        ),
        "regex": crate.spec(
            version = ">=1.6.0",
        ),
        "rustversion": crate.spec(
            version = ">1.0.20",
        ),
        "salsa": crate.spec(
            version = ">0.0.0",
        ),
        "serde": crate.spec(
            features = [
                "derive",
                "rc",
            ],
            version = ">0.0.0",
        ),
        "serde_json": crate.spec(
            version = ">0.0.0",
        ),
        "static_assertions": crate.spec(
            version = ">0.0.0",
        ),
        "syn": crate.spec(
            features = ["extra-traits"],
            version = ">0.0.0",
        ),
        "tempfile": crate.spec(
            version = "=3.4.0",
        ),
        "unicode-ident": crate.spec(
            version = ">0.0.0",
        ),
    },
    render_config = render_config(
        default_package_name = "",
    ),
    rust_version = RUST_TOOLCHAIN_VERSION,
)

load("@crate_index//:defs.bzl", "crate_repositories")

crate_repositories()

# zstd is a dependency of llvm.  See https://reviews.llvm.org/D143344#4232172
http_archive(
    name = "llvm_zstd",
    build_file = "@llvm-raw//utils/bazel/third_party_build:zstd.BUILD",
    sha256 = "7c42d56fac126929a6a85dbc73ff1db2411d04f104fae9bdea51305663a83fd0",
    strip_prefix = "zstd-1.5.2",
    urls = [
        "https://github.com/facebook/zstd/releases/download/v1.5.2/zstd-1.5.2.tar.gz",
    ],
)

# @llvm-project//llvm:Support needs zlib.
http_archive(
    name = "llvm_zlib",
    build_file = "@llvm-raw//utils/bazel/third_party_build:zlib-ng.BUILD",
    sha256 = "e36bb346c00472a1f9ff2a0a4643e590a254be6379da7cddd9daeb9a7f296731",
    strip_prefix = "zlib-ng-2.0.7",
    urls = [
        "https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.0.7.zip",
    ],
)

# Create the "loader" repository, then use it to configure the desired LLVM
# repository. For more details, see the comment in bazel/llvm.bzl.

load("//bazel:llvm.bzl", "llvm_loader_repository", "llvm_loader_repository_dependencies")

llvm_loader_repository_dependencies()

llvm_loader_repository(name = "llvm-loader")

load("@llvm-loader//:llvm.bzl", "llvm_repository")

llvm_repository(name = "llvm-project")
