diff options
author | Ivo List <ilist@google.com> | 2024-02-12 16:09:24 +0100 |
---|---|---|
committer | Ivo List <ilist@google.com> | 2024-02-12 16:09:24 +0100 |
commit | d046e494691bc0383c3d6b2e770d6ddf44444d4a (patch) | |
tree | 0d498d26626fd561b7baf6b8f12608726d20fb72 | |
parent | 40220635a154e18b40be876f4d1a89b118f1cbe2 (diff) | |
parent | 251af60701c9ad7edf12d30a7cd5201a35b00f27 (diff) | |
download | bazelbuild-rules-proto-d046e494691bc0383c3d6b2e770d6ddf44444d4a.tar.gz |
Merge pull request #194 from bazelbuild:introduce_toolchains_helper
PiperOrigin-RevId: 586331999
-rw-r--r-- | MODULE.bazel | 1 | ||||
-rw-r--r-- | WORKSPACE | 4 | ||||
-rw-r--r-- | proto/proto_common.bzl | 30 | ||||
-rw-r--r-- | tests/BUILD | 14 | ||||
-rw-r--r-- | tests/proto_common/BUILD.bazel | 3 | ||||
-rw-r--r-- | tests/proto_common/toolchains.bzl | 51 |
6 files changed, 103 insertions, 0 deletions
diff --git a/MODULE.bazel b/MODULE.bazel index f34579f..a6ba283 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -15,3 +15,4 @@ bazel_dep(name = "stardoc", version = "0.5.6", dev_dependency = True, repo_name bazel_dep(name = "rules_cc", version = "0.0.1", dev_dependency = True) bazel_dep(name = "googletest", version = "1.11.0", dev_dependency = True, repo_name = "com_google_googletest") bazel_dep(name = "protobuf", version = "21.7", dev_dependency = True, repo_name = "com_google_protobuf") +bazel_dep(name = "platforms", version = "0.0.8", dev_dependency = True) @@ -11,6 +11,10 @@ load(":dev_deps.bzl", "rules_proto_dev_deps") rules_proto_dev_deps() +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +bazel_skylib_workspace() + load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") protobuf_deps() diff --git a/proto/proto_common.bzl b/proto/proto_common.bzl index 6184971..3e15665 100644 --- a/proto/proto_common.bzl +++ b/proto/proto_common.bzl @@ -22,3 +22,33 @@ load("//proto/private:native.bzl", "native_proto_common") proto_common = native_proto_common ProtoLangToolchainInfo = proto_common.ProtoLangToolchainInfo + +def _incompatible_toolchains_enabled(): + return getattr(proto_common, "INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION", False) + +def _find_toolchain(ctx, legacy_attr, toolchain_type): + if _incompatible_toolchains_enabled(): + toolchain = ctx.toolchains[toolchain_type] + if not toolchain: + fail("No toolchains registered for '%s'." % toolchain_type) + return toolchain.proto + else: + return getattr(ctx.attr, legacy_attr)[ProtoLangToolchainInfo] + +def _use_toolchain(toolchain_type): + if _incompatible_toolchains_enabled(): + return [config_common.toolchain_type(toolchain_type, mandatory = False)] + else: + return [] + +def _if_legacy_toolchain(legacy_attr_dict): + if _incompatible_toolchains_enabled(): + return {} + else: + return legacy_attr_dict + +toolchains = struct( + use_toolchain = _use_toolchain, + find_toolchain = _find_toolchain, + if_legacy_toolchain = _if_legacy_toolchain, +) diff --git a/tests/BUILD b/tests/BUILD index 2381713..57bb308 100644 --- a/tests/BUILD +++ b/tests/BUILD @@ -1,4 +1,18 @@ +load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load("//proto:defs.bzl", "proto_library") +load("//proto:proto_common.bzl", "proto_common") + +config_setting( + name = "incompatible_enable_proto_toolchain_resolution", + flag_values = { + ":incompatible_enable_proto_toolchain_resolution_flag": "true", + }, +) + +bool_flag( + name = "incompatible_enable_proto_toolchain_resolution_flag", + build_setting_default = getattr(proto_common, "INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION", False), +) proto_library( name = "empty_proto", diff --git a/tests/proto_common/BUILD.bazel b/tests/proto_common/BUILD.bazel new file mode 100644 index 0000000..82a7ecd --- /dev/null +++ b/tests/proto_common/BUILD.bazel @@ -0,0 +1,3 @@ +load(":toolchains.bzl", "unittest_toolchains") + +unittest_toolchains() diff --git a/tests/proto_common/toolchains.bzl b/tests/proto_common/toolchains.bzl new file mode 100644 index 0000000..1f01370 --- /dev/null +++ b/tests/proto_common/toolchains.bzl @@ -0,0 +1,51 @@ +"unit tests for proto_common.toolchains" + +load("@bazel_skylib//lib:partial.bzl", "partial") +load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") +load("//proto:proto_common.bzl", "toolchains") + +def _test_toolchains_without_incompatible_flag(ctx): + env = unittest.begin(ctx) + + asserts.equals(env, {}, toolchains.if_legacy_toolchain({})) + asserts.equals(env, None, toolchains.if_legacy_toolchain(None)) + asserts.equals(env, False, toolchains.if_legacy_toolchain(False)) + + return unittest.end(env) + +toolchains_without_incompatible_flags_test = unittest.make(_test_toolchains_without_incompatible_flag) + +def _test_toolchains_with_incompatible_flag(ctx): + env = unittest.begin(ctx) + + asserts.equals(env, {}, toolchains.if_legacy_toolchain({})) + asserts.equals(env, {}, toolchains.if_legacy_toolchain(None)) + asserts.equals(env, {}, toolchains.if_legacy_toolchain(False)) + toolchain = toolchains.use_toolchain("//nonexistent:toolchain_type") + asserts.equals(env, 1, len(toolchain)) + asserts.equals(env, False, toolchain[0].mandatory) + asserts.equals(env, str(Label("//nonexistent:toolchain_type")), str(toolchain[0].toolchain_type)) + + return unittest.end(env) + +toolchains_with_incompatible_flag_test = unittest.make(_test_toolchains_with_incompatible_flag) + +# buildifier: disable=unnamed-macro +def unittest_toolchains(): + unittest.suite( + "test_toolchains", + partial.make( + toolchains_without_incompatible_flags_test, + target_compatible_with = select({ + "//tests:incompatible_enable_proto_toolchain_resolution": ["@platforms//:incompatible"], + "//conditions:default": [], + }), + ), + partial.make( + toolchains_with_incompatible_flag_test, + target_compatible_with = select({ + "//tests:incompatible_enable_proto_toolchain_resolution": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + ), + ) |