diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 2a561c3d..e88e3eb8 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -103,3 +103,12 @@ tasks: <<: *rules_flags build_targets: - "//java/com/basicapp:basic_app" + basicapp_bzlmod: + platform: ubuntu2004 + name: basicapp Bzlmod + working_directory: examples/basicapp + build_flags: + <<: *rules_flags + ? "--enable_bzlmod" + build_targets: + - "//java/com/basicapp:basic_app" diff --git a/BUILD b/BUILD index c0770f09..d44ac2d2 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 e7533b66..08e78939 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -98,4 +98,15 @@ 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") + +register_toolchains("@androidsdk//:sdk-toolchain") +register_toolchains("@androidsdk//:all") + +register_toolchains( + "@androidsdk//:sdk-toolchain", + "@androidsdk//:all", +) diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod index 5b3a8b6a..668a5980 100644 --- a/WORKSPACE.bzlmod +++ b/WORKSPACE.bzlmod @@ -2,14 +2,18 @@ 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", ) + +# load("//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/d8_jar_import", actual = "//:androidsdk_d8_jar_import") +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 a09fce91..3c2a7821 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 e8fb37cf..caac31fa 100644 --- a/examples/basicapp/MODULE.bazel +++ b/examples/basicapp/MODULE.bazel @@ -7,3 +7,27 @@ 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") + + +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.bzlmod b/examples/basicapp/WORKSPACE.bzlmod index 617f9b1b..86bb06bf 100644 --- a/examples/basicapp/WORKSPACE.bzlmod +++ b/examples/basicapp/WORKSPACE.bzlmod @@ -1,21 +1,16 @@ -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/d8_jar_import", actual = "@//:androidsdk_d8_jar_import") +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 01b68ab2..333e7e70 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(), + }), + }, +)