From 3803401dd6df2d3ca09b321258805ec581425f90 Mon Sep 17 00:00:00 2001 From: James Leitch Date: Fri, 15 Dec 2023 09:13:47 -0800 Subject: [PATCH] `cargo-bazel` now supports `alias_rule` to customize the aliases generated (#2312) Motivator is to be able to set `default_alias_rule = "opt"` so that all Cargo fetched 3rd party dependencies are built with `compilation_mode=opt` regardless of what `compilation_mode` the local code is being built with. --- .../3rdparty/crates/alias_rules.bzl | 43 + crate_universe/private/common_utils.bzl | 30 + crate_universe/private/crate.bzl | 6 + crate_universe/private/generate_utils.bzl | 8 +- crate_universe/src/config.rs | 46 + crate_universe/src/context/crate_context.rs | 12 +- crate_universe/src/lockfile.rs | 8 +- crate_universe/src/rendering.rs | 39 +- .../src/rendering/verbatim/alias_rules.bzl | 43 + crate_universe/src/utils/starlark.rs | 56 +- .../utils/starlark/target_compatible_with.rs | 10 +- docs/crate_universe.md | 20 +- examples/crate_universe/WORKSPACE.bazel | 209 ++- .../crate_universe/alias_rule/BUILD.bazel | 43 + .../alias_rule/Cargo.Bazel.lock | 16 + .../crate_universe/alias_rule/alias_rules.bzl | 8 + ...zel-lock_global_alias_annotation_none.json | 200 +++ ...azel-lock_global_alias_annotation_opt.json | 201 +++ ...el-lock_global_custom_annotation_none.json | 200 +++ ...-lock_global_dbg_annotation_fastbuild.json | 201 +++ ...azel-lock_global_opt_annotation_alias.json | 201 +++ ...-bazel-lock_global_opt_annotation_dbg.json | 201 +++ ...bazel-lock_global_opt_annotation_none.json | 200 +++ examples/crate_universe/alias_rule/src/dbg.rs | 9 + .../alias_rule/src/fastbuild.rs | 9 + examples/crate_universe/alias_rule/src/opt.rs | 9 + .../cargo_aliases/cargo-bazel-lock.json | 2 +- .../cargo-bazel-lock.json | 2 +- .../cargo_workspace/cargo-bazel-lock.json | 2 +- .../multi_package/cargo-bazel-lock.json | 2 +- .../no_cargo_manifests/cargo-bazel-lock.json | 2 +- .../using_cxx/cargo-bazel-lock.json | 2 +- .../using_cxx/cxxbridge-cmd.Cargo.Bazel.lock | 2 +- examples/nix_cross_compiling/MODULE.bazel | 6 + .../nix_cross_compiling/MODULE.bazel.lock | 1227 +++++++++++++++++ examples/nix_cross_compiling/WORKSPACE.bazel | 5 +- .../bazel/cargo/cargo-bazel-lock.json | 2 +- rust/private/common.bzl | 6 + rust/private/rust.bzl | 20 +- rust/rust_common.bzl | 6 + test/no_std/cargo-bazel-lock.json | 2 +- 41 files changed, 3254 insertions(+), 62 deletions(-) create mode 100644 crate_universe/3rdparty/crates/alias_rules.bzl create mode 100644 crate_universe/src/rendering/verbatim/alias_rules.bzl create mode 100644 examples/crate_universe/alias_rule/BUILD.bazel create mode 100644 examples/crate_universe/alias_rule/Cargo.Bazel.lock create mode 100644 examples/crate_universe/alias_rule/alias_rules.bzl create mode 100644 examples/crate_universe/alias_rule/cargo-bazel-lock_global_alias_annotation_none.json create mode 100644 examples/crate_universe/alias_rule/cargo-bazel-lock_global_alias_annotation_opt.json create mode 100644 examples/crate_universe/alias_rule/cargo-bazel-lock_global_custom_annotation_none.json create mode 100644 examples/crate_universe/alias_rule/cargo-bazel-lock_global_dbg_annotation_fastbuild.json create mode 100644 examples/crate_universe/alias_rule/cargo-bazel-lock_global_opt_annotation_alias.json create mode 100644 examples/crate_universe/alias_rule/cargo-bazel-lock_global_opt_annotation_dbg.json create mode 100644 examples/crate_universe/alias_rule/cargo-bazel-lock_global_opt_annotation_none.json create mode 100644 examples/crate_universe/alias_rule/src/dbg.rs create mode 100644 examples/crate_universe/alias_rule/src/fastbuild.rs create mode 100644 examples/crate_universe/alias_rule/src/opt.rs create mode 100644 examples/nix_cross_compiling/MODULE.bazel create mode 100644 examples/nix_cross_compiling/MODULE.bazel.lock diff --git a/crate_universe/3rdparty/crates/alias_rules.bzl b/crate_universe/3rdparty/crates/alias_rules.bzl new file mode 100644 index 0000000000..2304bfcbc3 --- /dev/null +++ b/crate_universe/3rdparty/crates/alias_rules.bzl @@ -0,0 +1,43 @@ +"""Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias="opt"` to enable.""" + +load("@rules_rust//rust:rust_common.bzl", "COMMON_PROVIDERS") + +def _transition_alias_impl(ctx): + # `ctx.attr.actual` is a list of 1 item due to the transition + return [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS] + +def _change_compilation_mode(compilation_mode): + def _change_compilation_mode_impl(_settings, _attr): + return { + "//command_line_option:compilation_mode": compilation_mode, + } + + return transition( + implementation = _change_compilation_mode_impl, + inputs = [], + outputs = [ + "//command_line_option:compilation_mode", + ], + ) + +def _transition_alias_rule(compilation_mode): + return rule( + implementation = _transition_alias_impl, + provides = COMMON_PROVIDERS, + attrs = { + "actual": attr.label( + mandatory = True, + doc = "`rust_library()` target to transition to `compilation_mode=opt`.", + providers = COMMON_PROVIDERS, + cfg = _change_compilation_mode(compilation_mode), + ), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, + doc = "Transitions a Rust library crate to the `compilation_mode=opt`.", + ) + +transition_alias_dbg = _transition_alias_rule("dbg") +transition_alias_fastbuild = _transition_alias_rule("fastbuild") +transition_alias_opt = _transition_alias_rule("opt") diff --git a/crate_universe/private/common_utils.bzl b/crate_universe/private/common_utils.bzl index d92a357567..e8fc97bec0 100644 --- a/crate_universe/private/common_utils.bzl +++ b/crate_universe/private/common_utils.bzl @@ -128,3 +128,33 @@ def cargo_environ(repository_ctx): }) return env + +def parse_alias_rule(value): + """Attempts to parse an `AliasRule` from supplied string. + + Args: + value (str): String value to be parsed. + + Returns: + value: A Rust compatible `AliasRule`. + """ + if value == None: + return None + + if value == "alias" or value == "dbg" or value == "fastbuild" or value == "opt": + return value + + if value.count(":") != 2: + fail("Invalid custom value for `alias_rule`.\n{}\nValues must be in the format '