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