blob: 40e7f105deb049e2d7c92a7876ad3735fd2b48fd [file] [log] [blame]
"""Repository rule for Android SDK and NDK autoconfiguration.
This rule is a no-op unless the required android environment variables are set.
"""
# Based on https://github.com/tensorflow/tensorflow/tree/34c03ed67692eb76cb3399cebca50ea8bcde064c/third_party/android
# Workaround for https://github.com/bazelbuild/bazel/issues/14260
_ANDROID_NDK_HOME = "ANDROID_NDK_HOME"
_ANDROID_SDK_HOME = "ANDROID_HOME"
def _escape_for_windows(path):
"""Properly escape backslashes for Windows.
Ideally, we would do this conditionally, but there is seemingly no way to
determine whether or not this is being called from Windows.
"""
return path.replace("\\", "\\\\")
def _android_autoconf_impl(repository_ctx):
sdk_home = repository_ctx.os.environ.get(_ANDROID_SDK_HOME)
ndk_home = repository_ctx.os.environ.get(_ANDROID_NDK_HOME)
# version 31.0.0 won't work https://stackoverflow.com/a/68036845
sdk_rule = ""
if sdk_home:
sdk_rule = """
native.android_sdk_repository(
name="androidsdk",
path="{}",
build_tools_version="30.0.3",
)
""".format(_escape_for_windows(sdk_home))
# Note that Bazel does not support NDK 22 yet, and Bazel 3.7.1 only
# supports up to API level 29 for NDK 21
ndk_rule = ""
if ndk_home:
ndk_rule = """
native.android_ndk_repository(
name="androidndk",
path="{}",
)
""".format(_escape_for_windows(ndk_home))
if ndk_rule == "" and sdk_rule == "":
sdk_rule = "pass"
repository_ctx.file("BUILD.bazel", "")
repository_ctx.file("android_configure.bzl", """
def android_workspace():
{}
{}
""".format(sdk_rule, ndk_rule))
android_configure = repository_rule(
implementation = _android_autoconf_impl,
environ = [
_ANDROID_NDK_HOME,
_ANDROID_SDK_HOME,
],
)