xref: /aosp_15_r20/external/pigweed/pw_system/system_target.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_assert/backend.gni")
18*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_bloat/bloat.gni")
19*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_boot/backend.gni")
20*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/cc_library.gni")
21*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_chrono/backend.gni")
22*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_interrupt/backend.gni")
23*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_log/backend.gni")
24*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_log_string/backend.gni")
25*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_malloc/backend.gni")
26*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_sync/backend.gni")
27*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_sys_io/backend.gni")
28*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_thread/backend.gni")
29*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_toolchain/arm_gcc/toolchains.gni")
30*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_toolchain/generate_toolchain.gni")
31*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_toolchain/host_clang/toolchains.gni")
32*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_toolchain/host_gcc/toolchains.gni")
33*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_trace/backend.gni")
34*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_trace_tokenized/config.gni")
35*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_unit_test/test.gni")
36*61c4878aSAndroid Build Coastguard Workerimport("backend.gni")
37*61c4878aSAndroid Build Coastguard Workerimport("freertos_backends.gni")
38*61c4878aSAndroid Build Coastguard Workerimport("stl_backends.gni")
39*61c4878aSAndroid Build Coastguard Worker
40*61c4878aSAndroid Build Coastguard Worker# This scope is essentially an enum for pw_system_target's `cpu` selection.
41*61c4878aSAndroid Build Coastguard WorkerPW_SYSTEM_CPU = {
42*61c4878aSAndroid Build Coastguard Worker  CORTEX_M0PLUS = "cortex-m0plus"
43*61c4878aSAndroid Build Coastguard Worker  CORTEX_M4F = "cortex-m4f"
44*61c4878aSAndroid Build Coastguard Worker  CORTEX_M3 = "cortex-m3"
45*61c4878aSAndroid Build Coastguard Worker  CORTEX_M7F = "cortex-m7f"
46*61c4878aSAndroid Build Coastguard Worker  CORTEX_M33 = "cortex-m33"
47*61c4878aSAndroid Build Coastguard Worker  CORTEX_M55 = "cortex-m55"
48*61c4878aSAndroid Build Coastguard Worker
49*61c4878aSAndroid Build Coastguard Worker  # Native builds for the host CPU.
50*61c4878aSAndroid Build Coastguard Worker  NATIVE = "native"
51*61c4878aSAndroid Build Coastguard Worker}
52*61c4878aSAndroid Build Coastguard Worker
53*61c4878aSAndroid Build Coastguard Worker# This scope is essentially an enum for pw_system_target's `scheduler`
54*61c4878aSAndroid Build Coastguard Worker# selection.
55*61c4878aSAndroid Build Coastguard WorkerPW_SYSTEM_SCHEDULER = {
56*61c4878aSAndroid Build Coastguard Worker  FREERTOS = "freertos"
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker  # Native uses the host OS's native scheduler and OS primitives as provided
59*61c4878aSAndroid Build Coastguard Worker  # through the Standard Template Library.
60*61c4878aSAndroid Build Coastguard Worker  NATIVE = "native"
61*61c4878aSAndroid Build Coastguard Worker}
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Workerdeclare_args() {
64*61c4878aSAndroid Build Coastguard Worker  # This argument is intended to be user-facing and should NOT be set by a
65*61c4878aSAndroid Build Coastguard Worker  # toolchain. This switches ALL pw_system_target toolchains to use the
66*61c4878aSAndroid Build Coastguard Worker  # multi_endpoint_rpc_config config to illustrate a multi-endpoint mode that
67*61c4878aSAndroid Build Coastguard Worker  # isolates logging and RPC traffic via HDLC multiplexing.
68*61c4878aSAndroid Build Coastguard Worker  #
69*61c4878aSAndroid Build Coastguard Worker  # If you would like to use this in production, it is strongly recommended that
70*61c4878aSAndroid Build Coastguard Worker  # you instead just add the appropriate defines to your target's toolchain
71*61c4878aSAndroid Build Coastguard Worker  # definition.
72*61c4878aSAndroid Build Coastguard Worker  pw_system_USE_MULTI_ENDPOINT_CONFIG = false
73*61c4878aSAndroid Build Coastguard Worker}
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker# Defines a target toolchain, automatically setting many required build
76*61c4878aSAndroid Build Coastguard Worker# arguments to simplify instantiation of a target.
77*61c4878aSAndroid Build Coastguard Worker#
78*61c4878aSAndroid Build Coastguard Worker# Args:
79*61c4878aSAndroid Build Coastguard Worker#  cpu: (required) The architecture to target.
80*61c4878aSAndroid Build Coastguard Worker#    Supported choices: PW_SYSTEM_CPU.CORTEX_M7F, PW_SYSTEM_CPU.CORTEX_M4F, PW_SYSTEM_CPU.CORTEX_M3,
81*61c4878aSAndroid Build Coastguard Worker#    PW_SYSTEM_CPU.CORTEX_M33, PW_SYSTEM_CPU.CORTEX_M55, PW_SYSTEM_CPU.NATIVE
82*61c4878aSAndroid Build Coastguard Worker#  scheduler: (required) The scheduler implementation and API to use for this
83*61c4878aSAndroid Build Coastguard Worker#    target.
84*61c4878aSAndroid Build Coastguard Worker#    Supported choices: PW_SYSTEM_SCHEDULER.FREERTOS, PW_SYSTEM_SCHEDULER.NATIVE
85*61c4878aSAndroid Build Coastguard Worker#  system_toolchain: Override the default toolchain selection.
86*61c4878aSAndroid Build Coastguard Worker#  use_pw_malloc: Whether or not to replace the default malloc implementation
87*61c4878aSAndroid Build Coastguard Worker#    with pw_malloc. Defaults enabled for supported targets.
88*61c4878aSAndroid Build Coastguard Worker#  link_deps: Additional link-time dependencies required for all executables.
89*61c4878aSAndroid Build Coastguard Worker#    This is a list of source sets.
90*61c4878aSAndroid Build Coastguard Worker#  build_args: Additional overrides for GN build arguments.
91*61c4878aSAndroid Build Coastguard Worker#  global_configs: Configs that will be globally applied to all pw_source_set,
92*61c4878aSAndroid Build Coastguard Worker#    pw_static_library, and pw_executable targets.
93*61c4878aSAndroid Build Coastguard Workertemplate("pw_system_target") {
94*61c4878aSAndroid Build Coastguard Worker  _OPTIMIZATION_LEVELS = {
95*61c4878aSAndroid Build Coastguard Worker    SIZE_OPTIMIZED = "size_optimized"
96*61c4878aSAndroid Build Coastguard Worker    SPEED_OPTIMIZED = "speed_optimized"
97*61c4878aSAndroid Build Coastguard Worker    DEBUG = "debug"
98*61c4878aSAndroid Build Coastguard Worker  }
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard Worker  # Generic defaults.
101*61c4878aSAndroid Build Coastguard Worker  _default_configs = [ "$dir_pw_build:extra_strict_warnings" ]
102*61c4878aSAndroid Build Coastguard Worker  if (defined(invoker.global_configs)) {
103*61c4878aSAndroid Build Coastguard Worker    foreach(cfg, invoker.global_configs) {
104*61c4878aSAndroid Build Coastguard Worker      _default_configs += [ get_path_info(cfg, "abspath") ]
105*61c4878aSAndroid Build Coastguard Worker    }
106*61c4878aSAndroid Build Coastguard Worker  }
107*61c4878aSAndroid Build Coastguard Worker
108*61c4878aSAndroid Build Coastguard Worker  _link_deps = [
109*61c4878aSAndroid Build Coastguard Worker    "$dir_pw_assert:impl",
110*61c4878aSAndroid Build Coastguard Worker    "$dir_pw_log:impl",
111*61c4878aSAndroid Build Coastguard Worker  ]
112*61c4878aSAndroid Build Coastguard Worker  if (defined(invoker.link_deps)) {
113*61c4878aSAndroid Build Coastguard Worker    _link_deps += invoker.link_deps
114*61c4878aSAndroid Build Coastguard Worker  }
115*61c4878aSAndroid Build Coastguard Worker  _final_binary_extension = ""
116*61c4878aSAndroid Build Coastguard Worker
117*61c4878aSAndroid Build Coastguard Worker  _default_build_args = {
118*61c4878aSAndroid Build Coastguard Worker    pw_system_RPC_SERVER_BACKEND = "$dir_pw_system:hdlc_rpc_server"
119*61c4878aSAndroid Build Coastguard Worker    pw_system_IO_BACKEND = "$dir_pw_system:sys_io_target_io"
120*61c4878aSAndroid Build Coastguard Worker
121*61c4878aSAndroid Build Coastguard Worker    pw_system_DEVICE_HANDLER = "$dir_pw_system:unknown_device_handler"
122*61c4878aSAndroid Build Coastguard Worker
123*61c4878aSAndroid Build Coastguard Worker    # TODO(amontanez): This should be set to pw_assert_log ASAP.
124*61c4878aSAndroid Build Coastguard Worker    pw_assert_BACKEND = dir_pw_assert_basic
125*61c4878aSAndroid Build Coastguard Worker
126*61c4878aSAndroid Build Coastguard Worker    # TODO(amontanez): This should be set to pw_log_tokenized when support
127*61c4878aSAndroid Build Coastguard Worker    # is added.
128*61c4878aSAndroid Build Coastguard Worker    pw_log_BACKEND = dir_pw_log_basic
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard Worker    # TODO(amontanez): This should be set to a "$dir_pw_unit_test:rpc_main"
131*61c4878aSAndroid Build Coastguard Worker    # when RPC is working.
132*61c4878aSAndroid Build Coastguard Worker    pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main"
133*61c4878aSAndroid Build Coastguard Worker
134*61c4878aSAndroid Build Coastguard Worker    pw_trace_BACKEND = "$dir_pw_trace_tokenized"
135*61c4878aSAndroid Build Coastguard Worker
136*61c4878aSAndroid Build Coastguard Worker    if (pw_system_USE_MULTI_ENDPOINT_CONFIG) {
137*61c4878aSAndroid Build Coastguard Worker      pw_system_CONFIG = "$dir_pw_system:multi_endpoint_rpc_config"
138*61c4878aSAndroid Build Coastguard Worker    }
139*61c4878aSAndroid Build Coastguard Worker  }
140*61c4878aSAndroid Build Coastguard Worker
141*61c4878aSAndroid Build Coastguard Worker  # Populate architecture-specific build args.
142*61c4878aSAndroid Build Coastguard Worker  assert(
143*61c4878aSAndroid Build Coastguard Worker      defined(invoker.cpu),
144*61c4878aSAndroid Build Coastguard Worker      "Please select a `cpu` for $target_name. Options: PW_SYSTEM_CPU.CORTEX_M7, PW_SYSTEM_CPU.CORTEX_M4F, PW_SYSTEM_CPU.CORTEX_M3, PW_SYSTEM_CPU.CORTEX_M33, PW_SYSTEM_CPU.CORTEX_M55, PW_SYSTEM_CPU.NATIVE")
145*61c4878aSAndroid Build Coastguard Worker  if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M33) {
146*61c4878aSAndroid Build Coastguard Worker    _current_cpu = "arm"
147*61c4878aSAndroid Build Coastguard Worker    _default_configs += [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
148*61c4878aSAndroid Build Coastguard Worker    _arch_build_args = {
149*61c4878aSAndroid Build Coastguard Worker      pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
150*61c4878aSAndroid Build Coastguard Worker      pw_boot_BACKEND = "$dir_pw_boot_cortex_m:pw_boot_cortex_m"
151*61c4878aSAndroid Build Coastguard Worker      pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context"
152*61c4878aSAndroid Build Coastguard Worker    }
153*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ "$dir_pw_toolchain/arm_gcc:arm_none_eabi_gcc_support" ]
154*61c4878aSAndroid Build Coastguard Worker
155*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.system_toolchain)) {
156*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = invoker.system_toolchain
157*61c4878aSAndroid Build Coastguard Worker    } else {
158*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_arm_gcc
159*61c4878aSAndroid Build Coastguard Worker    }
160*61c4878aSAndroid Build Coastguard Worker
161*61c4878aSAndroid Build Coastguard Worker    _final_binary_extension = ".elf"
162*61c4878aSAndroid Build Coastguard Worker
163*61c4878aSAndroid Build Coastguard Worker    _toolchains = [
164*61c4878aSAndroid Build Coastguard Worker      {
165*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m33_debug
166*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.DEBUG
167*61c4878aSAndroid Build Coastguard Worker      },
168*61c4878aSAndroid Build Coastguard Worker      {
169*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m33_size_optimized
170*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
171*61c4878aSAndroid Build Coastguard Worker      },
172*61c4878aSAndroid Build Coastguard Worker      {
173*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m33_speed_optimized
174*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
175*61c4878aSAndroid Build Coastguard Worker      },
176*61c4878aSAndroid Build Coastguard Worker    ]
177*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M55) {
178*61c4878aSAndroid Build Coastguard Worker    _current_cpu = "arm"
179*61c4878aSAndroid Build Coastguard Worker    _default_configs += [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
180*61c4878aSAndroid Build Coastguard Worker    _arch_build_args = {
181*61c4878aSAndroid Build Coastguard Worker      pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
182*61c4878aSAndroid Build Coastguard Worker      pw_boot_BACKEND = "$dir_pw_boot_cortex_m:pw_boot_cortex_m"
183*61c4878aSAndroid Build Coastguard Worker      pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context"
184*61c4878aSAndroid Build Coastguard Worker    }
185*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ "$dir_pw_toolchain/arm_gcc:arm_none_eabi_gcc_support" ]
186*61c4878aSAndroid Build Coastguard Worker
187*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.system_toolchain)) {
188*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = invoker.system_toolchain
189*61c4878aSAndroid Build Coastguard Worker    } else {
190*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_arm_gcc
191*61c4878aSAndroid Build Coastguard Worker    }
192*61c4878aSAndroid Build Coastguard Worker
193*61c4878aSAndroid Build Coastguard Worker    _final_binary_extension = ".elf"
194*61c4878aSAndroid Build Coastguard Worker
195*61c4878aSAndroid Build Coastguard Worker    _toolchains = [
196*61c4878aSAndroid Build Coastguard Worker      {
197*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m55_debug
198*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.DEBUG
199*61c4878aSAndroid Build Coastguard Worker      },
200*61c4878aSAndroid Build Coastguard Worker      {
201*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m55_size_optimized
202*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
203*61c4878aSAndroid Build Coastguard Worker      },
204*61c4878aSAndroid Build Coastguard Worker      {
205*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m55_speed_optimized
206*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
207*61c4878aSAndroid Build Coastguard Worker      },
208*61c4878aSAndroid Build Coastguard Worker    ]
209*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M7F) {
210*61c4878aSAndroid Build Coastguard Worker    _current_cpu = "arm"
211*61c4878aSAndroid Build Coastguard Worker    _default_configs += [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
212*61c4878aSAndroid Build Coastguard Worker    _arch_build_args = {
213*61c4878aSAndroid Build Coastguard Worker      pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
214*61c4878aSAndroid Build Coastguard Worker      pw_boot_BACKEND = "$dir_pw_boot_cortex_m:armv7m"
215*61c4878aSAndroid Build Coastguard Worker      pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
216*61c4878aSAndroid Build Coastguard Worker    }
217*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ "$dir_pw_toolchain/arm_gcc:arm_none_eabi_gcc_support" ]
218*61c4878aSAndroid Build Coastguard Worker
219*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.system_toolchain)) {
220*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = invoker.system_toolchain
221*61c4878aSAndroid Build Coastguard Worker    } else {
222*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_arm_gcc
223*61c4878aSAndroid Build Coastguard Worker    }
224*61c4878aSAndroid Build Coastguard Worker
225*61c4878aSAndroid Build Coastguard Worker    _final_binary_extension = ".elf"
226*61c4878aSAndroid Build Coastguard Worker
227*61c4878aSAndroid Build Coastguard Worker    _toolchains = [
228*61c4878aSAndroid Build Coastguard Worker      {
229*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m7f_debug
230*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.DEBUG
231*61c4878aSAndroid Build Coastguard Worker      },
232*61c4878aSAndroid Build Coastguard Worker      {
233*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m7f_size_optimized
234*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
235*61c4878aSAndroid Build Coastguard Worker      },
236*61c4878aSAndroid Build Coastguard Worker      {
237*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m7f_speed_optimized
238*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
239*61c4878aSAndroid Build Coastguard Worker      },
240*61c4878aSAndroid Build Coastguard Worker    ]
241*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M4F) {
242*61c4878aSAndroid Build Coastguard Worker    _current_cpu = "arm"
243*61c4878aSAndroid Build Coastguard Worker    _default_configs += [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
244*61c4878aSAndroid Build Coastguard Worker    _arch_build_args = {
245*61c4878aSAndroid Build Coastguard Worker      pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
246*61c4878aSAndroid Build Coastguard Worker      pw_boot_BACKEND = "$dir_pw_boot_cortex_m:armv7m"
247*61c4878aSAndroid Build Coastguard Worker      pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
248*61c4878aSAndroid Build Coastguard Worker    }
249*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ "$dir_pw_toolchain/arm_gcc:arm_none_eabi_gcc_support" ]
250*61c4878aSAndroid Build Coastguard Worker
251*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.system_toolchain)) {
252*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = invoker.system_toolchain
253*61c4878aSAndroid Build Coastguard Worker    } else {
254*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_arm_gcc
255*61c4878aSAndroid Build Coastguard Worker    }
256*61c4878aSAndroid Build Coastguard Worker
257*61c4878aSAndroid Build Coastguard Worker    _final_binary_extension = ".elf"
258*61c4878aSAndroid Build Coastguard Worker
259*61c4878aSAndroid Build Coastguard Worker    _toolchains = [
260*61c4878aSAndroid Build Coastguard Worker      {
261*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m4f_debug
262*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.DEBUG
263*61c4878aSAndroid Build Coastguard Worker      },
264*61c4878aSAndroid Build Coastguard Worker      {
265*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m4f_size_optimized
266*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
267*61c4878aSAndroid Build Coastguard Worker      },
268*61c4878aSAndroid Build Coastguard Worker      {
269*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m4f_speed_optimized
270*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
271*61c4878aSAndroid Build Coastguard Worker      },
272*61c4878aSAndroid Build Coastguard Worker    ]
273*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M3) {
274*61c4878aSAndroid Build Coastguard Worker    _current_cpu = "arm"
275*61c4878aSAndroid Build Coastguard Worker    _arch_build_args = {
276*61c4878aSAndroid Build Coastguard Worker      pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
277*61c4878aSAndroid Build Coastguard Worker      pw_boot_BACKEND = "$dir_pw_boot_cortex_m:armv7m"
278*61c4878aSAndroid Build Coastguard Worker      pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
279*61c4878aSAndroid Build Coastguard Worker    }
280*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ "$dir_pw_toolchain/arm_gcc:arm_none_eabi_gcc_support" ]
281*61c4878aSAndroid Build Coastguard Worker
282*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.system_toolchain)) {
283*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = invoker.system_toolchain
284*61c4878aSAndroid Build Coastguard Worker    } else {
285*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_arm_gcc
286*61c4878aSAndroid Build Coastguard Worker    }
287*61c4878aSAndroid Build Coastguard Worker
288*61c4878aSAndroid Build Coastguard Worker    _final_binary_extension = ".elf"
289*61c4878aSAndroid Build Coastguard Worker
290*61c4878aSAndroid Build Coastguard Worker    _toolchains = [
291*61c4878aSAndroid Build Coastguard Worker      {
292*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m3_debug
293*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.DEBUG
294*61c4878aSAndroid Build Coastguard Worker      },
295*61c4878aSAndroid Build Coastguard Worker      {
296*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m3_size_optimized
297*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
298*61c4878aSAndroid Build Coastguard Worker      },
299*61c4878aSAndroid Build Coastguard Worker      {
300*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m3_speed_optimized
301*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
302*61c4878aSAndroid Build Coastguard Worker      },
303*61c4878aSAndroid Build Coastguard Worker    ]
304*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M0PLUS) {
305*61c4878aSAndroid Build Coastguard Worker    _current_cpu = "arm"
306*61c4878aSAndroid Build Coastguard Worker    _arch_build_args = {
307*61c4878aSAndroid Build Coastguard Worker      pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
308*61c4878aSAndroid Build Coastguard Worker      pw_boot_BACKEND = "$dir_pw_boot_cortex_m:armv7m"
309*61c4878aSAndroid Build Coastguard Worker      pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
310*61c4878aSAndroid Build Coastguard Worker    }
311*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ "$dir_pw_toolchain/arm_gcc:arm_none_eabi_gcc_support" ]
312*61c4878aSAndroid Build Coastguard Worker
313*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.system_toolchain)) {
314*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = invoker.system_toolchain
315*61c4878aSAndroid Build Coastguard Worker    } else {
316*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_arm_gcc
317*61c4878aSAndroid Build Coastguard Worker    }
318*61c4878aSAndroid Build Coastguard Worker
319*61c4878aSAndroid Build Coastguard Worker    # This creates a double .elf.elf extension for the rp2040 target.
320*61c4878aSAndroid Build Coastguard Worker    # _final_binary_extension = ".elf"
321*61c4878aSAndroid Build Coastguard Worker
322*61c4878aSAndroid Build Coastguard Worker    _toolchains = [
323*61c4878aSAndroid Build Coastguard Worker      {
324*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m0plus_debug
325*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.DEBUG
326*61c4878aSAndroid Build Coastguard Worker      },
327*61c4878aSAndroid Build Coastguard Worker      {
328*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m0plus_size_optimized
329*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
330*61c4878aSAndroid Build Coastguard Worker      },
331*61c4878aSAndroid Build Coastguard Worker      {
332*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.cortex_m0plus_speed_optimized
333*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
334*61c4878aSAndroid Build Coastguard Worker      },
335*61c4878aSAndroid Build Coastguard Worker    ]
336*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.cpu == PW_SYSTEM_CPU.NATIVE) {
337*61c4878aSAndroid Build Coastguard Worker    _current_cpu = host_cpu
338*61c4878aSAndroid Build Coastguard Worker    _arch_build_args = {
339*61c4878aSAndroid Build Coastguard Worker      pw_log_BACKEND = dir_pw_log_string
340*61c4878aSAndroid Build Coastguard Worker      pw_log_string_HANDLER_BACKEND = "$dir_pw_system:log_backend"
341*61c4878aSAndroid Build Coastguard Worker      pw_sys_io_BACKEND = "$dir_pw_sys_io_stdio"
342*61c4878aSAndroid Build Coastguard Worker      pw_system_IO_BACKEND = "$dir_pw_system:socket_target_io"
343*61c4878aSAndroid Build Coastguard Worker    }
344*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ "$dir_pw_log_string:handler.impl" ]
345*61c4878aSAndroid Build Coastguard Worker
346*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.system_toolchain)) {
347*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = invoker.system_toolchain
348*61c4878aSAndroid Build Coastguard Worker    } else if (host_os == "win") {
349*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_host_gcc
350*61c4878aSAndroid Build Coastguard Worker    } else {
351*61c4878aSAndroid Build Coastguard Worker      _system_toolchain = pw_toolchain_host_clang
352*61c4878aSAndroid Build Coastguard Worker    }
353*61c4878aSAndroid Build Coastguard Worker
354*61c4878aSAndroid Build Coastguard Worker    _toolchains = [
355*61c4878aSAndroid Build Coastguard Worker      {
356*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.debug
357*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.DEBUG
358*61c4878aSAndroid Build Coastguard Worker      },
359*61c4878aSAndroid Build Coastguard Worker      {
360*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.size_optimized
361*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
362*61c4878aSAndroid Build Coastguard Worker      },
363*61c4878aSAndroid Build Coastguard Worker      {
364*61c4878aSAndroid Build Coastguard Worker        toolchain_base = _system_toolchain.speed_optimized
365*61c4878aSAndroid Build Coastguard Worker        level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
366*61c4878aSAndroid Build Coastguard Worker      },
367*61c4878aSAndroid Build Coastguard Worker    ]
368*61c4878aSAndroid Build Coastguard Worker  }
369*61c4878aSAndroid Build Coastguard Worker  assert(defined(_arch_build_args),
370*61c4878aSAndroid Build Coastguard Worker         "Unknown cpu choice for $target_name: `${invoker.cpu}`")
371*61c4878aSAndroid Build Coastguard Worker
372*61c4878aSAndroid Build Coastguard Worker  # Populate OS-specific build args.
373*61c4878aSAndroid Build Coastguard Worker  assert(
374*61c4878aSAndroid Build Coastguard Worker      defined(invoker.scheduler),
375*61c4878aSAndroid Build Coastguard Worker      "Please select an `scheduler` for $target_name. Options: PW_SYSTEM_SCHEDULER.FREERTOS, PW_SYSTEM_SCHEDULER.NATIVE")
376*61c4878aSAndroid Build Coastguard Worker  if (invoker.scheduler == PW_SYSTEM_SCHEDULER.FREERTOS) {
377*61c4878aSAndroid Build Coastguard Worker    _current_os = "freertos"
378*61c4878aSAndroid Build Coastguard Worker    _os_build_args = PW_SYSTEM_FREERTOS_BACKENDS
379*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.scheduler == PW_SYSTEM_SCHEDULER.NATIVE) {
380*61c4878aSAndroid Build Coastguard Worker    _current_os = host_os
381*61c4878aSAndroid Build Coastguard Worker    _os_build_args = PW_SYSTEM_STL_BACKENDS
382*61c4878aSAndroid Build Coastguard Worker  }
383*61c4878aSAndroid Build Coastguard Worker  assert(defined(_os_build_args),
384*61c4878aSAndroid Build Coastguard Worker         "Unknown scheduler choice for $target_name: `${invoker.scheduler}`")
385*61c4878aSAndroid Build Coastguard Worker
386*61c4878aSAndroid Build Coastguard Worker  # Configure malloc defaults.
387*61c4878aSAndroid Build Coastguard Worker  _use_pw_malloc = false
388*61c4878aSAndroid Build Coastguard Worker  if (defined(invoker.use_pw_malloc)) {
389*61c4878aSAndroid Build Coastguard Worker    _use_pw_malloc = invoker.use_pw_malloc
390*61c4878aSAndroid Build Coastguard Worker  } else if (invoker.cpu != PW_SYSTEM_CPU.NATIVE) {
391*61c4878aSAndroid Build Coastguard Worker    _use_pw_malloc = true
392*61c4878aSAndroid Build Coastguard Worker  }
393*61c4878aSAndroid Build Coastguard Worker
394*61c4878aSAndroid Build Coastguard Worker  if (_use_pw_malloc) {
395*61c4878aSAndroid Build Coastguard Worker    _default_configs += [ "$dir_pw_malloc:wrap_functions" ]
396*61c4878aSAndroid Build Coastguard Worker    _link_deps += [ dir_pw_malloc ]
397*61c4878aSAndroid Build Coastguard Worker    _malloc_build_args = {
398*61c4878aSAndroid Build Coastguard Worker      pw_malloc_BACKEND = "$dir_pw_malloc:bucket_block_allocator"
399*61c4878aSAndroid Build Coastguard Worker    }
400*61c4878aSAndroid Build Coastguard Worker  } else {
401*61c4878aSAndroid Build Coastguard Worker    _malloc_build_args = {
402*61c4878aSAndroid Build Coastguard Worker    }
403*61c4878aSAndroid Build Coastguard Worker  }
404*61c4878aSAndroid Build Coastguard Worker
405*61c4878aSAndroid Build Coastguard Worker  foreach(toolchain_and_level, _toolchains) {
406*61c4878aSAndroid Build Coastguard Worker    # Clear from previous iteration.
407*61c4878aSAndroid Build Coastguard Worker    _base = {
408*61c4878aSAndroid Build Coastguard Worker    }
409*61c4878aSAndroid Build Coastguard Worker    _base = toolchain_and_level.toolchain_base
410*61c4878aSAndroid Build Coastguard Worker
411*61c4878aSAndroid Build Coastguard Worker    generate_toolchain("${target_name}.${toolchain_and_level.level_name}") {
412*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(_base,
413*61c4878aSAndroid Build Coastguard Worker                             "*",
414*61c4878aSAndroid Build Coastguard Worker                             [
415*61c4878aSAndroid Build Coastguard Worker                               "defaults",
416*61c4878aSAndroid Build Coastguard Worker                               "name",
417*61c4878aSAndroid Build Coastguard Worker                             ])
418*61c4878aSAndroid Build Coastguard Worker      final_binary_extension = _final_binary_extension
419*61c4878aSAndroid Build Coastguard Worker      defaults = {
420*61c4878aSAndroid Build Coastguard Worker        current_os = _current_os
421*61c4878aSAndroid Build Coastguard Worker        current_cpu = _current_cpu
422*61c4878aSAndroid Build Coastguard Worker        forward_variables_from(_base.defaults, "*")
423*61c4878aSAndroid Build Coastguard Worker        forward_variables_from(_default_build_args, "*")
424*61c4878aSAndroid Build Coastguard Worker        forward_variables_from(_arch_build_args, "*")
425*61c4878aSAndroid Build Coastguard Worker        forward_variables_from(_os_build_args, "*")
426*61c4878aSAndroid Build Coastguard Worker        forward_variables_from(_malloc_build_args, "*")
427*61c4878aSAndroid Build Coastguard Worker        default_configs += _default_configs
428*61c4878aSAndroid Build Coastguard Worker        if (!defined(pw_build_LINK_DEPS)) {
429*61c4878aSAndroid Build Coastguard Worker          pw_build_LINK_DEPS = []
430*61c4878aSAndroid Build Coastguard Worker        }
431*61c4878aSAndroid Build Coastguard Worker        pw_build_LINK_DEPS += _link_deps
432*61c4878aSAndroid Build Coastguard Worker
433*61c4878aSAndroid Build Coastguard Worker        if (defined(invoker.build_args)) {
434*61c4878aSAndroid Build Coastguard Worker          forward_variables_from(invoker.build_args, "*")
435*61c4878aSAndroid Build Coastguard Worker        }
436*61c4878aSAndroid Build Coastguard Worker      }
437*61c4878aSAndroid Build Coastguard Worker    }
438*61c4878aSAndroid Build Coastguard Worker  }
439*61c4878aSAndroid Build Coastguard Worker}
440