| """Repository rule for Android SDK and NDK autoconfiguration. |
| |
| `android_configure` depends on the following environment variables: |
| |
| * `ANDROID_NDK_HOME`: Location of Android NDK root. |
| * `ANDROID_SDK_HOME`: Location of Android SDK root. |
| * `ANDROID_SDK_API_LEVEL`: Desired Android SDK API version. |
| * `ANDROID_NDK_API_LEVEL`: Desired Android NDK API version. |
| * `ANDROID_BUILD_TOOLS_VERSION`: Desired Android build tools version. |
| |
| |
| Writes Android SDK and NDK rules. |
| |
| Add the following to your WORKSPACE FILE: |
| |
| ```python |
| android_configure(name = "local_config_android") |
| ``` |
| |
| Args: |
| name: A unique name for this workspace rule. |
| """ |
| |
| _ANDROID_NDK_HOME = "ANDROID_NDK_HOME" |
| _ANDROID_SDK_HOME = "ANDROID_SDK_HOME" |
| _ANDROID_NDK_API_VERSION = "ANDROID_NDK_API_LEVEL" |
| _ANDROID_SDK_API_VERSION = "ANDROID_SDK_API_LEVEL" |
| _ANDROID_BUILD_TOOLS_VERSION = "ANDROID_BUILD_TOOLS_VERSION" |
| |
| _ANDROID_SDK_REPO_TEMPLATE = """ |
| native.android_sdk_repository( |
| name="androidsdk", |
| path="%s", |
| api_level=%s, |
| build_tools_version="%s", |
| ) |
| """ |
| |
| _ANDROID_NDK_REPO_TEMPLATE = """ |
| native.android_ndk_repository( |
| name="androidndk", |
| path="%s", |
| api_level=%s, |
| ) |
| """ |
| |
| def _android_autoconf_impl(repository_ctx): |
| """Implementation of the android_autoconf repository rule.""" |
| sdk_home = repository_ctx.os.environ.get(_ANDROID_SDK_HOME) |
| sdk_api_level = repository_ctx.os.environ.get(_ANDROID_SDK_API_VERSION) |
| build_tools_version = repository_ctx.os.environ.get( |
| _ANDROID_BUILD_TOOLS_VERSION, |
| ) |
| ndk_home = repository_ctx.os.environ.get(_ANDROID_NDK_HOME) |
| ndk_api_level = repository_ctx.os.environ.get(_ANDROID_NDK_API_VERSION) |
| |
| sdk_rule = "" |
| if all([sdk_home, sdk_api_level, build_tools_version]): |
| sdk_rule = _ANDROID_SDK_REPO_TEMPLATE % ( |
| sdk_home, |
| sdk_api_level, |
| build_tools_version, |
| ) |
| |
| ndk_rule = "" |
| if all([ndk_home, ndk_api_level]): |
| ndk_rule = _ANDROID_NDK_REPO_TEMPLATE % (ndk_home, ndk_api_level) |
| |
| if ndk_rule == "" and sdk_rule == "": |
| sdk_rule = "pass" |
| # TODO(xunkai): Add interactive configure script. |
| |
| repository_ctx.template( |
| "BUILD", |
| Label("//third_party/android:android_configure.BUILD.tpl"), |
| ) |
| repository_ctx.template( |
| "android.bzl", |
| Label("//third_party/android:android.bzl.tpl"), |
| substitutions = { |
| "MAYBE_ANDROID_SDK_REPOSITORY": sdk_rule, |
| "MAYBE_ANDROID_NDK_REPOSITORY": ndk_rule, |
| }, |
| ) |
| |
| android_configure = repository_rule( |
| implementation = _android_autoconf_impl, |
| environ = [ |
| _ANDROID_SDK_API_VERSION, |
| _ANDROID_NDK_API_VERSION, |
| _ANDROID_BUILD_TOOLS_VERSION, |
| _ANDROID_NDK_HOME, |
| _ANDROID_SDK_HOME, |
| ], |
| ) |