xref: /aosp_15_r20/external/pigweed/pw_android_toolchain/generate_toolchain.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni")
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_android_toolchain/android.gni")
18*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_toolchain/generate_toolchain.gni")
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Worker# Creates an Android toolchain target.
21*61c4878aSAndroid Build Coastguard Worker#
22*61c4878aSAndroid Build Coastguard Worker# Arguments are forwarded to $generate_toolchain.
23*61c4878aSAndroid Build Coastguard Workertemplate("pw_generate_android_toolchain") {
24*61c4878aSAndroid Build Coastguard Worker  assert(pw_android_toolchain_NDK_PATH != "",
25*61c4878aSAndroid Build Coastguard Worker         "pw_android_toolchain_NDK_PATH is not set")
26*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.defaults), "toolchain is missing 'defaults'")
27*61c4878aSAndroid Build Coastguard Worker  invoker_toolchain_args = invoker.defaults
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker  # Build _clang_prefix from "host_os" and "host_cpu".
30*61c4878aSAndroid Build Coastguard Worker  _host_os = ""
31*61c4878aSAndroid Build Coastguard Worker  if (host_os == "linux") {
32*61c4878aSAndroid Build Coastguard Worker    _host_os = "linux"
33*61c4878aSAndroid Build Coastguard Worker  } else if (host_os == "mac") {
34*61c4878aSAndroid Build Coastguard Worker    _host_os = "darwin"
35*61c4878aSAndroid Build Coastguard Worker  } else if (host_os == "win") {
36*61c4878aSAndroid Build Coastguard Worker    _host_os = "windows"
37*61c4878aSAndroid Build Coastguard Worker  }
38*61c4878aSAndroid Build Coastguard Worker
39*61c4878aSAndroid Build Coastguard Worker  _host_cpu = ""
40*61c4878aSAndroid Build Coastguard Worker  if (host_cpu == "x64") {
41*61c4878aSAndroid Build Coastguard Worker    _host_cpu = "-x86_64"
42*61c4878aSAndroid Build Coastguard Worker  }
43*61c4878aSAndroid Build Coastguard Worker
44*61c4878aSAndroid Build Coastguard Worker  _clang_prefix = "${pw_android_toolchain_NDK_PATH}/toolchains/llvm/prebuilt/${_host_os}${_host_cpu}/bin/"
45*61c4878aSAndroid Build Coastguard Worker
46*61c4878aSAndroid Build Coastguard Worker  # Build _tool_name_root from "_ndk_cpu" and "api_level".
47*61c4878aSAndroid Build Coastguard Worker  if (defined(invoker_toolchain_args.api_level)) {
48*61c4878aSAndroid Build Coastguard Worker    _api_level = invoker_toolchain_args.api_level
49*61c4878aSAndroid Build Coastguard Worker  } else {
50*61c4878aSAndroid Build Coastguard Worker    _api_level = pw_android_toolchain_API_LEVEL
51*61c4878aSAndroid Build Coastguard Worker  }
52*61c4878aSAndroid Build Coastguard Worker
53*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker_toolchain_args.current_cpu),
54*61c4878aSAndroid Build Coastguard Worker         "toolchain.defaults is missing 'current_cpu'")
55*61c4878aSAndroid Build Coastguard Worker  if (invoker_toolchain_args.current_cpu == "arm") {
56*61c4878aSAndroid Build Coastguard Worker    _tool_name_root = "armv7a-linux-androideabi${_api_level}-"
57*61c4878aSAndroid Build Coastguard Worker  } else if (invoker_toolchain_args.current_cpu == "arm64") {
58*61c4878aSAndroid Build Coastguard Worker    _tool_name_root = "aarch64-linux-android${_api_level}-"
59*61c4878aSAndroid Build Coastguard Worker  } else if (invoker_toolchain_args.current_cpu == "x86") {
60*61c4878aSAndroid Build Coastguard Worker    _tool_name_root = "i686-linux-android${_api_level}-"
61*61c4878aSAndroid Build Coastguard Worker  } else if (invoker_toolchain_args.current_cpu == "x64") {
62*61c4878aSAndroid Build Coastguard Worker    _tool_name_root = "x86_64-linux-android${_api_level}-"
63*61c4878aSAndroid Build Coastguard Worker  } else {
64*61c4878aSAndroid Build Coastguard Worker    assert(false, "toolchain.defaults.current_cpu unknown or invalid")
65*61c4878aSAndroid Build Coastguard Worker  }
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker  generate_toolchain(target_name) {
68*61c4878aSAndroid Build Coastguard Worker    ar = _clang_prefix + "llvm-ar"
69*61c4878aSAndroid Build Coastguard Worker    cc = _clang_prefix + _tool_name_root + "clang"
70*61c4878aSAndroid Build Coastguard Worker    cxx = _clang_prefix + _tool_name_root + "clang++"
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker    forward_variables_from(invoker,
73*61c4878aSAndroid Build Coastguard Worker                           "*",
74*61c4878aSAndroid Build Coastguard Worker                           [
75*61c4878aSAndroid Build Coastguard Worker                             "defaults",
76*61c4878aSAndroid Build Coastguard Worker                             "name",
77*61c4878aSAndroid Build Coastguard Worker                           ])
78*61c4878aSAndroid Build Coastguard Worker    defaults = {
79*61c4878aSAndroid Build Coastguard Worker      current_os = "android"
80*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(invoker_toolchain_args, "*")
81*61c4878aSAndroid Build Coastguard Worker    }
82*61c4878aSAndroid Build Coastguard Worker  }
83*61c4878aSAndroid Build Coastguard Worker}
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker# Creates a series of Android toolchain targets with common compiler options.
86*61c4878aSAndroid Build Coastguard Worker#
87*61c4878aSAndroid Build Coastguard Worker# Args:
88*61c4878aSAndroid Build Coastguard Worker#   toolchains: List of scopes defining each of the desired tolchains.
89*61c4878aSAndroid Build Coastguard Worker#   The scope must contain a "name" variable; other variables are forwared to
90*61c4878aSAndroid Build Coastguard Worker#   $generate_toolchain.
91*61c4878aSAndroid Build Coastguard Workertemplate("pw_generate_android_toolchains") {
92*61c4878aSAndroid Build Coastguard Worker  not_needed([ "target_name" ])
93*61c4878aSAndroid Build Coastguard Worker  assert(
94*61c4878aSAndroid Build Coastguard Worker      defined(invoker.toolchains),
95*61c4878aSAndroid Build Coastguard Worker      "pw_generate_android_toolchains must be called with a list of toolchains")
96*61c4878aSAndroid Build Coastguard Worker
97*61c4878aSAndroid Build Coastguard Worker  # Create a target for each of the desired toolchains.
98*61c4878aSAndroid Build Coastguard Worker  foreach(_toolchain, invoker.toolchains) {
99*61c4878aSAndroid Build Coastguard Worker    # If the toolchain defines a CPU, use that, otherwise expand to all of the
100*61c4878aSAndroid Build Coastguard Worker    # CPU targets an NDK may contain and prepend the CPU name.
101*61c4878aSAndroid Build Coastguard Worker    _current_cpu = ""
102*61c4878aSAndroid Build Coastguard Worker    if (defined(_toolchain.defaults)) {
103*61c4878aSAndroid Build Coastguard Worker      invoker_toolchain_args = {
104*61c4878aSAndroid Build Coastguard Worker      }
105*61c4878aSAndroid Build Coastguard Worker      invoker_toolchain_args = _toolchain.defaults
106*61c4878aSAndroid Build Coastguard Worker      if (defined(invoker_toolchain_args.current_cpu)) {
107*61c4878aSAndroid Build Coastguard Worker        _current_cpu = invoker_toolchain_args.current_cpu
108*61c4878aSAndroid Build Coastguard Worker      }
109*61c4878aSAndroid Build Coastguard Worker    }
110*61c4878aSAndroid Build Coastguard Worker
111*61c4878aSAndroid Build Coastguard Worker    if (_current_cpu != "") {
112*61c4878aSAndroid Build Coastguard Worker      pw_generate_android_toolchain(_toolchain.name) {
113*61c4878aSAndroid Build Coastguard Worker        forward_variables_from(_toolchain, "*", [ "name" ])
114*61c4878aSAndroid Build Coastguard Worker      }
115*61c4878aSAndroid Build Coastguard Worker    } else {
116*61c4878aSAndroid Build Coastguard Worker      foreach(_current_cpu, pw_android_toolchain_cpu_targets) {
117*61c4878aSAndroid Build Coastguard Worker        pw_generate_android_toolchain("${_current_cpu}_${_toolchain.name}") {
118*61c4878aSAndroid Build Coastguard Worker          forward_variables_from(_toolchain,
119*61c4878aSAndroid Build Coastguard Worker                                 "*",
120*61c4878aSAndroid Build Coastguard Worker                                 [
121*61c4878aSAndroid Build Coastguard Worker                                   "defaults",
122*61c4878aSAndroid Build Coastguard Worker                                   "name",
123*61c4878aSAndroid Build Coastguard Worker                                 ])
124*61c4878aSAndroid Build Coastguard Worker          defaults = {
125*61c4878aSAndroid Build Coastguard Worker            current_cpu = _current_cpu
126*61c4878aSAndroid Build Coastguard Worker            if (defined(_toolchain.defaults)) {
127*61c4878aSAndroid Build Coastguard Worker              forward_variables_from(_toolchain.defaults, "*")
128*61c4878aSAndroid Build Coastguard Worker            }
129*61c4878aSAndroid Build Coastguard Worker          }
130*61c4878aSAndroid Build Coastguard Worker        }
131*61c4878aSAndroid Build Coastguard Worker      }
132*61c4878aSAndroid Build Coastguard Worker    }
133*61c4878aSAndroid Build Coastguard Worker  }
134*61c4878aSAndroid Build Coastguard Worker}
135