| """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, |
| ], |
| ) |