Skip to content

Commit

Permalink
Merge pull request #154 from bandlab/optional-android-sdk-ndk
Browse files Browse the repository at this point in the history
Allow code generation without android SDK/NDK
  • Loading branch information
li-feng-sc committed Nov 22, 2023
2 parents 6aa86dc + f6a5726 commit c7b0a39
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 3 deletions.
7 changes: 4 additions & 3 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ djinni_setup_deps()

# --- Everything below is only used for examples and tests

# android_sdk_repository fails to find build_tools if we don't explicitly set a version.
android_sdk_repository(name = "androidsdk")
android_ndk_repository(name = "androidndk", api_level = 21)
load("//bzl:android_configure.bzl", "android_configure")
android_configure(name = "local_config_android")
load("@local_config_android//:android_configure.bzl", "android_workspace")
android_workspace()

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

Expand Down
58 changes: 58 additions & 0 deletions bzl/android_configure.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""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/envoyproxy/envoy-mobile/pull/2039/
# And: 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 _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)

if sdk_home == "" or ndk_home == "":
print("ANDROID_HOME or ANDROID_NDK_HOME not set. Building android examples will fail.")

sdk_rule = ""
if sdk_home:
sdk_rule = """
native.android_sdk_repository(
name="androidsdk",
path="{}",
api_level=30,
build_tools_version="30.0.2",
)
""".format(sdk_home)

ndk_rule = ""
if ndk_home:
ndk_rule = """
native.android_ndk_repository(
name="androidndk",
path="{}",
api_level=21,
)
""".format(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,
],
)
2 changes: 2 additions & 0 deletions examples/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## Building the Android example app

First make sure that the ANDROID_HOME and ANDROID_NDK_HOME environment variables are set and pointing to working installations of the Android SDK and NDK, respectively.

Build with bazel: `bazel build //examples:android-app`.

Build and deploy to device: `bazel mobile-install //examples:android-app`.
Expand Down

0 comments on commit c7b0a39

Please sign in to comment.