pw_android_toolchain#

Android toolchains differ from pw_toolchain in that the latter defines the tool names and paths at the lowest level, with customisation added at higher levels, while in pw_android_toolchain the tool names and paths are derived from build args and defaults so are defined last by calling pw_generate_android_toolchain.

Setup#

You must first download and unpack a copy of the Android NDK and let Pigweed know where that is located using the pw_android_toolchain_NDK_PATH build arg.

You can set Pigweed build options using gn args out.

Toolchains#

pw_android_toolchain provides GN toolchains that may be used to build Pigweed against an Android NDK. The following toolchains are defined:

  • arm_android_debug

  • arm_android_size_optimized

  • arm_android_speed_optimized

  • arm64_android_debug

  • arm64_android_size_optimized

  • arm64_android_speed_optimized

  • x64_android_debug

  • x64_android_size_optimized

  • x64_android_speed_optimized

  • x86_android_debug

  • x86_android_size_optimized

  • x86_android_speed_optimized

Note

The documentation for this module is currently incomplete.

Defining Toolchains#

Defining Android NDK toolchains is similar to pw_toolchain except that instead of using generate_toolchain use pw_generate_android_toolchain, and ensure that current_cpu is set in the toolchain defaults.

For example:

import("//build_overrides/pigweed.gni")

import("$dir_pw_android_toolchain/toolchains.gni")
import("$dir_pw_android_toolchain/generate_toolchain.gni")

my_target_scope = {
  # Use Pigweed's Android toolchain as a base.
  _toolchain_base = pw_toolchain_android.debug

  # Forward everything except the defaults scope from that toolchain.
  forward_variables_from(_toolchain_base, "*", [ "defaults" ])

  defaults = {
    # Forward everything from the base toolchain's defaults.
    forward_variables_from(_toolchain_base.defaults, "*")

    # Build for 64-bit AArch64 Android devices.
    current_cpu = "arm64"

    # Extend with custom build arguments for the target.
    pw_log_BACKEND = dir_pw_log_tokenized
  }
}

# Create the actual GN toolchain from the scope.
pw_generate_android_toolchain("my_target") {
  forward_variables_from(my_target_scope, "*")
}

Since Android NDKs contain toolchains for all supported targets, as a convenience, pw_generate_android_toolchains does not require that current_cpu is set. If any toolchain scope in the list does not set it, a toolchain for each supported target will be generated.

# Generate arm_*, arm64_*, x64_*, and x86_* for each scope in the list.
pw_generate_android_toolchains("target_toolchains) {
  toolchains = pw_toolchain_android_list
}

Customization#

The Android SDK target version defaults to the value of the pw_android_toolchain_API_LEVEL build arg. You can override this on global level, or on a per-toolchain level by setting api_level in the toolchain defaults.