Skip to content

Commit

Permalink
Create a repo rule & module_extension for android sdk proxy
Browse files Browse the repository at this point in the history
@android_external will be Bazel's direct dependency with dummy/falsy value. In android projects, define @android_external with each target pointing to android sdk content.

This is prerequisite to retire //external:android... in bazel/rules_android.

PiperOrigin-RevId: 611595652
Change-Id: I3f308b969b00d394b324c7cef789f79372a1583c
  • Loading branch information
Googler authored and copybara-github committed Feb 29, 2024
1 parent 4bb9b54 commit 7f749e9
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 7 deletions.
3 changes: 3 additions & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -362,3 +362,6 @@ use_repo(bazel_android_deps, "desugar_jdk_libs")

remote_android_extensions = use_extension("//tools/android:android_extensions.bzl", "remote_android_tools_extensions")
use_repo(remote_android_extensions, "android_gmaven_r8", "android_tools")

android_sdk_proxy_extensions = use_extension("//tools/android:android_extensions.bzl", "android_sdk_proxy_extensions")
use_repo(android_sdk_proxy_extensions, "android_external")
42 changes: 38 additions & 4 deletions MODULE.bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/MODULE.tools
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ use_repo(remote_coverage_tools_extension, "remote_coverage_tools")
remote_android_extensions = use_extension("//tools/android:android_extensions.bzl", "remote_android_tools_extensions")
use_repo(remote_android_extensions, "android_gmaven_r8", "android_tools")

android_sdk_proxy_extensions = use_extension("//tools/android:android_extensions.bzl", "android_sdk_proxy_extensions")
use_repo(android_sdk_proxy_extensions, "android_external")

# Used by bazel mod tidy (see BazelModTidyFunction).
buildozer_binary = use_extension("@buildozer//:buildozer_binary.bzl", "buildozer_binary")
use_repo(buildozer_binary, "buildozer_binary")
Expand Down
39 changes: 36 additions & 3 deletions src/test/tools/bzlmod/MODULE.bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

79 changes: 79 additions & 0 deletions tools/android/android_extensions.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,82 @@ def _remote_android_tools_extensions_impl(_ctx):
remote_android_tools_extensions = module_extension(
implementation = _remote_android_tools_extensions_impl,
)

def _android_external_repository_impl(repo_ctx):
repo_ctx.file(
"BUILD",
"""
alias(
name = "has_androidsdk",
actual = "%s",
visibility = ["//visibility:public"],
)
alias(
name = "dx_jar_import",
actual = "%s",
visibility = ["//visibility:public"],
)
alias(
name = "android_sdk_for_testing",
actual = "%s",
visibility = ["//visibility:public"],
)
alias(
name = "android_ndk_for_testing",
actual = "%s",
visibility = ["//visibility:public"],
)
""" % (
repo_ctx.attr.has_androidsdk,
repo_ctx.attr.dx_jar_import,
repo_ctx.attr.android_sdk_for_testing,
repo_ctx.attr.android_ndk_for_testing,
),
)

pass

android_external_repository = repository_rule(
implementation = _android_external_repository_impl,
attrs = {
"has_androidsdk": attr.label(default = "@bazel_tools//tools/android:always_false"),
"dx_jar_import": attr.label(default = "@bazel_tools//tools/android:no_android_sdk_repository_error"),
"android_sdk_for_testing": attr.label(default = "@bazel_tools//tools/android:empty"),
"android_ndk_for_testing": attr.label(default = "@bazel_tools//tools/android:empty"),
},
local = True,
)

def _android_sdk_proxy_extensions_impl(module_ctx):
root_modules = [m for m in module_ctx.modules if m.is_root]
if len(root_modules) > 1:
fail("Expected at most one root module, found {}".format(", ".join([x.name for x in root_modules])))

if root_modules:
module = root_modules[0]
else:
module = module_ctx.modules[0]

kwargs = {}
if module.tags.configure:
kwargs["has_androidsdk"] = module.tags.configure[0].has_androidsdk
kwargs["dx_jar_import"] = module.tags.configure[0].dx_jar_import
kwargs["android_sdk_for_testing"] = module.tags.configure[0].android_sdk_for_testing
kwargs["android_ndk_for_testing"] = module.tags.configure[0].android_ndk_for_testing

android_external_repository(
name = "android_external",
**kwargs
)

android_sdk_proxy_extensions = module_extension(
implementation = _android_sdk_proxy_extensions_impl,
tag_classes = {
"configure": tag_class(attrs = {
"has_androidsdk": attr.label(default = "@bazel_tools//tools/android:always_false"),
"dx_jar_import": attr.label(default = "@bazel_tools//tools/android:no_android_sdk_repository_error"),
"android_sdk_for_testing": attr.label(default = "@bazel_tools//tools/android:empty"),
"android_ndk_for_testing": attr.label(default = "@bazel_tools//tools/android:empty"),
}),
},
)

0 comments on commit 7f749e9

Please sign in to comment.