blob: 55952e1c813de3bac47b4dcfd2dbc37e24c97a88 [file] [log] [blame]
# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
import("//build_overrides/pigweed.gni")
import("$dir_pw_android_toolchain/android.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")
# Creates an Android toolchain target.
#
# Arguments are forwarded to $generate_toolchain.
template("pw_generate_android_toolchain") {
assert(pw_android_toolchain_NDK_PATH != "",
"pw_android_toolchain_NDK_PATH is not set")
assert(defined(invoker.defaults), "toolchain is missing 'defaults'")
invoker_toolchain_args = invoker.defaults
# Build _clang_prefix from "host_os" and "host_cpu".
_host_os = ""
if (host_os == "linux") {
_host_os = "linux"
} else if (host_os == "mac") {
_host_os = "darwin"
} else if (host_os == "win") {
_host_os = "windows"
}
_host_cpu = ""
if (host_cpu == "x64") {
_host_cpu = "-x86_64"
}
_clang_prefix = "${pw_android_toolchain_NDK_PATH}/toolchains/llvm/prebuilt/${_host_os}${_host_cpu}/bin/"
# Build _tool_name_root from "_ndk_cpu" and "api_level".
if (defined(invoker_toolchain_args.api_level)) {
_api_level = invoker_toolchain_args.api_level
} else {
_api_level = pw_android_toolchain_API_LEVEL
}
assert(defined(invoker_toolchain_args.current_cpu),
"toolchain.defaults is missing 'current_cpu'")
if (invoker_toolchain_args.current_cpu == "arm") {
_tool_name_root = "armv7a-linux-androideabi${_api_level}-"
} else if (invoker_toolchain_args.current_cpu == "arm64") {
_tool_name_root = "aarch64-linux-android${_api_level}-"
} else if (invoker_toolchain_args.current_cpu == "x86") {
_tool_name_root = "i686-linux-android${_api_level}-"
} else if (invoker_toolchain_args.current_cpu == "x64") {
_tool_name_root = "x86_64-linux-android${_api_level}-"
} else {
assert(false, "toolchain.defaults.current_cpu unknown or invalid")
}
generate_toolchain(target_name) {
ar = _clang_prefix + "llvm-ar"
cc = _clang_prefix + _tool_name_root + "clang"
cxx = _clang_prefix + _tool_name_root + "clang++"
forward_variables_from(invoker,
"*",
[
"defaults",
"name",
])
defaults = {
current_os = "android"
forward_variables_from(invoker_toolchain_args, "*")
}
}
}
# Creates a series of Android toolchain targets with common compiler options.
#
# Args:
# toolchains: List of scopes defining each of the desired tolchains.
# The scope must contain a "name" variable; other variables are forwared to
# $generate_toolchain.
template("pw_generate_android_toolchains") {
not_needed([ "target_name" ])
assert(
defined(invoker.toolchains),
"pw_generate_android_toolchains must be called with a list of toolchains")
# Create a target for each of the desired toolchains.
foreach(_toolchain, invoker.toolchains) {
# If the toolchain defines a CPU, use that, otherwise expand to all of the
# CPU targets an NDK may contain and prepend the CPU name.
_current_cpu = ""
if (defined(_toolchain.defaults)) {
invoker_toolchain_args = {
}
invoker_toolchain_args = _toolchain.defaults
if (defined(invoker_toolchain_args.current_cpu)) {
_current_cpu = invoker_toolchain_args.current_cpu
}
}
if (_current_cpu != "") {
pw_generate_android_toolchain(_toolchain.name) {
forward_variables_from(_toolchain, "*", [ "name" ])
}
} else {
foreach(_current_cpu, pw_android_toolchain_cpu_targets) {
pw_generate_android_toolchain("${_current_cpu}_${_toolchain.name}") {
forward_variables_from(_toolchain,
"*",
[
"defaults",
"name",
])
defaults = {
current_cpu = _current_cpu
if (defined(_toolchain.defaults)) {
forward_variables_from(_toolchain.defaults, "*")
}
}
}
}
}
}
}