semver version range match
diff --git a/v2/BUILD.bazel b/v2/BUILD.bazel
index e789ff2..ebc8cde 100644
--- a/v2/BUILD.bazel
+++ b/v2/BUILD.bazel
@@ -1,15 +1,60 @@
 load(":cc_proto_library.bzl", "cc_proto_library")
+load("@bazel_skylib//lib:selects.bzl", "selects")
 
 cc_proto_library(
     name = "proto",
 )
 
 config_setting(
-    name = "is_3_21_12",
-    flag_values = {
-        "//version:protoc": "3.21.12",
-    },
+    name = "is_major_3",
+    flag_values = {"//version:protoc_major": "3"},
 )
+config_setting(
+    name = "is_minor_21",
+    flag_values = {"//version:protoc_minor": "21"},
+)
+config_setting(
+    name = "is_patch_12",
+    flag_values = {"//version:protoc_patch": "12"},
+)
+
+
+selects.config_setting_group(
+    name = "is_3",
+    match_all = [":is_major_3"],
+)
+
+selects.config_setting_group(
+    name = "is_3_21",
+    match_all = [
+        ":is_major_3",
+        ":is_minor_21",
+    ],
+)
+
+selects.config_setting_group(
+    name = "is_3_21_12",
+    match_all = [
+        ":is_major_3",
+        ":is_minor_21",
+        ":is_patch_12",
+    ],
+)
+
+# This config setting will satify the following configurations
+#
+# A transition that sets major version to 3
+# A transition that sets major.minor version to 3.21
+# A transition that sets major.minor.patch version to 2.21.12
+selects.config_setting_group(
+    name = "semver_3_21_12",
+    match_any = [
+        ":is_3",
+        ":is_3_21",
+        ":is_3_21_12",
+    ],
+)
+
 
 toolchain_type(
     name = "demo_toolchain_type",
@@ -26,7 +71,7 @@
         "@platforms//cpu:arm64",
     ],
     target_settings = [
-        ":is_3_21_12",
+        ":semver_3_21_12"
     ],
     toolchain = "@protobuf//:cc_toolchain",
     toolchain_type = ":demo_toolchain_type",
diff --git a/v2/cc_proto_library.bzl b/v2/cc_proto_library.bzl
index 7ea779d..768ce08 100644
--- a/v2/cc_proto_library.bzl
+++ b/v2/cc_proto_library.bzl
@@ -1,27 +1,47 @@
 def _pb_version_transition_impl(settings, attr):
-    is_bcr_release = False  # there's some way to detect
-    if is_bcr_release:
-        # This will loaded from a version.bzl file which
-        # protobuf releases will create with every release.
-        return {
-            "//version:protoc": "3.21.12",
-        }
+    is_bcr_release = True  # there's some way to detect
+    if not is_bcr_release:
+        # Transition is not needed
+        return {}
 
-    # Transition is not needed
-    return {}
+    # Version information about the current protobuf release will be loaded
+    # from a version.bzl file which protobuf releases will create with every release.
+
+    # Here some ways to match the version
+    #
+    # Make an exact match
+    return {
+        "//version:protoc_major": "3",
+        "//version:protoc_minor": "21",
+        "//version:protoc_patch": "12"
+    }
+    #
+    # Use to make a major version match
+    return {
+        "//version:protoc_major": "3"
+    }
+    #
+    # Use to make a major.minor match
+    return {
+        "//version:protoc_major": "3",
+        "//version:protoc_minor": "21"
+    }
+
 
 _pb_version_transition = transition(
     implementation = _pb_version_transition_impl,
     inputs = [],
-    outputs = ["//version:protoc"],
+    outputs = [
+        "//version:protoc_major",
+        "//version:protoc_minor",
+        "//version:protoc_patch",
+    ],
 )
 
 def _cc_proto_library_impl(ctx):
-    toolchain = ctx.toolchains["//:demo_toolchain_type"].proto
+    toolchain = ctx.toolchains["//:demo_toolchain_type"]
 
-    print(toolchain)
-
-    return DefaultInfo(files = depset([toolchain.proto_compiler.executable]))
+    return DefaultInfo(files = depset([toolchain.proto.proto_compiler.executable]))
 
 cc_proto_library = rule(
     implementation = _cc_proto_library_impl,
diff --git a/v2/version/BUILD.bazel b/v2/version/BUILD.bazel
index 247ebc0..a577603 100644
--- a/v2/version/BUILD.bazel
+++ b/v2/version/BUILD.bazel
@@ -3,27 +3,28 @@
 package(default_visibility = ["//visibility:public"])
 
 # https://github.com/bazelbuild/bazel/issues/16976#issuecomment-1363325329
-
-
 # Modeling the Cross-Version Runtime Guarantee using Bazel toolchains is doable
 # but not trivial to get right due to lack of version range selection when using
 # build-setting combined with `target_settings` or constraint_setting combined with
 # exec_compatible_with and target_compatible_with.
 
-
-# # protoc constraint that represents the "Generated Code Version" requirement
-# # in the cross version runtime guarantee matrix.
-# constraint_setting(name = "protoc")
-
-# # similarly runtime constraint represents the "Runtime Version" in the compatibility
-# # matrix.
-# constraint_setting(name = "runtime")
-
-
-# This will loaded from a version.bzl file which
-# protobuf releases will create with every release.
+# Representing the major version of the protoc compiler.
 string_setting(
-    name = "protoc",
-    build_setting_default = "3.21.12",
+    name = "protoc_major",
+    build_setting_default = "",
+    visibility = ["//visibility:public"],
+)
+
+# Representing the minor version of the protoc compiler.
+string_setting(
+    name = "protoc_minor",
+    build_setting_default = "",
+    visibility = ["//visibility:public"],
+)
+
+# Representing the patch version of the protoc compiler.
+string_setting(
+    name = "protoc_patch",
+    build_setting_default = "",
     visibility = ["//visibility:public"],
 )
diff --git a/v2/version/protoc/BUILD.bazel b/v2/version/protoc/BUILD.bazel
deleted file mode 100644
index 4a68c6d..0000000
--- a/v2/version/protoc/BUILD.bazel
+++ /dev/null
@@ -1,4 +0,0 @@
-constraint_value(
-    name = "3.21.12",
-    constraint_setting = "//version:protoc",
-)
diff --git a/v2/version/runtime/BUILD.bazel b/v2/version/runtime/BUILD.bazel
deleted file mode 100644
index 708ec68..0000000
--- a/v2/version/runtime/BUILD.bazel
+++ /dev/null
@@ -1,4 +0,0 @@
-constraint_value(
-    name = "3.21.12",
-    constraint_setting = "//version:runtime",
-)