1# Copyright 2020 The Pigweed Authors 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4# use this file except in compliance with the License. You may obtain a copy of 5# the License at 6# 7# https://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12# License for the specific language governing permissions and limitations under 13# the License. 14 15import("//build_overrides/pigweed.gni") 16import("//build_overrides/pigweed_environment.gni") 17 18import("$dir_pw_build/defaults.gni") 19import("$dir_pw_toolchain/rbe.gni") 20 21_default_compiler_prefix = "" 22if (defined(pw_env_setup_CIPD_ARM)) { 23 _default_compiler_prefix = pw_env_setup_CIPD_ARM + "/bin/" 24} 25 26declare_args() { 27 # This flag allows you to specify a prefix for ARM GCC tools use when 28 # compiling with an arm-none-eabi toolchain. This is useful for debugging 29 # toolchain-related issues, or for building with an externally-provided 30 # toolchain. 31 # 32 # Pigweed toolchains should NOT override this variable so projects or users 33 # can control it via `.gn` or by setting it as a regular gn argument (e.g. 34 # `gn gen --args='pw_toolchain_ARM_NONE_EABI_PREFIX=/path/to/my-'`). 35 # 36 # Examples: 37 # pw_toolchain_ARM_NONE_EABI_PREFIX = "" 38 # command: "arm-none-eabi-gcc" (from PATH) 39 # 40 # pw_toolchain_ARM_NONE_EABI_PREFIX = "my-" 41 # command: "my-arm-none-eabi-gcc" (from PATH) 42 # 43 # pw_toolchain_ARM_NONE_EABI_PREFIX = "/bin/my-" 44 # command: "/bin/my-arm-none-eabi-gcc" (absolute path) 45 # 46 # pw_toolchain_ARM_NONE_EABI_PREFIX = "//environment/gcc_next/" 47 # command: "../environment/gcc_next/arm-none-eabi-gcc" (relative path) 48 # 49 # GN templates should use `arm_gcc_toolchain_tools.*` to get the intended 50 # command string rather than relying directly on 51 # pw_toolchain_ARM_NONE_EABI_PREFIX. 52 # 53 # If the prefix begins with "//", it will be rebased to be relative to the 54 # root build directory. 55 pw_toolchain_ARM_NONE_EABI_PREFIX = _default_compiler_prefix 56} 57 58# Specifies the tools used by ARM GCC toolchains. 59arm_gcc_toolchain_tools = { 60 _rbe_debug_flag = "" 61 _local_tool_name_root = "arm-none-eabi-" 62 63 _toolchain_prefix = pw_toolchain_ARM_NONE_EABI_PREFIX 64 if (_toolchain_prefix != "") { 65 # If the prefix is a GN-absolute path, rebase it so it's relative to the 66 # root of the build directory. 67 _split_prefix = string_split(_toolchain_prefix, "//") 68 if (_split_prefix[0] == "") { 69 _toolchain_prefix = rebase_path(_toolchain_prefix, root_build_dir) 70 } 71 _local_tool_name_root = _toolchain_prefix + _local_tool_name_root 72 } 73 if (host_os == "win") { 74 _local_tool_name_root = string_replace(_local_tool_name_root, "/", "\\") 75 } 76 77 if (pw_toolchain_USE_RBE) { 78 if (pw_toolchain_RBE_DEBUG) { 79 _rbe_debug_flag = " -v " 80 } 81 _exec_root = rebase_path("//") 82 _rewrapper_binary = "rewrapper" 83 _pw_rbe_config = pw_rbe_arm_gcc_config 84 _inputs = rebase_path(pw_env_setup_CIPD_ARM, _exec_root) + "/" 85 _rbe_tool_name_root = 86 _rewrapper_binary + 87 " --labels=type=compile,lang=cpp,compiler=clang --cfg=" + 88 _pw_rbe_config + " --exec_root=" + _exec_root + " --inputs=" + _inputs + 89 " -- " + rebase_path(pw_env_setup_CIPD_ARM, root_build_dir) + 90 "/bin/arm-none-eabi-" 91 cc = _rbe_tool_name_root + "gcc" + _rbe_debug_flag 92 cxx = _rbe_tool_name_root + "g++" + _rbe_debug_flag 93 } else { 94 cc = _local_tool_name_root + "gcc" 95 cxx = _local_tool_name_root + "g++" 96 } 97 ar = _local_tool_name_root + "ar" 98 ld = _local_tool_name_root + "g++" 99 100 link_group = true 101} 102 103# Common configs shared by all ARM GCC toolchains. 104_arm_gcc = [ 105 "$dir_pw_toolchain/arm_gcc:disable_psabi_warning", 106 "$dir_pw_toolchain/arm_gcc:disable_rwx_segment_warning", 107] 108 109_cortex_m0plus = [ 110 "$dir_pw_toolchain/arm_gcc:cortex_common", 111 "$dir_pw_toolchain/arm_gcc:cortex_m0plus", 112 "$dir_pw_toolchain/arm_gcc:cortex_software_fpu", 113] 114 115# Configs specific to different architectures. 116_cortex_m3 = [ 117 "$dir_pw_toolchain/arm_gcc:cortex_common", 118 "$dir_pw_toolchain/arm_gcc:cortex_m3", 119 "$dir_pw_toolchain/arm_gcc:cortex_software_fpu", 120] 121 122_cortex_m4 = [ 123 "$dir_pw_toolchain/arm_gcc:cortex_common", 124 "$dir_pw_toolchain/arm_gcc:cortex_m4", 125 "$dir_pw_toolchain/arm_gcc:cortex_software_fpu", 126] 127 128_cortex_m4f = [ 129 "$dir_pw_toolchain/arm_gcc:cortex_common", 130 "$dir_pw_toolchain/arm_gcc:cortex_m4", 131 "$dir_pw_toolchain/arm_gcc:cortex_hardware_fpu", 132] 133 134_cortex_m7 = [ 135 "$dir_pw_toolchain/arm_gcc:cortex_common", 136 "$dir_pw_toolchain/arm_gcc:cortex_m7", 137 "$dir_pw_toolchain/arm_gcc:cortex_software_fpu", 138] 139 140_cortex_m7f = [ 141 "$dir_pw_toolchain/arm_gcc:cortex_common", 142 "$dir_pw_toolchain/arm_gcc:cortex_m7", 143 "$dir_pw_toolchain/arm_gcc:cortex_hardware_fpu_v5", 144] 145 146_cortex_m33 = [ 147 "$dir_pw_toolchain/arm_gcc:cortex_common", 148 "$dir_pw_toolchain/arm_gcc:cortex_m33", 149 "$dir_pw_toolchain/arm_gcc:cortex_software_fpu", 150] 151 152_cortex_m33f = [ 153 "$dir_pw_toolchain/arm_gcc:cortex_common", 154 "$dir_pw_toolchain/arm_gcc:cortex_m33", 155 "$dir_pw_toolchain/arm_gcc:cortex_hardware_fpu_v5_sp", 156] 157 158_cortex_m55 = [ 159 "$dir_pw_toolchain/arm_gcc:cortex_common", 160 "$dir_pw_toolchain/arm_gcc:cortex_m55", 161 "$dir_pw_toolchain/arm_gcc:cortex_software_fpu", 162] 163 164_cortex_m55f = [ 165 "$dir_pw_toolchain/arm_gcc:cortex_common", 166 "$dir_pw_toolchain/arm_gcc:cortex_m55", 167 "$dir_pw_toolchain/arm_gcc:cortex_hardware_fpu_auto", 168] 169 170_cortex_a32 = [ 171 "$dir_pw_toolchain/arm_gcc:cortex_common", 172 "$dir_pw_toolchain/arm_gcc:cortex_a32", 173] 174 175# Describes ARM GCC toolchains for specific targets. 176pw_toolchain_arm_gcc = { 177 cortex_m0plus_debug = { 178 name = "arm_gcc_cortex_m0plus_debug" 179 forward_variables_from(arm_gcc_toolchain_tools, "*") 180 defaults = { 181 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m0plus + 182 [ "$dir_pw_build:optimize_debugging" ] 183 } 184 } 185 cortex_m0plus_speed_optimized = { 186 name = "arm_gcc_cortex_m0plus_speed_optimized" 187 forward_variables_from(arm_gcc_toolchain_tools, "*") 188 defaults = { 189 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m0plus + 190 [ "$dir_pw_build:optimize_speed" ] 191 } 192 } 193 cortex_m0plus_size_optimized = { 194 name = "arm_gcc_cortex_m0plus_size_optimized" 195 forward_variables_from(arm_gcc_toolchain_tools, "*") 196 defaults = { 197 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m0plus + 198 [ "$dir_pw_build:optimize_size" ] 199 } 200 } 201 cortex_m3_debug = { 202 name = "arm_gcc_cortex_m3_debug" 203 forward_variables_from(arm_gcc_toolchain_tools, "*") 204 defaults = { 205 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m3 + 206 [ "$dir_pw_build:optimize_debugging" ] 207 } 208 } 209 cortex_m3_speed_optimized = { 210 name = "arm_gcc_cortex_m3_speed_optimized" 211 forward_variables_from(arm_gcc_toolchain_tools, "*") 212 defaults = { 213 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m3 + 214 [ "$dir_pw_build:optimize_speed" ] 215 } 216 } 217 cortex_m3_size_optimized = { 218 name = "arm_gcc_cortex_m3_size_optimized" 219 forward_variables_from(arm_gcc_toolchain_tools, "*") 220 defaults = { 221 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m3 + 222 [ "$dir_pw_build:optimize_size" ] 223 } 224 } 225 cortex_m4_debug = { 226 name = "arm_gcc_cortex_m4_debug" 227 forward_variables_from(arm_gcc_toolchain_tools, "*") 228 defaults = { 229 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4 + 230 [ "$dir_pw_build:optimize_debugging" ] 231 } 232 } 233 cortex_m4_speed_optimized = { 234 name = "arm_gcc_cortex_m4_speed_optimized" 235 forward_variables_from(arm_gcc_toolchain_tools, "*") 236 defaults = { 237 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4 + 238 [ "$dir_pw_build:optimize_speed" ] 239 } 240 } 241 cortex_m4_size_optimized = { 242 name = "arm_gcc_cortex_m4_size_optimized" 243 forward_variables_from(arm_gcc_toolchain_tools, "*") 244 defaults = { 245 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4 + 246 [ "$dir_pw_build:optimize_size" ] 247 } 248 } 249 cortex_m4f_debug = { 250 name = "arm_gcc_cortex_m4f_debug" 251 forward_variables_from(arm_gcc_toolchain_tools, "*") 252 defaults = { 253 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4f + 254 [ "$dir_pw_build:optimize_debugging" ] 255 } 256 } 257 cortex_m4f_speed_optimized = { 258 name = "arm_gcc_cortex_m4f_speed_optimized" 259 forward_variables_from(arm_gcc_toolchain_tools, "*") 260 defaults = { 261 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4f + 262 [ "$dir_pw_build:optimize_speed" ] 263 } 264 } 265 cortex_m4f_size_optimized = { 266 name = "arm_gcc_cortex_m4f_size_optimized" 267 forward_variables_from(arm_gcc_toolchain_tools, "*") 268 defaults = { 269 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4f + 270 [ "$dir_pw_build:optimize_size" ] 271 } 272 } 273 cortex_m7_debug = { 274 name = "arm_gcc_cortex_m7_debug" 275 forward_variables_from(arm_gcc_toolchain_tools, "*") 276 defaults = { 277 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7 + 278 [ "$dir_pw_build:optimize_debugging" ] 279 } 280 } 281 cortex_m7_speed_optimized = { 282 name = "arm_gcc_cortex_m7_speed_optimized" 283 forward_variables_from(arm_gcc_toolchain_tools, "*") 284 defaults = { 285 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7 + 286 [ "$dir_pw_build:optimize_speed" ] 287 } 288 } 289 cortex_m7_size_optimized = { 290 name = "arm_gcc_cortex_m7_size_optimized" 291 forward_variables_from(arm_gcc_toolchain_tools, "*") 292 defaults = { 293 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7 + 294 [ "$dir_pw_build:optimize_size" ] 295 } 296 } 297 cortex_m7f_debug = { 298 name = "arm_gcc_cortex_m7f_debug" 299 forward_variables_from(arm_gcc_toolchain_tools, "*") 300 defaults = { 301 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7f + 302 [ "$dir_pw_build:optimize_debugging" ] 303 } 304 } 305 cortex_m7f_speed_optimized = { 306 name = "arm_gcc_cortex_m7f_speed_optimized" 307 forward_variables_from(arm_gcc_toolchain_tools, "*") 308 defaults = { 309 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7f + 310 [ "$dir_pw_build:optimize_speed" ] 311 } 312 } 313 cortex_m7f_size_optimized = { 314 name = "arm_gcc_cortex_m7f_size_optimized" 315 forward_variables_from(arm_gcc_toolchain_tools, "*") 316 defaults = { 317 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7f + 318 [ "$dir_pw_build:optimize_size" ] 319 } 320 } 321 cortex_m33_debug = { 322 name = "arm_gcc_cortex_m33_debug" 323 forward_variables_from(arm_gcc_toolchain_tools, "*") 324 defaults = { 325 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33 + 326 [ "$dir_pw_build:optimize_debugging" ] 327 } 328 } 329 cortex_m33_speed_optimized = { 330 name = "arm_gcc_cortex_m33_speed_optimized" 331 forward_variables_from(arm_gcc_toolchain_tools, "*") 332 defaults = { 333 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33 + 334 [ "$dir_pw_build:optimize_speed" ] 335 } 336 } 337 cortex_m33_size_optimized = { 338 name = "arm_gcc_cortex_m33_size_optimized" 339 forward_variables_from(arm_gcc_toolchain_tools, "*") 340 defaults = { 341 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33 + 342 [ "$dir_pw_build:optimize_size" ] 343 } 344 } 345 cortex_m33f_debug = { 346 name = "arm_gcc_cortex_m33f_debug" 347 forward_variables_from(arm_gcc_toolchain_tools, "*") 348 defaults = { 349 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33f + 350 [ "$dir_pw_build:optimize_debugging" ] 351 } 352 } 353 cortex_m33f_speed_optimized = { 354 name = "arm_gcc_cortex_m33f_speed_optimized" 355 forward_variables_from(arm_gcc_toolchain_tools, "*") 356 defaults = { 357 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33f + 358 [ "$dir_pw_build:optimize_speed" ] 359 } 360 } 361 cortex_m33f_size_optimized = { 362 name = "arm_gcc_cortex_m33f_size_optimized" 363 forward_variables_from(arm_gcc_toolchain_tools, "*") 364 defaults = { 365 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33f + 366 [ "$dir_pw_build:optimize_size" ] 367 } 368 } 369 370 cortex_m55_debug = { 371 name = "arm_gcc_cortex_m55_debug" 372 forward_variables_from(arm_gcc_toolchain_tools, "*") 373 defaults = { 374 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m55 + 375 [ "$dir_pw_build:optimize_debugging" ] 376 } 377 } 378 cortex_m55_speed_optimized = { 379 name = "arm_gcc_cortex_m55_speed_optimized" 380 forward_variables_from(arm_gcc_toolchain_tools, "*") 381 defaults = { 382 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m55 + 383 [ "$dir_pw_build:optimize_speed" ] 384 } 385 } 386 cortex_m55_size_optimized = { 387 name = "arm_gcc_cortex_m55_size_optimized" 388 forward_variables_from(arm_gcc_toolchain_tools, "*") 389 defaults = { 390 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m55 + 391 [ "$dir_pw_build:optimize_size" ] 392 } 393 } 394 cortex_m55f_debug = { 395 name = "arm_gcc_cortex_m55f_debug" 396 forward_variables_from(arm_gcc_toolchain_tools, "*") 397 defaults = { 398 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m55f + 399 [ "$dir_pw_build:optimize_debugging" ] 400 } 401 } 402 cortex_m55f_speed_optimized = { 403 name = "arm_gcc_cortex_m55f_speed_optimized" 404 forward_variables_from(arm_gcc_toolchain_tools, "*") 405 defaults = { 406 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m55f + 407 [ "$dir_pw_build:optimize_speed" ] 408 } 409 } 410 411 cortex_m55f_size_optimized = { 412 name = "arm_gcc_cortex_m55f_size_optimized" 413 forward_variables_from(arm_gcc_toolchain_tools, "*") 414 defaults = { 415 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m55f + 416 [ "$dir_pw_build:optimize_size" ] 417 } 418 } 419 420 cortex_a32_debug = { 421 name = "arm_gcc_cortex_a32_debug" 422 forward_variables_from(arm_gcc_toolchain_tools, "*") 423 defaults = { 424 default_configs = pigweed_default_configs + _arm_gcc + _cortex_a32 + 425 [ "$dir_pw_build:optimize_debugging" ] 426 } 427 } 428 cortex_a32_speed_optimized = { 429 name = "arm_gcc_cortex_a32_speed_optimized" 430 forward_variables_from(arm_gcc_toolchain_tools, "*") 431 defaults = { 432 default_configs = pigweed_default_configs + _arm_gcc + _cortex_a32 + 433 [ "$dir_pw_build:optimize_speed" ] 434 } 435 } 436 cortex_a32_size_optimized = { 437 name = "arm_gcc_cortex_a32_size_optimized" 438 forward_variables_from(arm_gcc_toolchain_tools, "*") 439 defaults = { 440 default_configs = pigweed_default_configs + _arm_gcc + _cortex_a32 + 441 [ "$dir_pw_build:optimize_size" ] 442 } 443 } 444} 445 446# This list just contains the members of the above scope for convenience to make 447# it trivial to generate all the toolchains in this file via a 448# `generate_toolchains` target. 449pw_toolchain_arm_gcc_list = [ 450 pw_toolchain_arm_gcc.cortex_m0plus_debug, 451 pw_toolchain_arm_gcc.cortex_m0plus_speed_optimized, 452 pw_toolchain_arm_gcc.cortex_m0plus_size_optimized, 453 pw_toolchain_arm_gcc.cortex_m3_debug, 454 pw_toolchain_arm_gcc.cortex_m3_speed_optimized, 455 pw_toolchain_arm_gcc.cortex_m3_size_optimized, 456 pw_toolchain_arm_gcc.cortex_m4_debug, 457 pw_toolchain_arm_gcc.cortex_m4_speed_optimized, 458 pw_toolchain_arm_gcc.cortex_m4_size_optimized, 459 pw_toolchain_arm_gcc.cortex_m4f_debug, 460 pw_toolchain_arm_gcc.cortex_m4f_speed_optimized, 461 pw_toolchain_arm_gcc.cortex_m4f_size_optimized, 462 pw_toolchain_arm_gcc.cortex_m7_debug, 463 pw_toolchain_arm_gcc.cortex_m7_speed_optimized, 464 pw_toolchain_arm_gcc.cortex_m7_size_optimized, 465 pw_toolchain_arm_gcc.cortex_m7f_debug, 466 pw_toolchain_arm_gcc.cortex_m7f_speed_optimized, 467 pw_toolchain_arm_gcc.cortex_m7f_size_optimized, 468 pw_toolchain_arm_gcc.cortex_m33_debug, 469 pw_toolchain_arm_gcc.cortex_m33_speed_optimized, 470 pw_toolchain_arm_gcc.cortex_m33_size_optimized, 471 pw_toolchain_arm_gcc.cortex_m33f_debug, 472 pw_toolchain_arm_gcc.cortex_m33f_speed_optimized, 473 pw_toolchain_arm_gcc.cortex_m33f_size_optimized, 474 pw_toolchain_arm_gcc.cortex_m55_debug, 475 pw_toolchain_arm_gcc.cortex_m55_speed_optimized, 476 pw_toolchain_arm_gcc.cortex_m55_size_optimized, 477 pw_toolchain_arm_gcc.cortex_m55f_debug, 478 pw_toolchain_arm_gcc.cortex_m55f_speed_optimized, 479 pw_toolchain_arm_gcc.cortex_m55f_size_optimized, 480 pw_toolchain_arm_gcc.cortex_a32_debug, 481 pw_toolchain_arm_gcc.cortex_a32_speed_optimized, 482 pw_toolchain_arm_gcc.cortex_a32_size_optimized, 483] 484 485# Configs that require Arm GCC 12 or newer to use. Downstream projects that use 486# older compilers should remove these from default_configs. 487pw_toolchain_arm_gcc_12_configs = 488 [ "$dir_pw_toolchain/arm_gcc:disable_rwx_segment_warning" ] 489