Run Linux CMake CI builds and tests in Bazel using rules_foreign_cc.

This moves the Linux GCC/libstdc++ CMake and CMake installation tests into Bazel on RBE using rules_foreign_cc (0.16.0), replacing the separate Linux jobs in cmake.yml with a Bazel target suite (//:cmake_static_test, //:cmake_shared_test, //:cmake_monolithic_shared_test, //:cmake_install_static_test, and //:cmake_install_shared_test).

PiperOrigin-RevId: 1001677000
diff --git a/.bazelrc b/.bazelrc
index b1c92dd..c39ac4e 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -77,6 +77,11 @@
 build:remote --remote_executor=grpcs://us-east1-remotebuildexecution.googleapis.com
 build:remote --remote_instance_name=projects/google.com:absl-177019/instances/absl-ci-east
 
+build:remote-floor --config=remote
+build:remote-floor --extra_execution_platforms=//ci:rbe-floor
+build:remote-floor --host_platform=//ci:rbe-floor
+build:remote-floor --platforms=//ci:rbe-floor
+
 build:remote-arm --config=remote-base
 build:remote-arm --extra_execution_platforms=//ci:rbe-arm
 build:remote-arm --host_platform=//ci:rbe-arm
diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml
index b54e910..94450ad 100644
--- a/.github/workflows/bazel.yml
+++ b/.github/workflows/bazel.yml
@@ -50,6 +50,11 @@
         required: false
         default: '["opt", "fastbuild"]'
         type: string
+      targets:
+        description: "Bazel target pattern(s) to test"
+        required: false
+        default: "..."
+        type: string
 
 permissions:
   contents: read
@@ -105,7 +110,7 @@
 
       - name: Run tests
         run: >
-          bazel test ...
+          bazel test ${{ inputs.targets }}
           --config=${{ inputs.toolchain }}
           --cxxopt=${{ startsWith(inputs.os, 'windows') && '/std:' || '-std=' }}${{ matrix.std }}
           --host_cxxopt=${{ startsWith(inputs.os, 'windows') && '/std:' || '-std=' }}${{ matrix.std }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 15f6c95..a965a13 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -44,10 +44,9 @@
   cancel-in-progress: ${{ contains(fromJSON('["pull_request", "workflow_dispatch", "schedule"]'), github.event_name) }}
 
 jobs:
-  # Mirrors the 10 Linux "latest" Bazel Kokoro jobs (parallelized to 1 job per
-  # Bazel invocation). Not yet covered here:
-  #   - "Linux GCC/libstdc++ (floor) Bazel" (requires a floor GCC Docker image)
-  #   - CMake, macOS, and Windows Kokoro jobs
+  # Mirrors the 11 Linux Bazel Kokoro jobs (parallelized to 1 job per Bazel
+  # invocation). Not yet covered here:
+  #   - macOS Bazel and Windows Bazel Kokoro jobs
   linux:
     name: Linux ${{ matrix.config.name }} Bazel
     strategy:
@@ -87,26 +86,71 @@
           - name: GCC/libstdc++ alternate options
             toolchain: gcc
             alternate_options: true
+          # linux_gcc-floor_libstdcxx_bazel.cfg (c++17 only)
+          - name: GCC/libstdc++ (floor)
+            toolchain: gcc
+            remote_config: remote-floor
+            container_image: gcr.io/google.com/absl-177019/oss-linux-toolchain-floor@sha256:f3d8a0f76a88d5edbba70250de47fb862271297b9ff41ff317240e564c95d65e
+            stds: '["c++17"]'
           # linux_arm_clang-latest_libcxx_bazel.cfg (c++17 and c++20 only)
           - name: ARM64 Clang/libc++
+            os: ubuntu-24.04-arm
             toolchain: clang-arm
-            arch_suffix: -arm
+            remote_config: remote-arm
             stds: '["c++17", "c++20"]'
+          # linux_gcc-latest_libstdcxx_cxx17_cmake.cfg
+          # cmake-install.cfg
+          - name: GCC/libstdc++ CMake
+            toolchain: gcc
+            stds: '["c++17"]'
+            targets: "//:cmake_static_test //:cmake_shared_test //:cmake_monolithic_shared_test //:cmake_install_static_test //:cmake_install_shared_test"
     uses: ./.github/workflows/bazel.yml
     secrets: inherit
     with:
-      os: ubuntu-24.04${{ matrix.config.arch_suffix }}
+      os: ${{ matrix.config.os || 'ubuntu-24.04' }}
       toolchain: ${{ matrix.config.toolchain }}
-      remote_config: remote${{ matrix.config.arch_suffix }}
-      container_image: gcr.io/google.com/absl-177019/oss-linux-toolchain-latest@sha256:8dfd8bff496cce2b3aaa5d2f1b63ebb6790f2bc78a02cdc0ca9898372fbc38f3
+      remote_config: ${{ matrix.config.remote_config || 'remote' }}
+      container_image: ${{ matrix.config.container_image || 'gcr.io/google.com/absl-177019/oss-linux-toolchain-latest@sha256:5a19067585ce5e5ee45640fd0287f05038d6b3f9574d6a5cdf08241e022d0f4a' }}
       alternate_options: ${{ matrix.config.alternate_options || false }}
       stds: ${{ matrix.config.stds || '["c++17", "c++20", "c++23"]' }}
       compilation_modes: ${{ matrix.config.compilation_modes || '["opt", "fastbuild"]' }}
+      targets: ${{ matrix.config.targets || '...' }}
+
+  cmake:
+    name: ${{ matrix.config.name }} CMake
+    strategy:
+      fail-fast: false  # Don't cancel all jobs if one fails.
+      matrix:
+        config:
+          # linux_gcc_alpine_cmake.cfg
+          - name: Alpine Linux GCC (musl)
+            os: ubuntu-24.04
+            container_image: gcr.io/google.com/absl-177019/alpine@sha256:ae26b80601cebb14595056a94e070f0f865d24baaf3ce19bcd52f53be9f99c80
+            build_types: '["Debug"]'
+            link_modes: '["static"]'
+          # macos_xcode_cmake.cfg
+          - name: macOS Xcode
+            os: macos-latest
+            build_types: '["Debug"]'
+          # windows-msvc-2022-cxx17-dbg-cmake.cfg
+          # windows-msvc-2022-cxx17-dbg-dll-cmake.cfg
+          - name: Windows MSVC 2022
+            os: windows-2022
+            build_types: '["Debug"]'
+            link_modes: '["static", "shared"]'
+    uses: ./.github/workflows/cmake.yml
+    secrets: inherit
+    with:
+      os: ${{ matrix.config.os }}
+      container_image: ${{ matrix.config.container_image || '' }}
+      build_types: ${{ matrix.config.build_types || '["Debug", "Release"]' }}
+      link_modes: ${{ matrix.config.link_modes || '["static", "shared", "monolithic-shared"]' }}
+      install_test: ${{ matrix.config.install_test || false }}
 
   # Provide a single predictably-named job for copybara to look for
   all-blocking-tests:
     name: All Blocking Tests
-    needs: [linux]
+    needs: [linux, cmake]
     runs-on: ubuntu-latest
     steps:
       - name: Check for cancellations
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
new file mode 100644
index 0000000..2080af3
--- /dev/null
+++ b/.github/workflows/cmake.yml
@@ -0,0 +1,148 @@
+# Copyright 2026 The Abseil Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: CMake Tests
+
+on:
+  workflow_call:
+    inputs:
+      os:
+        description: "GitHub Actions runner OS (e.g. ubuntu-24.04, macos-latest, windows-2022)"
+        required: true
+        type: string
+      container_image:
+        description: "Docker container image to run in (empty string for host execution)"
+        required: false
+        default: ""
+        type: string
+      build_types:
+        description: "JSON array of CMAKE_BUILD_TYPE values to test"
+        required: false
+        default: '["Debug", "Release"]'
+        type: string
+      link_modes:
+        description: "JSON array of link modes to test (static, shared, monolithic-shared)"
+        required: false
+        default: '["static", "shared", "monolithic-shared"]'
+        type: string
+      install_test:
+        description: "Whether to run the CMake installation integration test"
+        required: false
+        default: false
+        type: boolean
+
+permissions:
+  contents: read
+
+jobs:
+  test:
+    runs-on: ${{ inputs.os }}
+    name: (${{ matrix.build_type }}, ${{ matrix.link_mode }})
+    container:
+      image: ${{ inputs.container_image }}
+      # core=1 skips kernel pipe core_pattern handlers (e.g. apport) on death tests.
+      options: --cap-add=SYS_PTRACE --ulimit core=1
+      credentials:
+        # TODO(b/573304451): Switch to Workload Identity Federation to avoid the need for secrets.
+        username: _json_key
+        password: ${{ secrets.GAR_SERVICE_ACCOUNT }}
+    strategy:
+      fail-fast: false  # Don't cancel all jobs if one fails.
+      matrix:
+        build_type: ${{ fromJSON(inputs.build_types) }}
+        link_mode: ${{ fromJSON(inputs.link_modes) }}
+    defaults:
+      run:
+        shell: bash
+    env:
+      CC: ${{ startsWith(inputs.os, 'ubuntu') && 'gcc' || '' }}
+      CFLAGS: ${{ !inputs.install_test && startsWith(inputs.os, 'ubuntu') && '-Werror' || '' }}
+      CXX: ${{ startsWith(inputs.os, 'ubuntu') && 'g++' || '' }}
+      CXXFLAGS: ${{ !inputs.install_test && (startsWith(inputs.os, 'ubuntu') && '-Werror' || startsWith(inputs.os, 'windows') && '-WX') || '' }}
+      CMAKE_BUILD_PARALLEL_LEVEL: 16
+      CMAKE_C_COMPILER_LAUNCHER: sccache
+      CMAKE_CXX_COMPILER_LAUNCHER: sccache
+      CMAKE_GENERATOR: Ninja
+      CTEST_OUTPUT_ON_FAILURE: 1
+      CTEST_PARALLEL_LEVEL: 16
+      SCCACHE_GCS_BUCKET: absl-cmake-sccache
+      SCCACHE_GCS_RW_MODE: READ_WRITE
+      SCCACHE_IDLE_TIMEOUT: 0
+      SCCACHE_IGNORE_SERVER_IO_ERROR: 1
+    steps:
+      - name: Checkout
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 7.0.0
+
+      - name: Set up MSVC
+        if: ${{ runner.os == 'Windows' }}
+        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
+        with:
+          arch: x64
+          vsversion: "2022"
+
+      - name: Authenticate to Google Cloud
+        id: auth
+        uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0
+        with:
+          credentials_json: ${{ secrets.GAR_SERVICE_ACCOUNT }}
+
+      - name: Set up sccache
+        uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
+
+      - name: Start sccache
+        env:
+          SCCACHE_GCS_KEY_PATH: ${{ steps.auth.outputs.credentials_file_path }}
+        run: sccache --start-server
+
+      - name: Run installation test
+        if: ${{ inputs.install_test }}
+        env:
+          LINK_TYPE: ${{ matrix.link_mode == 'shared' && 'DYNAMIC' || 'STATIC' }}
+        run: >
+          source ci/cmake_common.sh &&
+          export ABSL_GOOGLETEST_VERSION ABSL_GOOGLETEST_DOWNLOAD_URL &&
+          CMake/install_test_project/test.sh
+
+      - name: Configure
+        if: ${{ !inputs.install_test }}
+        run: >
+          source ci/cmake_common.sh &&
+          cmake -B build
+          -DABSL_BUILD_TESTING=ON
+          -DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL}
+          -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
+          -DCMAKE_C_FLAGS_DEBUG="${{ runner.os == 'Windows' && '-O1 -Ob1 -Zc:inline' || '-Og' }}"
+          -DCMAKE_CXX_FLAGS_DEBUG="${{ runner.os == 'Windows' && '-O1 -Ob1 -Zc:inline' || '-Og' }}"
+          -DCMAKE_EXE_LINKER_FLAGS_DEBUG=""
+          -DCMAKE_SHARED_LINKER_FLAGS_DEBUG=""
+          -DCMAKE_CXX_STANDARD=17
+          -DBUILD_SHARED_LIBS=${{ matrix.link_mode != 'static' }}
+          -DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${{ matrix.link_mode == 'monolithic-shared' }}
+          -DCMAKE_POLICY_DEFAULT_CMP0141=NEW
+          -DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=""
+          -DCMAKE_JOB_POOLS="link=$(nproc 2>/dev/null || sysctl -n hw.logicalcpu)"
+          -DCMAKE_JOB_POOL_LINK=link
+
+      - name: Build
+        if: ${{ !inputs.install_test }}
+        run: cmake --build build
+
+      - name: Run tests
+        if: ${{ !inputs.install_test }}
+        env:
+          TZDIR: ${{ github.workspace }}/absl/time/internal/cctz/testdata/zoneinfo
+        run: >
+          ctest --test-dir build
+          --repeat until-pass:3
+          ${{ runner.os == 'Windows' && '-E "absl_lifetime_test|absl_symbolize_test"' || '' }}
diff --git a/BUILD.bazel b/BUILD.bazel
index 03122a9..02991c0 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -13,6 +13,8 @@
 # limitations under the License.
 #
 
+load("//ci:cmake.bzl", "define_cmake_tests")
+
 package(default_visibility = ["//visibility:public"])
 
 licenses(["notice"])  # Apache 2.0
@@ -23,6 +25,49 @@
     "LICENSE",
 ])
 
