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
This commit is contained in:
Abseil Team 2024-12-23 13:32:38 -08:00 committed by Copybara-Service
parent f3c355f9dd
commit e54519b094
2 changed files with 59 additions and 22 deletions

View File

@ -39,29 +39,38 @@ module(
# Only direct dependencies need to be listed below. # Only direct dependencies need to be listed below.
# Please keep the versions in sync with the versions in the WORKSPACE file. # Please keep the versions in sync with the versions in the WORKSPACE file.
bazel_dep(name = "abseil-cpp", bazel_dep(
version = "20240116.2") 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", bazel_dep(
version = "0.0.10") name = "rules_python",
bazel_dep(name = "re2",
version = "2024-07-02")
bazel_dep(name = "rules_python",
version = "0.34.0", version = "0.34.0",
dev_dependency = True) dev_dependency = True,
)
# https://rules-python.readthedocs.io/en/stable/toolchains.html#library-modules-with-dev-only-python-usage # https://rules-python.readthedocs.io/en/stable/toolchains.html#library-modules-with-dev-only-python-usage
python = use_extension( python = use_extension(
"@rules_python//python/extensions:python.bzl", "@rules_python//python/extensions:python.bzl",
"python", "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", # See fake_fuchsia_sdk.bzl for instructions on how to override this with a real SDK, if needed.
is_default = True, fuchsia_sdk = use_extension("//:fake_fuchsia_sdk.bzl", "fuchsia_sdk")
ignore_root_user_error = True) fuchsia_sdk.create_fake()
use_repo(fuchsia_sdk, "fuchsia_sdk")
fake_fuchsia_sdk = use_repo_rule("//:fake_fuchsia_sdk.bzl", "fake_fuchsia_sdk")
fake_fuchsia_sdk(name = "fuchsia_sdk")

View File

@ -1,10 +1,20 @@
"""Provides a fake @fuchsia_sdk implementation that's used when the real one isn't available. """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: GoogleTest can be used with the [Fuchsia](https://fuchsia.dev/) SDK. However,
`bazel query "deps(set(//googletest/test:gtest_all_test))"`) will fail if @fuchsia_sdk is not because the Fuchsia SDK does not yet support bzlmod, GoogleTest's `MODULE.bazel`
defined when bazel is evaluating the transitive closure of the query target. 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): 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},
)