tree: 2f8fc85b675d9f002fa7380bb4b4f4da4a226ccb [path history] [tgz]
  1. trampolines/
  2. BUILD.bazel
  3. download_toolchains.bzl
  4. ndk.BUILD
  5. ndk_cc_toolchain_config.bzl
  6. README.md
toolchain/README.md

Hermetic Android NDK C++ toolchain

This directory defines a hermetic C++ toolchain suite to compile with the Android NDK.

Motivation

Bazel has a built-in android_ndk_repository rule, which generates C++ toolchains based on a local NDK installation provided via the ANDROID_NDK_HOME environment variable. However, this rule breaks hermeticity, and requires the user to provide an NDK installation.

This directory provides a download_android_ndk repository rule, which downloads the Android NDK under external/android_ndk, and a C++ toolchain suite that targets 32- and 64-bit ARM.

Design

The C++ toolchain suite is based on the C++ toolchain generated by the android_ndk_repository rule.

Steps taken:

  • Build SkCMS with the android_ndk_repository rule at this revision.
  • Inspect the contents of bazel-skcms/external/androidndk/BUILD.bazel and bazel-skcms/external/androidndk/cc_toolchain_config.bzl, which are generated by said rule.
  • Extract the useful parts into the C++ toolchain defined in this directory.

Trampoline scripts

The cc_common.create_cc_toolchain_config_info function expects tool paths to point to files under the directory in which it is invoked. This means we cannot directly reference tools under external/android_ndk. The solution is to use “trampoline” scripts that pass through any command-line arguments to the NDK binaries under external/android_sdk.