Skip to content

Commit

Permalink
Support repository_set from bzlmod
Browse files Browse the repository at this point in the history
  • Loading branch information
illicitonion committed Dec 15, 2024
1 parent bbbf343 commit 1214f3a
Show file tree
Hide file tree
Showing 4 changed files with 226 additions and 141 deletions.
136 changes: 130 additions & 6 deletions examples/musl_cross_compiling/MODULE.bazel
Original file line number Diff line number Diff line change
@@ -1,6 +1,130 @@
###############################################################################
# Bazel now uses Bzlmod by default to manage external dependencies.
# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel.
#
# For more details, please check https://github.com/bazelbuild/bazel/issues/18958
###############################################################################
module(
name = "musl_cross_compiling_example",
version = "0.0.0",
)

bazel_dep(
name = "rules_rust",
version = "0.0.0",
)
local_path_override(
module_name = "rules_rust",
path = "../..",
)

bazel_dep(
name = "platforms",
version = "0.0.10",
)
bazel_dep(
name = "rules_shell",
version = "0.3.0",
)

RUST_EDITION = "2021"

RUST_VERSION = "1.80.0"

rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
rust.toolchain(
edition = RUST_EDITION,
versions = [RUST_VERSION],
)

# This overrides a default rust_repository_set created by rust_register_toolchain.
# It must be named exactly this.
# Each exec triple needs one of these calls per target triple it supports.
# The first call needs all of the attrs, the subsequent calls should only set name, target_triple, and target_compatible_with.
rust.repository_set(
name = "rust_linux_x86_64",
edition = RUST_EDITION,
exec_triple = "x86_64-unknown-linux-gnu",
target_compatible_with = [
"@//linker_config:unknown",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
target_triple = "x86_64-unknown-linux-gnu",
versions = [RUST_VERSION],
)
rust.repository_set(
name = "rust_linux_x86_64",
target_compatible_with = [
"@//linker_config:musl",
"@platforms//cpu:arm64",
"@platforms//os:linux",
],
target_triple = "aarch64-unknown-linux-musl",
)
rust.repository_set(
name = "rust_linux_x86_64",
target_compatible_with = [
"@//linker_config:musl",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
target_triple = "x86_64-unknown-linux-musl",
)

# We don't need to register a repository_set for exec_triple == target_triple if we're not customising it in any way:
# one will get registered by default.
# But we do for the Linux case above, because we want to add the "@//linker_config:unknown" constraint in that case.
rust.repository_set(
name = "rust_darwin_x86_64",
edition = RUST_EDITION,
exec_triple = "x86_64-apple-darwin",
target_compatible_with = [
"@//linker_config:musl",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
target_triple = "x86_64-unknown-linux-musl",
versions = [RUST_VERSION],
)
rust.repository_set(
name = "rust_darwin_x86_64",
target_compatible_with = [
"@//linker_config:musl",
"@platforms//cpu:arm64",
"@platforms//os:linux",
],
target_triple = "aarch64-unknown-linux-musl",
)
rust.repository_set(
name = "rust_darwin_aarch64",
edition = RUST_EDITION,
exec_triple = "aarch64-apple-darwin",
target_compatible_with = [
"@//linker_config:musl",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
target_triple = "x86_64-unknown-linux-musl",
versions = [RUST_VERSION],
)
rust.repository_set(
name = "rust_darwin_aarch64",
target_compatible_with = [
"@//linker_config:musl",
"@platforms//cpu:arm64",
"@platforms//os:linux",
],
target_triple = "aarch64-unknown-linux-musl",
)
use_repo(rust, "rust_toolchains")

register_toolchains("@rust_toolchains//:all")

crate = use_extension(
"@rules_rust//crate_universe:extensions.bzl",
"crate",
)
crate.from_cargo(
name = "cu",
cargo_lockfile = "//:Cargo.Bazel.lock",
manifests = [
"//:Cargo.toml",
"//:local_proc_macro/Cargo.toml",
],
)
use_repo(crate, "cu")
127 changes: 0 additions & 127 deletions examples/musl_cross_compiling/WORKSPACE.bazel
Original file line number Diff line number Diff line change
@@ -1,107 +1,3 @@
local_repository(
name = "rules_rust",
path = "../..",
)

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

rules_rust_dependencies()

EDITION = "2021"

# Before 1.80.0, proc macros couldn't be used when exec!=target where exec and target platforms use different shared library extension (i.e. so vs dylib) because of an error in rustc's handling of extensions.
RUST_VERSION = "1.80.0"

rust_repository_set(
name = "darwin_x86_64_to_x86_64_musl_tuple",
edition = EDITION,
exec_triple = "x86_64-apple-darwin",
# Setting this extra_target_triples allows differentiating the musl case from the non-musl case, in case multiple linux-targeting toolchains are registered.
extra_target_triples = {
"x86_64-unknown-linux-musl": [
"@//linker_config:musl",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
},
versions = [RUST_VERSION],
)

rust_repository_set(
name = "darwin_arm64_to_x86_64_musl_tuple",
edition = EDITION,
exec_triple = "aarch64-apple-darwin",
extra_target_triples = {
"x86_64-unknown-linux-musl": [
"@//linker_config:musl",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
},
versions = [RUST_VERSION],
)

rust_repository_set(
name = "darwin_x86_64_to_arm64_musl_tuple",
edition = EDITION,
exec_triple = "x86_64-apple-darwin",
# Setting this extra_target_triples allows differentiating the musl case from the non-musl case, in case multiple linux-targeting toolchains are registered.
extra_target_triples = {
"aarch64-unknown-linux-musl": [
"@//linker_config:musl",
"@platforms//cpu:arm64",
"@platforms//os:linux",
],
},
versions = [RUST_VERSION],
)

rust_repository_set(
name = "darwin_arm64_to_arm64_musl_tuple",
edition = EDITION,
exec_triple = "aarch64-apple-darwin",
extra_target_triples = {
"aarch64-unknown-linux-musl": [
"@//linker_config:musl",
"@platforms//cpu:arm64",
"@platforms//os:linux",
],
},
versions = [RUST_VERSION],
)

# This overrides a default rust_repository_set created by rust_register_toolchain.
# It must be named exactly this, and must be called before rust_register_toolchain is.
rust_repository_set(
name = "rust_linux_x86_64",
edition = EDITION,
exec_triple = "x86_64-unknown-linux-gnu",
# Setting this extra_target_triples allows differentiating the musl case from the non-musl case, in case multiple linux-targeting toolchains are registered.
extra_target_triples = {
"aarch64-unknown-linux-musl": [
"@//linker_config:musl",
"@platforms//cpu:arm64",
"@platforms//os:linux",
],
"x86_64-unknown-linux-gnu": [
"@//linker_config:unknown",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
"x86_64-unknown-linux-musl": [
"@//linker_config:musl",
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
},
versions = [RUST_VERSION],
)

rust_register_toolchains(
edition = EDITION,
versions = [RUST_VERSION],
)

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

http_archive(
Expand All @@ -118,26 +14,3 @@ load_musl_toolchains(extra_target_compatible_with = ["@//linker_config:musl"])
load("@musl_toolchains//:toolchains.bzl", "register_musl_toolchains")

register_musl_toolchains()

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

crate_universe_dependencies(bootstrap = True)

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

crates_repository(
name = "cu",
cargo_lockfile = "//:Cargo.Bazel.lock",
# `generator` is not necessary in official releases.
# See load statement for `cargo_bazel_bootstrap`.
generator = "@cargo_bazel_bootstrap//:cargo-bazel",
lockfile = "//:Cargo.Bazel.lock.json",
manifests = [
"//:Cargo.toml",
"//:local_proc_macro/Cargo.toml",
],
)

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

crate_repositories()
62 changes: 61 additions & 1 deletion rust/extensions.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

load("@bazel_features//:features.bzl", "bazel_features")
load("//rust:defs.bzl", "rust_common")
load("//rust:repositories.bzl", "rust_register_toolchains", "rust_toolchain_tools_repository")
load("//rust:repositories.bzl", "DEFAULT_TOOLCHAIN_TRIPLES", "rust_register_toolchains", "rust_repository_set", "rust_toolchain_tools_repository")
load("//rust/platform:triple.bzl", "get_host_triple")
load(
"//rust/private:repository_utils.bzl",
Expand Down Expand Up @@ -48,6 +48,45 @@ def _rust_impl(module_ctx):
# See https://github.com/bazelbuild/bazel/discussions/22024 for discussion.
root, rules_rust = _find_modules(module_ctx)

toolchain_triples = dict(DEFAULT_TOOLCHAIN_TRIPLES)

repository_sets = root.tags.repository_set

grouped_repository_sets = {}
for repository_set in repository_sets:
if repository_set.name not in grouped_repository_sets:
grouped_repository_sets[repository_set.name] = {
"allocator_library": repository_set.allocator_library,
"dev_components": repository_set.dev_components,
"edition": repository_set.edition,
"exec_triple": repository_set.exec_triple,
"extra_target_triples": {repository_set.target_triple: [str(v) for v in repository_set.target_compatible_with]},
"name": repository_set.name,
"rustfmt_version": repository_set.rustfmt_version,
"sha256s": repository_set.sha256s,
"urls": repository_set.urls,
"versions": repository_set.versions,
}
else:
for attr_name in _RUST_REPOSITORY_SET_TAG_ATTRS.keys():
if attr_name in ["extra_target_triples", "name", "target_compatible_with", "target_triple"]:
continue
attr_value = getattr(repository_set, attr_name, None)
if attr_value and attr_value != grouped_repository_sets[repository_set.name][attr_name]:
fail("You must only set {} on the first call to repository_set for a particular name but it was set multiple times for {}".format(attr_name, repository_set.name))
grouped_repository_sets[repository_set.name]["extra_target_triples"][repository_set.target_triple] = [str(v) for v in repository_set.target_compatible_with]

extra_toolchain_infos = {}

for repository_set in grouped_repository_sets.values():
toolchain_infos = rust_repository_set(
register_toolchain = False,
**repository_set
)
extra_toolchain_infos.update(**toolchain_infos)
if toolchain_triples.get(repository_set["exec_triple"]) == repository_set["name"]:
toolchain_triples.pop(repository_set["exec_triple"], None)

toolchains = root.tags.toolchain or rules_rust.tags.toolchain

for toolchain in toolchains:
Expand Down Expand Up @@ -77,6 +116,8 @@ def _rust_impl(module_ctx):
versions = toolchain.versions,
register_toolchains = False,
aliases = toolchain.aliases,
toolchain_triples = toolchain_triples,
extra_toolchain_infos = extra_toolchain_infos,
)
metadata_kwargs = {}
if bazel_features.external_deps.extension_metadata_has_reproducible:
Expand Down Expand Up @@ -111,6 +152,24 @@ _COMMON_TAG_KWARGS = {
),
}

_RUST_REPOSITORY_SET_TAG_ATTRS = {
"exec_triple": attr.string(doc = "Exec triple for this repository_set."),
"name": attr.string(doc = "Name of the repository_set - if you're looking to replace default toolchains you must use the exact name you're replacing."),
"target_compatible_with": attr.label_list(doc = "List of platform constraints this toolchain produces, for the particular target_triple this call is for."),
"target_triple": attr.string(doc = "target_triple to configure."),
"versions": attr.string_list(
doc = (
"A list of toolchain versions to download. This parameter only accepts one version " +
"per channel. E.g. `[\"1.65.0\", \"nightly/2022-11-02\", \"beta/2020-12-30\"]`. " +
"May be set to an empty list (`[]`) to inhibit `rules_rust` from registering toolchains."
),
),
} | _COMMON_TAG_KWARGS

_RUST_REPOSITORY_SET_TAG = tag_class(
attrs = _RUST_REPOSITORY_SET_TAG_ATTRS,
)

_RUST_TOOLCHAIN_TAG = tag_class(
attrs = {
"aliases": attr.string_dict(
Expand Down Expand Up @@ -161,6 +220,7 @@ rust = module_extension(
doc = "Rust toolchain extension.",
implementation = _rust_impl,
tag_classes = {
"repository_set": _RUST_REPOSITORY_SET_TAG,
"toolchain": _RUST_TOOLCHAIN_TAG,
},
)
Expand Down
Loading

0 comments on commit 1214f3a

Please sign in to comment.