From e54519b09463cec3aea77a1739e02c97ca766da5 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Mon, 23 Dec 2024 13:32:38 -0800 Subject: [PATCH] Put the fake Fuchsia SDK in a module extension This allows users to override the fake SDK with a real one using https://bazel.build/rules/lib/globals/module#override_repo. Without this change, it is impossible for a project that depends on googletest as a `bazel_dep` to build tests using the "real" Fuchsia SDK, because any references to `@fuchsia_sdk` within googletest `BUILD.bazel` files unconditionally resolve to the "fake" Fuchsia SDK. With this change, if you have the real Fuchsia SDK declared in your `MODULE.bazel`, you can add the following lines to coerce googletest to use the real Fuchsia SDK as well: fake_fuchsia_sdk_extension = use_extension("@com_google_googletest//:fake_fuchsia_sdk.bzl", "fuchsia_sdk") override_repo(fake_fuchsia_sdk_extension, "fuchsia_sdk") PiperOrigin-RevId: 709139784 Change-Id: I4d10d441c76b7a2481f15723a24f11525dba3878 --- MODULE.bazel | 45 ++++++++++++++++++++++++++------------------ fake_fuchsia_sdk.bzl | 36 +++++++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index c9a52e05..e213d43e 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -39,29 +39,38 @@ module( # Only direct dependencies need to be listed below. # Please keep the versions in sync with the versions in the WORKSPACE file. -bazel_dep(name = "abseil-cpp", - version = "20240116.2") +bazel_dep( + name = "abseil-cpp", + version = "20240116.2", +) +bazel_dep( + name = "platforms", + version = "0.0.10", +) +bazel_dep( + name = "re2", + version = "2024-07-02", +) -bazel_dep(name = "platforms", - version = "0.0.10") - -bazel_dep(name = "re2", - version = "2024-07-02") - -bazel_dep(name = "rules_python", - version = "0.34.0", - dev_dependency = True) +bazel_dep( + name = "rules_python", + version = "0.34.0", + dev_dependency = True, +) # https://rules-python.readthedocs.io/en/stable/toolchains.html#library-modules-with-dev-only-python-usage python = use_extension( "@rules_python//python/extensions:python.bzl", "python", - dev_dependency = True + dev_dependency = True, +) +python.toolchain( + ignore_root_user_error = True, + is_default = True, + python_version = "3.12", ) -python.toolchain(python_version = "3.12", - is_default = True, - ignore_root_user_error = True) - -fake_fuchsia_sdk = use_repo_rule("//:fake_fuchsia_sdk.bzl", "fake_fuchsia_sdk") -fake_fuchsia_sdk(name = "fuchsia_sdk") +# See fake_fuchsia_sdk.bzl for instructions on how to override this with a real SDK, if needed. +fuchsia_sdk = use_extension("//:fake_fuchsia_sdk.bzl", "fuchsia_sdk") +fuchsia_sdk.create_fake() +use_repo(fuchsia_sdk, "fuchsia_sdk") diff --git a/fake_fuchsia_sdk.bzl b/fake_fuchsia_sdk.bzl index 2024dc6c..bc5b9273 100644 --- a/fake_fuchsia_sdk.bzl +++ b/fake_fuchsia_sdk.bzl @@ -1,10 +1,20 @@ """Provides a fake @fuchsia_sdk implementation that's used when the real one isn't available. -This is needed since bazel queries on targets that depend on //:gtest (eg: -`bazel query "deps(set(//googletest/test:gtest_all_test))"`) will fail if @fuchsia_sdk is not -defined when bazel is evaluating the transitive closure of the query target. +GoogleTest can be used with the [Fuchsia](https://fuchsia.dev/) SDK. However, +because the Fuchsia SDK does not yet support bzlmod, GoogleTest's `MODULE.bazel` +file by default provides a "fake" Fuchsia SDK. -See https://github.com/google/googletest/issues/4472. +To override this and use the real Fuchsia SDK, you can add the following to your +project's `MODULE.bazel` file: + + fake_fuchsia_sdk_extension = + use_extension("@com_google_googletest//:fake_fuchsia_sdk.bzl", "fuchsia_sdk") + override_repo(fake_fuchsia_sdk_extension, "fuchsia_sdk") + +NOTE: The `override_repo` built-in is only available in Bazel 8.0 and higher. + +See https://github.com/google/googletest/issues/4472 for more details of why the +fake Fuchsia SDK is needed. """ def _fake_fuchsia_sdk_impl(repo_ctx): @@ -31,3 +41,21 @@ fake_fuchsia_sdk = repository_rule( ), }, ) + +_create_fake = tag_class() + +def _fuchsia_sdk_impl(module_ctx): + create_fake_sdk = False + for mod in module_ctx.modules: + for _ in mod.tags.create_fake: + create_fake_sdk = True + + if create_fake_sdk: + fake_fuchsia_sdk(name = "fuchsia_sdk") + + return module_ctx.extension_metadata(reproducible = True) + +fuchsia_sdk = module_extension( + implementation = _fuchsia_sdk_impl, + tag_classes = {"create_fake": _create_fake}, +)