+filegroup(
+    name = "cmake_srcs",
+    srcs = [
+        "CMakeLists.txt",
+        "MODULE.bazel",
+        "create_lts.py",
+    ] + glob(
+        ["CMake/**"],
+        exclude = [
+            "**/BUILD",
+            "**/BUILD.bazel",
+        ],
+    ) + [
+        "//absl:cmake_srcs",
+        "//absl/algorithm:cmake_srcs",
+        "//absl/base:cmake_srcs",
+        "//absl/cleanup:cmake_srcs",
+        "//absl/container:cmake_srcs",
+        "//absl/crc:cmake_srcs",
+        "//absl/debugging:cmake_srcs",
+        "//absl/flags:cmake_srcs",
+        "//absl/functional:cmake_srcs",
+        "//absl/hash:cmake_srcs",
+        "//absl/log:cmake_srcs",
+        "//absl/log/internal:cmake_srcs",
+        "//absl/memory:cmake_srcs",
+        "//absl/meta:cmake_srcs",
+        "//absl/numeric:cmake_srcs",
+        "//absl/profiling:cmake_srcs",
+        "//absl/random:cmake_srcs",
+        "//absl/random/internal:cmake_srcs",
+        "//absl/status:cmake_srcs",
+        "//absl/strings:cmake_srcs",
+        "//absl/synchronization:cmake_srcs",
+        "//absl/time:cmake_srcs",
+        "//absl/time/internal/cctz:cmake_srcs",
+        "//absl/types:cmake_srcs",
+        "//absl/utility:cmake_srcs",
+    ],
+)
+
+define_cmake_tests()
+
 # For building with clang-cl.
 # https://bazel.build/configure/windows#clang
 platform(
diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake
index 61e1ae4..271e5ba 100644
--- a/CMake/AbseilHelpers.cmake
+++ b/CMake/AbseilHelpers.cmake
@@ -372,6 +372,7 @@
 # COPTS: List of private compile options
 # DEFINES: List of public defines
 # LINKOPTS: List of link options
+# SHARD_COUNT: Number of shards to split the test into for ctest
 #
 # Note:
 # By default, absl_cc_test will always create a binary named absl_${NAME}.
@@ -405,7 +406,7 @@
 
   cmake_parse_arguments(ABSL_CC_TEST
     ""
-    "NAME"
+    "NAME;SHARD_COUNT"
     "SRCS;COPTS;DEFINES;LINKOPTS;DEPS"
     ${ARGN}
   )
@@ -461,5 +462,16 @@
     target_compile_features(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
   endif()
 
-  add_test(NAME ${_NAME} COMMAND ${_NAME})
+  if(ABSL_CC_TEST_SHARD_COUNT AND ABSL_CC_TEST_SHARD_COUNT GREATER 1)
+    math(EXPR _LAST_SHARD "${ABSL_CC_TEST_SHARD_COUNT} - 1")
+    foreach(_SHARD RANGE 0 ${_LAST_SHARD})
+      add_test(NAME "${_NAME}_shard_${_SHARD}" COMMAND ${_NAME})
+      set_tests_properties("${_NAME}_shard_${_SHARD}" PROPERTIES
+        ENVIRONMENT "GTEST_TOTAL_SHARDS=${ABSL_CC_TEST_SHARD_COUNT};GTEST_SHARD_INDEX=${_SHARD}"
+        COST 100
+      )
+    endforeach()
+  else()
+    add_test(NAME ${_NAME} COMMAND ${_NAME})
+  endif()
 endfunction()
diff --git a/CMake/install_test_project/test.sh b/CMake/install_test_project/test.sh
index 962bc8d..2d25696 100755
--- a/CMake/install_test_project/test.sh
+++ b/CMake/install_test_project/test.sh
@@ -19,8 +19,9 @@
 # Fail on any error. Treat unset variables an error. Print commands as executed.
 set -euox pipefail
 
-absl_dir=/abseil-cpp
+absl_dir="${PWD}"
 absl_build_dir=/buildfs
+mkdir -p "${absl_build_dir}"
 googletest_builddir=/googletest_builddir
 googletest_archive="googletest-${ABSL_GOOGLETEST_VERSION}.tar.gz"
 project_dir="${absl_dir}/CMake/install_test_project"
@@ -40,8 +41,8 @@
 mkdir build
 pushd build
 cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS="${build_shared_libs}" ..
-make -j $(nproc)
-make install
+cmake --build .
+cmake --install .
 ldconfig
 popd
 popd
@@ -57,10 +58,12 @@
   -DABSL_FIND_GOOGLETEST=ON  \
   -DCMAKE_BUILD_TYPE=Release \
   -DABSL_BUILD_TESTING=ON \
-  -DBUILD_SHARED_LIBS="${build_shared_libs}"
-make -j $(nproc)
-ctest -j $(nproc) --output-on-failure
-make install
+  -DBUILD_SHARED_LIBS="${build_shared_libs}" \
+  -DCMAKE_JOB_POOLS="link=$(nproc)" \
+  -DCMAKE_JOB_POOL_LINK=link
+cmake --build .
+ctest --output-on-failure --repeat until-pass:3
+cmake --install .
 ldconfig
 popd
 
diff --git a/MODULE.bazel b/MODULE.bazel
index d4096d2..0ca31ab 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -35,6 +35,38 @@
     version = "1.9.5",
     dev_dependency = True,
 )
+bazel_dep(
+    name = "rules_foreign_cc",
+    version = "0.16.0",
+    dev_dependency = True,
+)
+bazel_dep(
+    name = "rules_shell",
+    version = "0.6.1",
+    dev_dependency = True,
+)
+
+foreign_cc_tools = use_extension(
+    "@rules_foreign_cc//foreign_cc:extensions.bzl",
+    "tools",
+    dev_dependency = True,
+)
+foreign_cc_tools.cmake(mode = "system")
+foreign_cc_tools.ninja(mode = "system")
+foreign_cc_tools.make(mode = "system")
+foreign_cc_tools.pkgconfig(mode = "system")
+
+http_file = use_repo_rule(
+    "@bazel_tools//tools/build_defs/repo:http.bzl",
+    "http_file",
+)
+http_file(
+    name = "googletest_archive",
+    dev_dependency = True,
+    downloaded_file_path = "googletest-1.18.0.tar.gz",
+    sha256 = "6e3191c1455468b3fc35a417fb565c1c5071aee1b7e7f85e30cf48a98d37d8b5",
+    urls = ["https://github.com/google/googletest/releases/download/v1.18.0/googletest-1.18.0.tar.gz"],
+)
 
 # Note: Googletest is NOT a dev_dependency. Some Abseil test utilities
 # intended to be used by Abseil users depend on GoogleTest.
diff --git a/absl/BUILD.bazel b/absl/BUILD.bazel
index c358647..4476fe3 100644
--- a/absl/BUILD.bazel
+++ b/absl/BUILD.bazel
@@ -72,3 +72,16 @@
     ],
     visibility = [":__subpackages__"],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/algorithm/BUILD.bazel b/absl/algorithm/BUILD.bazel
