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"], + }), + )