1"""Repository rule for Android SDK and NDK autoconfiguration.
2
3This rule is a no-op unless the required android environment variables are set.
4"""
5
6# Based on https://github.com/tensorflow/tensorflow/tree/34c03ed67692eb76cb3399cebca50ea8bcde064c/third_party/android
7# Workaround for https://github.com/bazelbuild/bazel/issues/14260
8
9_ANDROID_NDK_HOME = "ANDROID_NDK_HOME"
10_ANDROID_SDK_HOME = "ANDROID_HOME"
11
12def _escape_for_windows(path):
13    """Properly escape backslashes for Windows.
14
15    Ideally, we would do this conditionally, but there is seemingly no way to
16    determine whether or not this is being called from Windows.
17    """
18    return path.replace("\\", "\\\\")
19
20def _android_autoconf_impl(repository_ctx):
21    sdk_home = repository_ctx.os.environ.get(_ANDROID_SDK_HOME)
22    ndk_home = repository_ctx.os.environ.get(_ANDROID_NDK_HOME)
23
24    # version 31.0.0 won't work https://stackoverflow.com/a/68036845
25    sdk_rule = ""
26    if sdk_home:
27        sdk_rule = """
28    native.android_sdk_repository(
29        name="androidsdk",
30        path="{}",
31        build_tools_version="30.0.3",
32    )
33""".format(_escape_for_windows(sdk_home))
34
35    # Note that Bazel does not support NDK 22 yet, and Bazel 3.7.1 only
36    # supports up to API level 29 for NDK 21
37    ndk_rule = ""
38    if ndk_home:
39        ndk_rule = """
40    native.android_ndk_repository(
41        name="androidndk",
42        path="{}",
43    )
44""".format(_escape_for_windows(ndk_home))
45
46    if ndk_rule == "" and sdk_rule == "":
47        sdk_rule = "pass"
48
49    repository_ctx.file("BUILD.bazel", "")
50    repository_ctx.file("android_configure.bzl", """
51def android_workspace():
52    {}
53    {}
54    """.format(sdk_rule, ndk_rule))
55
56android_configure = repository_rule(
57    implementation = _android_autoconf_impl,
58    environ = [
59        _ANDROID_NDK_HOME,
60        _ANDROID_SDK_HOME,
61    ],
62)
63