build: add Bazel Rust workflow

This commit was merged in pull request #2.
This commit is contained in:
2026-08-31 17:50:12 -04:00
parent ba4fbb984a
commit 97cca46f4e
19 changed files with 2088 additions and 1 deletions

5
bazel/BUILD Normal file
View File

@@ -0,0 +1,5 @@
exports_files([
"rust.BUILD.template",
"rust.bzl",
"utils.bzl",
])

117
bazel/rust.BUILD.template Normal file
View File

@@ -0,0 +1,117 @@
filegroup(
name = "rustc",
srcs = ["toolchain/bin/rustc"],
visibility = ["//visibility:public"],
)
filegroup(
name = "rustdoc",
srcs = ["toolchain/bin/rustdoc"],
visibility = ["//visibility:public"],
)
filegroup(
name = "cargo",
srcs = ["toolchain/bin/cargo"],
visibility = ["//visibility:public"],
)
filegroup(
name = "cargo_clippy",
srcs = ["toolchain/bin/cargo-clippy"],
visibility = ["//visibility:public"],
)
filegroup(
name = "clippy_driver",
srcs = ["toolchain/bin/clippy-driver"],
visibility = ["//visibility:public"],
)
filegroup(
name = "rustfmt",
srcs = ["toolchain/bin/rustfmt"],
visibility = ["//visibility:public"],
)
filegroup(
name = "cc",
srcs = ["toolchain/bin/cc"],
visibility = ["//visibility:public"],
)
filegroup(
name = "rustc_lib",
srcs = glob(
[
"rust/lib/*.so*",
"rust/lib/rustlib/{host_triple}/codegen-backends/*.so",
"rust/lib/rustlib/{host_triple}/lib/*.so*",
"rust/lib/rustlib/{host_triple}/lib/*.rmeta",
],
allow_empty = True,
),
visibility = ["//visibility:public"],
)
filegroup(
name = "rust_objcopy",
srcs = glob(
["rust/lib/rustlib/{host_triple}/bin/rust-objcopy"],
allow_empty = True,
),
visibility = ["//visibility:public"],
)
load("@rules_rust//rust:toolchain.bzl", "rust_stdlib_filegroup")
rust_stdlib_filegroup(
name = "rust_std",
srcs = glob(
[
"rust/lib/rustlib/{host_triple}/lib/*.rlib",
"rust/lib/rustlib/{host_triple}/lib/*.rmeta",
"rust/lib/rustlib/{host_triple}/lib/*.so*",
"rust/lib/rustlib/{host_triple}/lib/*.a",
"rust/lib/rustlib/{host_triple}/lib/self-contained/**",
],
allow_empty = True,
),
visibility = ["//visibility:public"],
)
load("@rules_rust//rust:toolchain.bzl", "rust_toolchain")
rust_toolchain(
name = "toolchain_impl",
rust_doc = ":rustdoc",
rust_std = ":rust_std",
rustc = ":rustc",
linker = ":cc",
linker_type = "indirect",
rust_objcopy = ":rust_objcopy",
rustfmt = ":rustfmt",
cargo = ":cargo",
clippy_driver = ":clippy_driver",
cargo_clippy = ":cargo_clippy",
rustc_lib = ":rustc_lib",
allocator_library = None,
global_allocator_library = None,
binary_ext = "",
staticlib_ext = ".a",
dylib_ext = ".so",
stdlib_linkflags = ["-ldl", "-lpthread"],
default_edition = "2024",
exec_triple = "{host_triple}",
target_triple = "{host_triple}",
version = "{release}",
channel = "stable",
visibility = ["//visibility:public"],
)
toolchain(
name = "rust",
toolchain = ":toolchain_impl",
toolchain_type = "@rules_rust//rust:toolchain_type",
visibility = ["//visibility:public"],
)

51
bazel/rust.bzl Normal file
View File

@@ -0,0 +1,51 @@
load("//bazel:utils.bzl", "execute", "require_env")
def _rust_repository_impl(repository_ctx):
root = repository_ctx.path(require_env(repository_ctx, "RUST_TOOLCHAIN_ROOT"))
rustc = root.get_child("bin/rustc")
sysroot = execute(repository_ctx, [str(rustc), "--print", "sysroot"])
verbose_version = execute(repository_ctx, [str(rustc), "-vV"])
host_triple = None
release = None
for line in verbose_version.splitlines():
if line.startswith("host: "):
host_triple = line.removeprefix("host: ")
if line.startswith("release: "):
release = line.removeprefix("release: ")
if host_triple == None:
fail("rustc -vV did not report a host triple")
if release == None:
fail("rustc -vV did not report a release")
repository_ctx.symlink(root, "toolchain")
repository_ctx.symlink(sysroot, "rust")
repository_ctx.file("WORKSPACE.bazel", "")
repository_ctx.template(
"BUILD.bazel",
Label("//bazel:rust.BUILD.template"),
{
"{host_triple}": host_triple,
"{release}": release,
},
)
rust_repository = repository_rule(
implementation = _rust_repository_impl,
local = True,
environ = ["RUST_TOOLCHAIN_ROOT"],
)
def _rust_impl(module_ctx):
rust_repository(name = "rust")
rust = module_extension(
implementation = _rust_impl,
)

12
bazel/utils.bzl Normal file
View File

@@ -0,0 +1,12 @@
def require_env(repository_ctx, variable):
value = repository_ctx.os.environ.get(variable)
if not value:
fail("{} must be set.".format(variable))
return value
def execute(repository_ctx, arguments):
result = repository_ctx.execute(arguments)
if result.return_code != 0:
fail("command failed: {}\n{}".format(" ".join(arguments), result.stderr))
return result.stdout.strip()