Refactor architecture tests.

This makes the call-sites of the macro a bit more straightforward to understand, but is otherwise exactly the same as before.

PiperOrigin-RevId: 495507057
diff --git a/build_defs/arch_tests.bzl b/build_defs/arch_tests.bzl
index ba67cc6..77c661a 100644
--- a/build_defs/arch_tests.bzl
+++ b/build_defs/arch_tests.bzl
@@ -2,41 +2,54 @@
 
 load("//build_defs:internal_shell.bzl", "inline_sh_test")
 
-def _arch_test_impl(
+_ARCHITECTURE_MATCHER = {
+    "aarch64": "ELF 64-bit LSB.* ARM aarch64",
+    "x86_64": "ELF 64-bit LSB.* x86_64",
+}
+
+def binary_architecture_test(
         name,
-        platform,
-        file_platform,
-        bazel_binaries = [],
+        architecture,
+        binaries = [],
         system_binaries = [],
+        target_compatible_with = [],
+        tags = [],
         **kwargs):
-    """Bazel rule to verify that a Bazel or system binary is built for the aarch64 architecture.
+    """Bazel rule to verify that binaries are built for a specific architecture.
+
+    This is used as a sanity test of our test infrastructure, to make sure that we're
+    actually cross-compiling for the correct platform.
 
     Args:
       name: the name of the test.
-      platform: a diagnostic name for this architecture.
-      file_platform: the expected output of `file`.
-      bazel_binaries: a set of binary targets to inspect.
-      system_binaries: a set of paths to system executables to inspect.
+      architecture: an identifier for the architecture being tested.
+      binaries: a set of binary targets to inspect.
+      system_binaries: a set of system executables to inspect.
+      target_compatible_with: config settings this test is compatible with.
+      tags: tags for filtering these tests.
       **kwargs: other keyword arguments that are passed to the test.
     """
+    if architecture not in _ARCHITECTURE_MATCHER:
+        fail("Unknown architecture: %s", architecture)
 
     inline_sh_test(
         name = name,
-        tools = bazel_binaries,
+        tools = binaries,
         cmd = """
           for binary in "%s"; do
             (file -L $$binary | grep -q "%s") \
                 || (echo "Test binary is not an %s binary: "; file -L $$binary; exit 1)
           done
         """ % (
-            " ".join(["$(rootpaths %s)" % b for b in bazel_binaries] + system_binaries),
-            file_platform,
-            platform,
+            " ".join(["$(rootpaths %s)" % b for b in binaries] + system_binaries),
+            _ARCHITECTURE_MATCHER[architecture],
+            architecture,
         ),
-        target_compatible_with = select({
-            "//build_defs:" + platform: [],
-            "//conditions:default": ["@platforms//:incompatible"],
-        }),
+        target_compatible_with = target_compatible_with,
+        tags = tags + [
+            "binary_architecture_test",
+            "%s_test" % architecture,
+        ],
         **kwargs
     )
 
diff --git a/python/BUILD.bazel b/python/BUILD.bazel
index cc0772c..552a536 100644
--- a/python/BUILD.bazel
+++ b/python/BUILD.bazel
@@ -6,11 +6,12 @@
 #   //:protobuf_python
 #   //:well_known_types_py_pb2
 
+load("@bazel_skylib//lib:selects.bzl", "selects")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_python//python:defs.bzl", "py_library")
 load("@pip_deps//:requirements.bzl", "requirement")
 load("//:protobuf.bzl", "internal_py_proto_library")
-load("//build_defs:arch_tests.bzl", "aarch64_test", "x86_64_test")
+load("//build_defs:arch_tests.bzl", "binary_architecture_test")
 load("//build_defs:cpp_opts.bzl", "COPTS")
 load("//conformance:defs.bzl", "conformance_test")
 load(":internal.bzl", "internal_copy_files", "internal_py_test")
@@ -119,20 +120,38 @@
     }),
 )
 
-aarch64_test(
+selects.config_setting_group(
+    name = "_aarch64_and_fast_cpp",
+    match_all = ["//build_defs:aarch64", ":use_fast_cpp_protos"],
+)
+binary_architecture_test(
     name = "aarch64_test",
-    bazel_binaries = [
+    architecture = "aarch64",
+    binaries = [
         "google/protobuf/internal/_api_implementation.so",
         "google/protobuf/pyext/_message.so",
     ],
+    target_compatible_with = select({
+        ":_aarch64_and_fast_cpp": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
 )
 
-x86_64_test(
+selects.config_setting_group(
+    name = "_x86_64_and_fast_cpp",
+    match_all = ["//build_defs:x86_64", ":use_fast_cpp_protos"],
+)
+binary_architecture_test(
     name = "x86_64_test",
-    bazel_binaries = [
+    architecture = "x86_64",
+    binaries = [
         "google/protobuf/internal/_api_implementation.so",
         "google/protobuf/pyext/_message.so",
     ],
+    target_compatible_with = select({
+        ":_x86_64_and_fast_cpp": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
 )
 
 py_library(
diff --git a/src/google/protobuf/compiler/BUILD.bazel b/src/google/protobuf/compiler/BUILD.bazel
index 8cc1186..3ef0414 100644
--- a/src/google/protobuf/compiler/BUILD.bazel
+++ b/src/google/protobuf/compiler/BUILD.bazel
@@ -10,7 +10,7 @@
     "strip_prefix",
 )
 load("@rules_proto//proto:defs.bzl", "proto_library")
-load("//build_defs:arch_tests.bzl", "aarch64_test", "x86_64_test")
+load("//build_defs:arch_tests.bzl", "binary_architecture_test")
 load("//build_defs:cpp_opts.bzl", "COPTS", "LINK_OPTS", "PROTOC_LINK_OPTS")
 
 proto_library(
@@ -144,14 +144,28 @@
 )
 
 # Test that the protoc binary is built for the correct architecture.
-aarch64_test(
-    name = "protoc_aarch64_test",
-    bazel_binaries = ["//:protoc"],
+binary_architecture_test(
+    name = "aarch64_test",
+    architecture = "aarch64",
+    binaries = [
+        "//:protoc",
+    ],
+    target_compatible_with = select({
+        "//build_defs:aarch64": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
 )
 
-x86_64_test(
-    name = "protoc_x86_64_test",
-    bazel_binaries = ["//:protoc"],
+binary_architecture_test(
+    name = "x86_64_test",
+    architecture = "x86_64",
+    binaries = [
+        "//:protoc",
+    ],
+    target_compatible_with = select({
+        "//build_defs:x86_64": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
 )
 
 ################################################################################