index 10b9400..c8f04ee 100644
--- a/absl/algorithm/BUILD.bazel
+++ b/absl/algorithm/BUILD.bazel
@@ -96,3 +96,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/base/BUILD.bazel b/absl/base/BUILD.bazel
index 749c54f..ad1dd43 100644
--- a/absl/base/BUILD.bazel
+++ b/absl/base/BUILD.bazel
@@ -514,6 +514,7 @@
     visibility = ["//absl:__subpackages__"],
     deps = [
         ":config",
+        ":core_headers",
         ":pretty_function",
         "//absl/memory",
         "//absl/meta:type_traits",
@@ -565,6 +566,7 @@
     srcs = ["spinlock_test_common.cc"],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     tags = [
         "no_test_wasm",
     ],
@@ -1146,3 +1148,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/base/CMakeLists.txt b/absl/base/CMakeLists.txt
index 2f8846f..d1ce0f9 100644
--- a/absl/base/CMakeLists.txt
+++ b/absl/base/CMakeLists.txt
@@ -367,6 +367,7 @@
     ${ABSL_TEST_COPTS}
   DEPS
     absl::config
+    absl::core_headers
     absl::memory
     absl::meta
     absl::pretty_function
@@ -533,6 +534,8 @@
     absl::core_headers
     absl::synchronization
     GTest::gtest_main
+  SHARD_COUNT
+    4
 )
 
 # Internal-only target, do not depend on directly.
