diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index f46590b74..389ad7698 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -109,7 +109,6 @@ tasks: ubuntu2004_basicapp_bzlmod: name: "Basic app ubuntu bzlmod" platform: ubuntu2004 - name: basicapp working_directory: examples/basicapp build_flags: <<: *rules_flags @@ -135,4 +134,3 @@ tasks: ? "--enable_bzlmod" build_targets: - "//java/com/basicapp:basic_app" - diff --git a/BUILD b/BUILD index c0770f093..d44ac2d2c 100644 --- a/BUILD +++ b/BUILD @@ -53,3 +53,31 @@ platform( "@platforms//os:android", ], ) + +# TODO: remove these alias when we no longer needs bind in WORKSPACE.bzlmod +# Because @androidsdk is not defined in WORKSPACE.bzl, where the only valid place +# we can call native function bind. Using these alias to forward the binding. +alias( + name = "androidsdk_sdk", + actual = "@androidsdk//:sdk", +) + +alias( + name = "androidsdk_d8_jar_import", + actual = "@androidsdk//:d8_jar_import", +) + +alias( + name = "androidsdk_dx_jar_import", + actual = "@androidsdk//:dx_jar_import", +) + +alias( + name = "androidsdk_files", + actual = "@androidsdk//:files", +) + +alias( + name = "androidsdk_has_android_sdk", + actual = "@androidsdk//:has_android_sdk", +) diff --git a/MODULE.bazel b/MODULE.bazel index e7533b66d..3c63cf6ca 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -98,4 +98,23 @@ git_override( module_name = "rules_robolectric", remote = "https://github.com/robolectric/robolectric-bazel", commit = "a5b25a8c27cc6add74bb01e62cd0dc72df8933ff", -) \ No newline at end of file +) + +android_sdk_repository_extension = use_extension("//rules/android_sdk_repository:rule.bzl", "android_sdk_repository_extension") +use_repo(android_sdk_repository_extension, "androidsdk") + +android_sdk_proxy_extensions = use_extension("@bazel_tools//tools/android:android_extensions.bzl", "android_sdk_proxy_extensions") +android_sdk_proxy_extensions.configure( + has_androidsdk = "@androidsdk//:has_androidsdk", + dx_jar_import = "@androidsdk//:dx_jar_import", + android_sdk_for_testing = "@androidsdk//:files", +) +use_repo(android_sdk_proxy_extensions, "android_external") + +register_toolchains("@androidsdk//:sdk-toolchain") +register_toolchains("@androidsdk//:all") + +register_toolchains( + "@androidsdk//:sdk-toolchain", + "@androidsdk//:all", +) diff --git a/WORKSPACE b/WORKSPACE index 68bfc9ead..3cebe4945 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -22,6 +22,14 @@ load("defs_dev.bzl", "rules_android_workspace") rules_android_workspace() +load("@bazel_tools//tools/android:android_extensions.bzl", "android_external_repository") +android_external_repository( + name = "android_external", + has_androidsdk = "@androidsdk//:has_androidsdk", + dx_jar_import = "@androidsdk//:dx_jar_import", + android_sdk_for_testing = "@androidsdk//:files", +) + register_toolchains("//toolchains/android:all") register_toolchains("//toolchains/android_sdk:all") diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod index 5b3a8b6aa..c9b854fd2 100644 --- a/WORKSPACE.bzlmod +++ b/WORKSPACE.bzlmod @@ -2,14 +2,15 @@ workspace(name = "rules_android") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") -load("//rules:rules.bzl", "android_sdk_repository") - -maybe( - android_sdk_repository, - name = "androidsdk", -) maybe( android_ndk_repository, name = "androidndk", ) + + +# Temporary until we break all //external:android dependency +bind(name = "android/sdk", actual = "//:androidsdk_sdk") +bind(name = "android/dx_jar_import", actual = "//:androidsdk_dx_jar_import") +bind(name = "android_sdk_for_testing", actual = "//:androidsdk_files") +bind(name = "has_android_sdk", actual = "//:androidsdk_has_android_sdk") diff --git a/examples/basicapp/BUILD b/examples/basicapp/BUILD index a09fce916..3c2a78210 100644 --- a/examples/basicapp/BUILD +++ b/examples/basicapp/BUILD @@ -1 +1,27 @@ -# Empty build file to satisfy gazelle for rules_go. \ No newline at end of file +# Empty build file to satisfy gazelle for rules_go. + +# TODO: remove these alias when ../..//BUILD remove them +alias( + name = "androidsdk_sdk", + actual = "@androidsdk//:sdk", +) + +alias( + name = "androidsdk_d8_jar_import", + actual = "@androidsdk//:d8_jar_import", +) + +alias( + name = "androidsdk_dx_jar_import", + actual = "@androidsdk//:dx_jar_import", +) + +alias( + name = "androidsdk_files", + actual = "@androidsdk//:files", +) + +alias( + name = "androidsdk_has_android_sdk", + actual = "@androidsdk//:has_android_sdk", +) diff --git a/examples/basicapp/MODULE.bazel b/examples/basicapp/MODULE.bazel index e8fb37cf5..f2a66c377 100644 --- a/examples/basicapp/MODULE.bazel +++ b/examples/basicapp/MODULE.bazel @@ -7,3 +7,35 @@ bazel_dep(name = "rules_jvm_external", version = "4.5") bazel_dep(name = "bazel_skylib", version = "1.3.0") remote_android_extensions = use_extension("@bazel_tools//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("@bazel_tools//tools/android:android_extensions.bzl", "android_sdk_proxy_extensions") +android_sdk_proxy_extensions.configure( + has_androidsdk = "@androidsdk//:has_androidsdk", + dx_jar_import = "@androidsdk//:dx_jar_import", + android_sdk_for_testing = "@androidsdk//:files", +) +use_repo(android_sdk_proxy_extensions, "android_external") + + +bazel_dep( + name = "rules_android", + version = "0.1.1", +) + +local_path_override( + module_name = "rules_android", + path = "../../", +) + +register_toolchains( + "@rules_android//toolchains/android:android_default_toolchain", + "@rules_android//toolchains/android_sdk:android_sdk_tools", +) + +android_sdk_repository_extension = use_extension("@rules_android//rules/android_sdk_repository:rule.bzl", "android_sdk_repository_extension") +use_repo(android_sdk_repository_extension, "androidsdk") + +register_toolchains( + "@androidsdk//:sdk-toolchain", + "@androidsdk//:all", +) diff --git a/examples/basicapp/WORKSPACE b/examples/basicapp/WORKSPACE index 601e6b807..0bdc5bf96 100644 --- a/examples/basicapp/WORKSPACE +++ b/examples/basicapp/WORKSPACE @@ -41,3 +41,10 @@ register_toolchains( "@rules_android//toolchains/android_sdk:android_sdk_tools", ) +load("@bazel_tools//tools/android:android_extensions.bzl", "android_external_repository") +android_external_repository( + name = "android_external", + has_androidsdk = "@androidsdk//:has_androidsdk", + dx_jar_import = "@androidsdk//:dx_jar_import", + android_sdk_for_testing = "@androidsdk//:files", +) diff --git a/examples/basicapp/WORKSPACE.bzlmod b/examples/basicapp/WORKSPACE.bzlmod index 617f9b1b2..57a3f6715 100644 --- a/examples/basicapp/WORKSPACE.bzlmod +++ b/examples/basicapp/WORKSPACE.bzlmod @@ -1,21 +1,15 @@ -local_repository( - name = "rules_android", - path = "../..", # rules_android's WORKSPACE relative to this inner workspace -) +workspace(name = "basicapp") -load("@rules_android//:prereqs.bzl", "rules_android_prereqs") -rules_android_prereqs() -load("@rules_android//:defs.bzl", "rules_android_workspace") -rules_android_workspace() - -load("@rules_android//rules:rules.bzl", "android_sdk_repository") -android_sdk_repository( - name = "androidsdk", -) - -register_toolchains( - "@rules_android//toolchains/android:android_default_toolchain", - "@rules_android//toolchains/android_sdk:android_sdk_tools", -) +# local_repository( +# name = "rules_android", +# path = "../../" +# ) +# load("@rules_android//rules/android_sdk_repository:rule.bzl", "android_sdk_repository") +# android_sdk_repository(name = "androidsdk") +# Temporary until we break all //external:android dependency +bind(name = "android/sdk", actual = "@//:androidsdk_sdk") +bind(name = "android/dx_jar_import", actual = "@//:androidsdk_dx_jar_import") +bind(name = "android_sdk_for_testing", actual = "//:androidsdk_files") +bind(name = "has_android_sdk", actual = "//:androidsdk_has_android_sdk") diff --git a/rules/android_sdk_repository/rule.bzl b/rules/android_sdk_repository/rule.bzl index 01b68ab2e..333e7e707 100644 --- a/rules/android_sdk_repository/rule.bzl +++ b/rules/android_sdk_repository/rule.bzl @@ -209,3 +209,35 @@ def android_sdk_repository( native.register_toolchains("@%s//:sdk-toolchain" % name) native.register_toolchains("@%s//:all" % name) + +def _android_sdk_repository_extension_impl(module_ctx): + root_modules = [m for m in module_ctx.modules if m.is_root and m.tags.configure] + 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["api_level"] = module.tags.configure[0].api_level + kwargs["build_tools_version"] = module.tags.configure[0].build_tools_version + kwargs["path"] = module.tags.configure[0].path + + _android_sdk_repository( + name = "androidsdk", + **kwargs + ) + +android_sdk_repository_extension = module_extension( + implementation = _android_sdk_repository_extension_impl, + tag_classes = { + "configure": tag_class(attrs = { + "path": attr.string(), + "api_level": attr.int(), + "build_tools_version": attr.string(), + }), + }, +)