Use Bazel Platforms to support AES-NI compile options for Randen

Bazel has deprecated selecting directly on the --cpu. This change
uses platforms to select the appropriate compile options.

Fixes https://github.com/abseil/abseil-cpp/issues/1573
Fixes https://github.com/abseil/abseil-cpp/pull/1797

PiperOrigin-RevId: 712638567
Change-Id: Id16e478fe4ff1d27992b263d51c822cce0f7a98c
diff --git a/absl/copts/configure_copts.bzl b/absl/copts/configure_copts.bzl
index ca5f26d..6d0cfe8 100644
--- a/absl/copts/configure_copts.bzl
+++ b/absl/copts/configure_copts.bzl
@@ -15,10 +15,6 @@
     "ABSL_MSVC_FLAGS",
     "ABSL_MSVC_LINKOPTS",
     "ABSL_MSVC_TEST_FLAGS",
-    "ABSL_RANDOM_HWAES_ARM32_FLAGS",
-    "ABSL_RANDOM_HWAES_ARM64_FLAGS",
-    "ABSL_RANDOM_HWAES_MSVC_X64_FLAGS",
-    "ABSL_RANDOM_HWAES_X64_FLAGS",
 )
 
 ABSL_DEFAULT_COPTS = select({
@@ -41,42 +37,3 @@
     "//absl:msvc_compiler": ABSL_MSVC_LINKOPTS,
     "//conditions:default": [],
 })
-
-# ABSL_RANDOM_RANDEN_COPTS blaze copts flags which are required by each
-# environment to build an accelerated RandenHwAes library.
-ABSL_RANDOM_RANDEN_COPTS = select({
-    # APPLE
-    ":cpu_darwin_x86_64": ABSL_RANDOM_HWAES_X64_FLAGS,
-    ":cpu_darwin": ABSL_RANDOM_HWAES_X64_FLAGS,
-    ":cpu_x64_windows_msvc": ABSL_RANDOM_HWAES_MSVC_X64_FLAGS,
-    ":cpu_x64_windows": ABSL_RANDOM_HWAES_MSVC_X64_FLAGS,
-    ":cpu_k8": ABSL_RANDOM_HWAES_X64_FLAGS,
-    ":cpu_ppc": ["-mcrypto"],
-    ":cpu_aarch64": ABSL_RANDOM_HWAES_ARM64_FLAGS,
-
-    # Supported by default or unsupported.
-    "//conditions:default": [],
-})
-
-# absl_random_randen_copts_init:
-#  Initialize the config targets based on cpu, os, etc. used to select
-#  the required values for ABSL_RANDOM_RANDEN_COPTS
-def absl_random_randen_copts_init():
-    """Initialize the config_settings used by ABSL_RANDOM_RANDEN_COPTS."""
-
-    # CPU configs.
-    # These configs have consistent flags to enable HWAES intsructions.
-    cpu_configs = [
-        "ppc",
-        "k8",
-        "darwin_x86_64",
-        "darwin",
-        "x64_windows_msvc",
-        "x64_windows",
-        "aarch64",
-    ]
-    for cpu in cpu_configs:
-        native.config_setting(
-            name = "cpu_%s" % cpu,
-            values = {"cpu": cpu},
-        )
diff --git a/absl/copts/copts.py b/absl/copts/copts.py
index 2d85ac7..d1cfe42 100644
--- a/absl/copts/copts.py
+++ b/absl/copts/copts.py
@@ -180,15 +180,4 @@
         # Object file doesn't export any previously undefined symbols
         "-ignore:4221",
     ],
-    # "HWAES" is an abbreviation for "hardware AES" (AES - Advanced Encryption
-    # Standard). These flags are used for detecting whether or not the target
-    # architecture has hardware support for AES instructions which can be used
-    # to improve performance of some random bit generators.
-    "ABSL_RANDOM_HWAES_ARM64_FLAGS": ["-march=armv8-a+crypto"],
-    "ABSL_RANDOM_HWAES_ARM32_FLAGS": ["-mfpu=neon"],
-    "ABSL_RANDOM_HWAES_X64_FLAGS": [
-        "-maes",
-        "-msse4.1",
-    ],
-    "ABSL_RANDOM_HWAES_MSVC_X64_FLAGS": [],
 }
diff --git a/absl/random/internal/BUILD.bazel b/absl/random/internal/BUILD.bazel
index 250eff0..21b324f 100644
--- a/absl/random/internal/BUILD.bazel
+++ b/absl/random/internal/BUILD.bazel
@@ -14,14 +14,14 @@
 # limitations under the License.
 #
 
+load("@bazel_skylib//lib:selects.bzl", "selects")
+
 # Internal-only implementation classes for Abseil Random
 load(
     "//absl:copts/configure_copts.bzl",
     "ABSL_DEFAULT_COPTS",
     "ABSL_DEFAULT_LINKOPTS",
-    "ABSL_RANDOM_RANDEN_COPTS",
     "ABSL_TEST_COPTS",
-    "absl_random_randen_copts_init",
 )
 
 default_package_visibility = [
@@ -39,6 +39,72 @@
 
 licenses(["notice"])
 
+# Used to select on compilers that support GCC-compatible options
+# (e.g. "-maes").
+selects.config_setting_group(
+    name = "gcc_compatible",
+    match_any = [
+        "@rules_cc//cc/compiler:clang",
+        "@rules_cc//cc/compiler:gcc",
+    ],
+)
+
+selects.config_setting_group(
+    name = "gcc_compatible-aarch32",
+    match_all = [
+        ":gcc_compatible",
+        "@platforms//cpu:aarch32",
+    ],
+)
+
+selects.config_setting_group(
+    name = "gcc_compatible-aarch64",
+    match_all = [
+        ":gcc_compatible",
+        "@platforms//cpu:aarch64",
+    ],
+)
+
+selects.config_setting_group(
+    name = "ppc_crypto",
+    match_any = [
+        "@platforms//cpu:ppc",
+        "@platforms//cpu:ppc32",
+        "@platforms//cpu:ppc64le",
+    ],
+)
+
+selects.config_setting_group(
+    name = "gcc_compatible-ppc_crypto",
+    match_all = [
+        ":gcc_compatible",
+        ":ppc_crypto",
+    ],
+)
+
+selects.config_setting_group(
+    name = "gcc_compatible-x86_64",
+    match_all = [
+        ":gcc_compatible",
+        "@platforms//cpu:x86_64",
+    ],
+)
+
+# Some libraries are compiled with options to generate AES-NI
+# instructions, and runtime dispatch is used to determine if the host
+# microarchitecture supports AES-NI or if a portable fallback library
+# should be called.
+ABSL_RANDOM_RANDEN_COPTS = select({
+    ":gcc_compatible-aarch32": ["-mfpu=neon"],
+    ":gcc_compatible-aarch64": ["-march=armv8-a+crypto"],
+    ":gcc_compatible-ppc_crypto": ["-mcrypto"],
+    ":gcc_compatible-x86_64": [
+        "-maes",
+        "-msse4.1",
+    ],
+    "//conditions:default": [],
+})
+
 cc_library(
     name = "traits",
     hdrs = ["traits.h"],
@@ -321,8 +387,6 @@
     ],
 )
 
-absl_random_randen_copts_init()
-
 cc_library(
     name = "randen_hwaes",
     srcs = [