diff --git a/absl/base/internal/exception_safety_testing.h b/absl/base/internal/exception_safety_testing.h
index e600b85..b4be3ec 100644
--- a/absl/base/internal/exception_safety_testing.h
+++ b/absl/base/internal/exception_safety_testing.h
@@ -40,6 +40,7 @@
 #include <vector>
 
 #include "gtest/gtest.h"
+#include "absl/base/attributes.h"
 #include "absl/base/internal/pretty_function.h"
 #include "absl/memory/memory.h"
 #include "absl/meta/type_traits.h"
@@ -547,7 +548,7 @@
   }
 
   // Memory management operators
-  static void* operator new(size_t s) noexcept(
+  ABSL_ATTRIBUTE_NOINLINE static void* operator new(size_t s) noexcept(
       IsSpecified(TypeSpec::kNoThrowNew)) {
     if (!IsSpecified(TypeSpec::kNoThrowNew)) {
       exceptions_internal::MaybeThrow(ABSL_INTERNAL_PRETTY_FUNCTION, true);
@@ -555,7 +556,7 @@
     return ::operator new(s);
   }
 
-  static void* operator new[](size_t s) noexcept(
+  ABSL_ATTRIBUTE_NOINLINE static void* operator new[](size_t s) noexcept(
       IsSpecified(TypeSpec::kNoThrowNew)) {
     if (!IsSpecified(TypeSpec::kNoThrowNew)) {
       exceptions_internal::MaybeThrow(ABSL_INTERNAL_PRETTY_FUNCTION, true);
@@ -564,8 +565,8 @@
   }
 
   template <typename... Args>
-  static void* operator new(size_t s, Args&&... args) noexcept(
-      IsSpecified(TypeSpec::kNoThrowNew)) {
+  ABSL_ATTRIBUTE_NOINLINE static void* operator new(
+      size_t s, Args&&... args) noexcept(IsSpecified(TypeSpec::kNoThrowNew)) {
     if (!IsSpecified(TypeSpec::kNoThrowNew)) {
       exceptions_internal::MaybeThrow(ABSL_INTERNAL_PRETTY_FUNCTION, true);
     }
@@ -573,8 +574,8 @@
   }
 
   template <typename... Args>
-  static void* operator new[](size_t s, Args&&... args) noexcept(
-      IsSpecified(TypeSpec::kNoThrowNew)) {
+  ABSL_ATTRIBUTE_NOINLINE static void* operator new[](
+      size_t s, Args&&... args) noexcept(IsSpecified(TypeSpec::kNoThrowNew)) {
     if (!IsSpecified(TypeSpec::kNoThrowNew)) {
       exceptions_internal::MaybeThrow(ABSL_INTERNAL_PRETTY_FUNCTION, true);
     }
@@ -583,17 +584,23 @@
 
   // Abseil doesn't support throwing overloaded operator delete.  These are
   // provided so a throwing operator-new can clean up after itself.
-  void operator delete(void* p) noexcept { ::operator delete(p); }
+  ABSL_ATTRIBUTE_NOINLINE void operator delete(void* p) noexcept {
+    ::operator delete(p);
+  }
 
   template <typename... Args>
-  void operator delete(void* p, Args&&... args) noexcept {
+  ABSL_ATTRIBUTE_NOINLINE void operator delete(void* p,
+                                               Args&&... args) noexcept {
     ::operator delete(p, std::forward<Args>(args)...);
   }
 
-  void operator delete[](void* p) noexcept { return ::operator delete[](p); }
+  ABSL_ATTRIBUTE_NOINLINE void operator delete[](void* p) noexcept {
+    return ::operator delete[](p);
+  }
 
   template <typename... Args>
-  void operator delete[](void* p, Args&&... args) noexcept {
+  ABSL_ATTRIBUTE_NOINLINE void operator delete[](void* p,
+                                                 Args&&... args) noexcept {
     return ::operator delete[](p, std::forward<Args>(args)...);
   }
 
diff --git a/absl/cleanup/BUILD.bazel b/absl/cleanup/BUILD.bazel
index da9a9be..8abe61e 100644
--- a/absl/cleanup/BUILD.bazel
+++ b/absl/cleanup/BUILD.bazel
@@ -78,3 +78,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/container/BUILD.bazel b/absl/container/BUILD.bazel
index 850eaec..a449b2c 100644
--- a/absl/container/BUILD.bazel
+++ b/absl/container/BUILD.bazel
@@ -845,6 +845,7 @@
     srcs = ["internal/raw_hash_set_test.cc"],
     copts = ABSL_TEST_COPTS,
     linkstatic = 1,
+    shard_count = 4,
     tags = NOTEST_TAGS_MOBILE + [
         "no_test_chromiumos_arm",
         "no_test_chromiumos_armv7",
@@ -1523,3 +1524,16 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/container/CMakeLists.txt b/absl/container/CMakeLists.txt
index 7a2641c..0c07fed 100644
--- a/absl/container/CMakeLists.txt
+++ b/absl/container/CMakeLists.txt
@@ -87,6 +87,8 @@
     absl::test_allocator
     absl::test_instance_tracker
     GTest::gmock_main
+  SHARD_COUNT
+    10
 )
 
 absl_cc_test(
@@ -106,6 +108,8 @@
     absl::flags
     absl::raw_logging_internal
     GTest::gmock_main
+  SHARD_COUNT
+    10
 )
 
 # Internal-only target, do not depend on directly.
@@ -871,6 +875,8 @@
     absl::test_instance_tracker
     absl::type_traits
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 # Internal-only target, do not depend on directly.
diff --git a/absl/crc/BUILD.bazel b/absl/crc/BUILD.bazel
index 7d634ce..e3cab50 100644
--- a/absl/crc/BUILD.bazel
+++ b/absl/crc/BUILD.bazel
@@ -215,3 +215,16 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/crc/CMakeLists.txt b/absl/crc/CMakeLists.txt
index fb9beea..e50b242 100644
--- a/absl/crc/CMakeLists.txt
+++ b/absl/crc/CMakeLists.txt
@@ -122,6 +122,8 @@
     absl::string_view
     absl::strings
     GTest::gtest_main
+  SHARD_COUNT
+    3
 )
 
 absl_cc_test(
diff --git a/absl/debugging/BUILD.bazel b/absl/debugging/BUILD.bazel
index 24e5280..66cb3df 100644
--- a/absl/debugging/BUILD.bazel
+++ b/absl/debugging/BUILD.bazel
@@ -472,3 +472,16 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/flags/BUILD.bazel b/absl/flags/BUILD.bazel
index 59771c7..f486a61 100644
--- a/absl/flags/BUILD.bazel
+++ b/absl/flags/BUILD.bazel
@@ -641,3 +641,16 @@
         "@googletest//:gtest",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/flags/CMakeLists.txt b/absl/flags/CMakeLists.txt
index 0e40085..162b654 100644
--- a/absl/flags/CMakeLists.txt
+++ b/absl/flags/CMakeLists.txt
@@ -455,6 +455,8 @@
     absl::flags_internal
     absl::time
     GTest::gmock_main
+  SHARD_COUNT
+    31
 )
 
 absl_cc_test(
diff --git a/absl/functional/BUILD.bazel b/absl/functional/BUILD.bazel
index 0cad083..8ff4630 100644
--- a/absl/functional/BUILD.bazel
+++ b/absl/functional/BUILD.bazel
@@ -208,3 +208,16 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/hash/BUILD.bazel b/absl/hash/BUILD.bazel
index fe76a1d..ae0972e 100644
--- a/absl/hash/BUILD.bazel
+++ b/absl/hash/BUILD.bazel
@@ -89,6 +89,7 @@
     ],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     deps = [
         ":hash",
         ":hash_testing",
@@ -225,3 +226,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/hash/CMakeLists.txt b/absl/hash/CMakeLists.txt
index 2ced4b1..f8e7afa 100644
--- a/absl/hash/CMakeLists.txt
+++ b/absl/hash/CMakeLists.txt
@@ -78,6 +78,8 @@
     absl::string_view
     absl::strings
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
diff --git a/absl/log/BUILD.bazel b/absl/log/BUILD.bazel
index 2c0a8ff..80dd3e5 100644
--- a/absl/log/BUILD.bazel
+++ b/absl/log/BUILD.bazel
@@ -315,6 +315,7 @@
     srcs = ["absl_check_test.cc"],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     tags = [
         "no_test:os:ios",
         "no_test_ios",
@@ -350,6 +351,7 @@
     srcs = ["check_test.cc"],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     tags = [
         "no_test:os:ios",
         "no_test_ios",
@@ -715,3 +717,16 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/log/CMakeLists.txt b/absl/log/CMakeLists.txt
index ebc24f3..1da38e4 100644
--- a/absl/log/CMakeLists.txt
+++ b/absl/log/CMakeLists.txt
@@ -838,6 +838,8 @@
     absl::string_view
     absl::strings
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
@@ -883,6 +885,8 @@
     absl::string_view
     absl::strings
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
diff --git a/absl/log/internal/BUILD.bazel b/absl/log/internal/BUILD.bazel
index 42114ed..eb0525e 100644
--- a/absl/log/internal/BUILD.bazel
+++ b/absl/log/internal/BUILD.bazel
@@ -595,3 +595,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/memory/BUILD.bazel b/absl/memory/BUILD.bazel
index 76fee58..6cac4e5 100644
--- a/absl/memory/BUILD.bazel
+++ b/absl/memory/BUILD.bazel
@@ -62,3 +62,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/meta/BUILD.bazel b/absl/meta/BUILD.bazel
index a4b79cc..dabd160 100644
--- a/absl/meta/BUILD.bazel
+++ b/absl/meta/BUILD.bazel
@@ -113,3 +113,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/numeric/BUILD.bazel b/absl/numeric/BUILD.bazel
index bc9670d..b8752ea 100644
--- a/absl/numeric/BUILD.bazel
+++ b/absl/numeric/BUILD.bazel
@@ -147,3 +147,16 @@
         "//absl/base:config",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/profiling/BUILD.bazel b/absl/profiling/BUILD.bazel
index 2d9ecc6..3a2228d 100644
--- a/absl/profiling/BUILD.bazel
+++ b/absl/profiling/BUILD.bazel
@@ -194,3 +194,16 @@
         "//absl/types:span",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/random/BUILD.bazel b/absl/random/BUILD.bazel
index edc4e93..aa57977 100644
--- a/absl/random/BUILD.bazel
+++ b/absl/random/BUILD.bazel
@@ -199,6 +199,7 @@
     srcs = ["bernoulli_distribution_test.cc"],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     deps = [
         ":distributions",
         ":random",
@@ -217,6 +218,7 @@
     copts = ABSL_TEST_COPTS,
     flaky = 1,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     tags = [
         "no_test_wasm",
     ],
@@ -326,6 +328,7 @@
     ],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     tags = [
         # Too Slow.
         "no_test_android_arm",
@@ -571,3 +574,16 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/random/CMakeLists.txt b/absl/random/CMakeLists.txt
index 8a31015..f9d2d60 100644
--- a/absl/random/CMakeLists.txt
+++ b/absl/random/CMakeLists.txt
@@ -272,6 +272,8 @@
     absl::random_random
     GTest::gmock
     GTest::gtest_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
@@ -295,6 +297,8 @@
     absl::strings
     GTest::gmock
     GTest::gtest_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
@@ -398,6 +402,8 @@
     absl::strings
     GTest::gmock
     GTest::gtest_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
diff --git a/absl/random/internal/BUILD.bazel b/absl/random/internal/BUILD.bazel
index 04f9a27..3afc77d 100644
--- a/absl/random/internal/BUILD.bazel
+++ b/absl/random/internal/BUILD.bazel
@@ -877,3 +877,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/status/BUILD.bazel b/absl/status/BUILD.bazel
index 3508b11..b089a19 100644
--- a/absl/status/BUILD.bazel
+++ b/absl/status/BUILD.bazel
@@ -300,3 +300,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/strings/BUILD.bazel b/absl/strings/BUILD.bazel
index 7711ad2..04aa77c 100644
--- a/absl/strings/BUILD.bazel
+++ b/absl/strings/BUILD.bazel
@@ -598,6 +598,7 @@
     timeout = "long",
     srcs = ["internal/cord_rep_btree_test.cc"],
     copts = ABSL_TEST_COPTS,
+    shard_count = 4,
     visibility = ["//visibility:private"],
     deps = [
         ":cord_internal",
@@ -1039,6 +1040,7 @@
     timeout = "long",
     srcs = ["cord_test.cc"],
     copts = ABSL_TEST_COPTS,
+    shard_count = 4,
     visibility = ["//visibility:private"],
     deps = [
         ":cord",
@@ -1565,6 +1567,7 @@
     timeout = "long",
     srcs = ["internal/str_format/convert_test.cc"],
     copts = ABSL_TEST_COPTS,
+    shard_count = 4,
     visibility = ["//visibility:private"],
     deps = [
         ":str_format",
@@ -1709,3 +1712,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/strings/CMakeLists.txt b/absl/strings/CMakeLists.txt
index 1461d94..8ba84b5 100644
--- a/absl/strings/CMakeLists.txt
+++ b/absl/strings/CMakeLists.txt
@@ -714,6 +714,8 @@
     absl::string_view
     absl::strings
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
@@ -1196,6 +1198,8 @@
     absl::string_view
     absl::strings
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
@@ -1233,6 +1237,8 @@
     absl::string_view
     absl::strings
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
diff --git a/absl/strings/match.h b/absl/strings/match.h
index 431d4f5..65bd8aa 100644
--- a/absl/strings/match.h
+++ b/absl/strings/match.h
@@ -80,7 +80,8 @@
   if (text.size() < suffix.size()) {
     return false;
   }
-  absl::string_view possible_match = text.substr(text.size() - suffix.size());
+  absl::string_view possible_match =
+      text.substr(text.size() - suffix.size(), suffix.size());
   return possible_match == suffix;
 }
 // StrContainsIgnoreCase()
diff --git a/absl/synchronization/BUILD.bazel b/absl/synchronization/BUILD.bazel
index 977af61..cdd37ac 100644
--- a/absl/synchronization/BUILD.bazel
+++ b/absl/synchronization/BUILD.bazel
@@ -382,6 +382,7 @@
     copts = ABSL_TEST_COPTS,
     flaky = 1,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     deps = [
         ":kernel_timeout_internal",
         ":synchronization",
@@ -410,3 +411,16 @@
         "//absl/log:check",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/synchronization/CMakeLists.txt b/absl/synchronization/CMakeLists.txt
index 3502d11..50129ce 100644
--- a/absl/synchronization/CMakeLists.txt
+++ b/absl/synchronization/CMakeLists.txt
@@ -198,6 +198,8 @@
     absl::thread_pool
     absl::time
     GTest::gmock_main
+  SHARD_COUNT
+    25
 )
 
 absl_cc_test(
@@ -278,6 +280,8 @@
     absl::thread_pool
     absl::time
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
diff --git a/absl/time/BUILD.bazel b/absl/time/BUILD.bazel
index eaea38a..3ba8d28 100644
--- a/absl/time/BUILD.bazel
+++ b/absl/time/BUILD.bazel
@@ -181,6 +181,7 @@
     ],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    shard_count = 4,
     deps = [
         ":clock_interface",
         ":simulated_clock",
@@ -248,3 +249,16 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/time/CMakeLists.txt b/absl/time/CMakeLists.txt
index b141b62..79b99e8 100644
--- a/absl/time/CMakeLists.txt
+++ b/absl/time/CMakeLists.txt
@@ -202,6 +202,8 @@
     absl::synchronization
     absl::time
     GTest::gmock_main
+  SHARD_COUNT
+    4
 )
 
 absl_cc_test(
diff --git a/absl/time/internal/cctz/BUILD.bazel b/absl/time/internal/cctz/BUILD.bazel
index edec282..a1577a0 100644
--- a/absl/time/internal/cctz/BUILD.bazel
+++ b/absl/time/internal/cctz/BUILD.bazel
@@ -231,3 +231,16 @@
     srcs = glob(["testdata/zoneinfo/**"]),
     visibility = ["//absl/time:__subpackages__"],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/types/BUILD.bazel b/absl/types/BUILD.bazel
index f36fc4b..ccbd53e 100644
--- a/absl/types/BUILD.bazel
+++ b/absl/types/BUILD.bazel
@@ -275,3 +275,16 @@
         "@googletest//:gtest_main",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/absl/utility/BUILD.bazel b/absl/utility/BUILD.bazel
index 85e1817..3eba7bf 100644
--- a/absl/utility/BUILD.bazel
+++ b/absl/utility/BUILD.bazel
@@ -46,3 +46,16 @@
         "//absl/meta:type_traits",
     ],
 )
+
+filegroup(
+    name = "cmake_srcs",
+    srcs = glob(
+        ["**"],
+        allow_empty = True,
+        exclude = [
+            "BUILD",
+            "BUILD.bazel",
+        ],
+    ),
+    visibility = ["//:__pkg__"],
+)
diff --git a/ci/BUILD.bazel b/ci/BUILD.bazel
index f8a7e58..4a1caac 100644
--- a/ci/BUILD.bazel
+++ b/ci/BUILD.bazel
@@ -23,7 +23,21 @@
     exec_properties = {
         "OSArch": "amd64",
         "cache-silo-key": "n2-highcpu-2-2026-10-14",
-        "container-image": "docker://gcr.io/google.com/absl-177019/oss-linux-latest@sha256:fd9e2ce179533e027466d47157a7581aec99de5a72b46ac43165a5d58855d3ba",
+        "container-image": "docker://gcr.io/google.com/absl-177019/oss-linux-latest@sha256:9f7f104e4857e3528e8bf5f14968183f5a0e786ca9ef63601eae4e4136f011d6",
+        "dockerRunAsRoot": "true",
+    },
+)
+
+platform(
+    name = "rbe-floor",
+    constraint_values = [
+        "@platforms//os:linux",
+        "@platforms//cpu:x86_64",
+    ],
+    exec_properties = {
+        "OSArch": "amd64",
+        "cache-silo-key": "n2-highcpu-2-2026-10-14",
+        "container-image": "docker://gcr.io/google.com/absl-177019/oss-linux-floor@sha256:81041c514c7ee412a5677afc652b9eb3a02e0f6dfe8d71164d80e6e39820b09d",
         "dockerRunAsRoot": "true",
     },
 )
@@ -37,7 +51,7 @@
     exec_properties = {
         "OSArch": "arm64",
         "cache-silo-key": "t2a-standard-4-2026-10-14",
-        "container-image": "docker://gcr.io/google.com/absl-177019/oss-linux-latest@sha256:fd9e2ce179533e027466d47157a7581aec99de5a72b46ac43165a5d58855d3ba",
+        "container-image": "docker://gcr.io/google.com/absl-177019/oss-linux-latest@sha256:9f7f104e4857e3528e8bf5f14968183f5a0e786ca9ef63601eae4e4136f011d6",
         "dockerRunAsRoot": "true",
     },
 )
diff --git a/ci/cmake.bzl b/ci/cmake.bzl
new file mode 100644
index 0000000..3e4f98c
--- /dev/null
+++ b/ci/cmake.bzl
@@ -0,0 +1,160 @@
+# Copyright 2026 The Abseil Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""CMake build and test targets using rules_foreign_cc."""
+
+load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")
+load("@rules_shell//shell:sh_test.bzl", "sh_test")
+
+def _write_executable_impl(ctx):
+    out = ctx.actions.declare_file(ctx.label.name + ".sh")
+    ctx.actions.write(
+        output = out,
+        content = ctx.attr.content,
+        is_executable = True,
+    )
+    return [DefaultInfo(files = depset([out]), executable = out)]
+
+_write_executable = rule(
+    implementation = _write_executable_impl,
+    attrs = {
+        "content": attr.string(mandatory = True),
+    },
+)
+
+def define_cmake_tests():
+    """Defines CMake build and test targets for static, shared, and monolithic-shared modes."""
+    native.config_setting(
+        name = "cmake_opt_mode",
+        values = {"compilation_mode": "opt"},
+    )
+
+    for mode, shared, monolithic in [
+        ("static", "OFF", "OFF"),
+        ("shared", "ON", "OFF"),
+        ("monolithic_shared", "ON", "ON"),
+    ]:
+        build_target = "cmake_build_" + mode
+        script_name = "cmake_test_" + mode + "_ok.sh"
+        base_cache_entries = {
+            "ABSL_BUILD_MONOLITHIC_SHARED_LIBS": monolithic,
+            "ABSL_BUILD_TESTING": "ON",
+            "ABSL_GOOGLETEST_DOWNLOAD_URL": "file://$$EXT_BUILD_ROOT$$/$(execpath @googletest_archive//" + "file)",
+            "BUILD_SHARED_LIBS": shared,
+            "CMAKE_CXX_COMPILER": "g++",
+            "CMAKE_CXX_FLAGS": "-Werror",
+            "CMAKE_CXX_FLAGS_DEBUG": "-Og",
+            "CMAKE_CXX_STANDARD": "17",
+            "CMAKE_C_COMPILER": "gcc",
+            "CMAKE_C_FLAGS": "-Werror",
+            "CMAKE_C_FLAGS_DEBUG": "-Og",
+            "CMAKE_EXE_LINKER_FLAGS_DEBUG": "",
+            "CMAKE_SHARED_LINKER_FLAGS_DEBUG": "",
+        }
+        cmake(
+            name = build_target,
+            testonly = True,
+            build_data = ["@googletest_archive//" + "file"],
+            cache_entries = select({
+                ":cmake_opt_mode": base_cache_entries | {"CMAKE_BUILD_TYPE": "Release"},
+                "//conditions:default": base_cache_entries | {"CMAKE_BUILD_TYPE": "Debug"},
+            }),
+            generate_args = ["-GNinja"],
+            install = False,
+            lib_source = "//:cmake_srcs",
+            out_binaries = [script_name],
+            postfix_script = """
+                TZDIR="$$EXT_BUILD_ROOT$$/absl/time/internal/cctz/testdata/zoneinfo" \
+                  "$$(dirname $$CMAKE$$)/ctest" --output-on-failure --repeat until-pass:3 -j$$(nproc)
+                mkdir -p "$$INSTALLDIR$$/bin"
+                printf '#!/bin/sh\\nexit 0\\n' > "$$INSTALLDIR$$/bin/{script_name}"
+                chmod +x "$$INSTALLDIR$$/bin/{script_name}"
+            """.format(script_name = script_name),
+            tags = [
+                "cmake",
+                "manual",
+            ],
+            targets = ["all"],
+        )
+
+        ok_runner = "cmake_" + mode + "_ok"
+        _write_executable(
+            name = ok_runner,
+            testonly = True,
+            content = "#!/bin/sh\nexit 0\n",
+            tags = [
+                "cmake",
+                "manual",
+            ],
+        )
+
+        sh_test(
+            name = "cmake_" + mode + "_test",
+            size = "enormous",
+            srcs = [":" + ok_runner],
+            data = [":" + build_target],
+            tags = [
+                "cmake",
+                "manual",
+            ],
+        )
+
+    for mode, link_type in [("static", "STATIC"), ("shared", "DYNAMIC")]:
+        runner_name = "cmake_install_" + mode + "_runner"
+        _write_executable(
+            name = runner_name,
+            testonly = True,
+            content = """#!/bin/bash
+set -euo pipefail
+export LINK_TYPE="{link_type}"
+export ABSL_GOOGLETEST_VERSION="1.18.0"
+export ABSL_GOOGLETEST_DOWNLOAD_URL="file://$(realpath "$1")"
+export CC=gcc
+export CXX=g++
+export CMAKE_GENERATOR=Ninja
+export CMAKE_BUILD_PARALLEL_LEVEL="$(nproc)"
+export CTEST_PARALLEL_LEVEL="$(nproc)"
+WORKDIR="$(mktemp -d "${{TEST_TMPDIR}}/absl_install_test.XXXXXX")"
+cp -RL CMakeLists.txt CMake MODULE.bazel absl create_lts.py "${{WORKDIR}}/"
+chmod -R u+w "${{WORKDIR}}"
+export TZDIR="${{WORKDIR}}/absl/time/internal/cctz/testdata/zoneinfo"
+export HOME="${{TEST_TMPDIR}}"
+rm -rf /buildfs /googletest_builddir
+cd "${{WORKDIR}}"
+exec ./CMake/install_test_project/test.sh
+""".format(link_type = link_type),
+            tags = [
+                "cmake",
+                "manual",
+            ],
+        )
+
+        sh_test(
+            name = "cmake_install_" + mode + "_test",
+            size = "enormous",
+            srcs = [":" + runner_name],
+            args = ["$(rootpath @googletest_archive//" + "file)"],
+            data = [
+                "//:cmake_srcs",
+                "@googletest_archive//" + "file",
+            ],
+            tags = [
+                "cmake",
+                "manual",
+            ],
+            target_compatible_with = select({
+                ":cmake_opt_mode": [],
+                "//conditions:default": ["@platforms//:incompatible"],
+            }),
+        )