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_a32 = [ 159 "$dir_pw_toolchain/arm_gcc:cortex_common", 160 "$dir_pw_toolchain/arm_gcc:cortex_a32", 161] 162 163# Describes ARM GCC toolchains for specific targets. 164pw_toolchain_arm_gcc = { 165 cortex_m0plus_debug = { 166 name = "arm_gcc_cortex_m0plus_debug" 167 forward_variables_from(arm_gcc_toolchain_tools, "*") 168 defaults = { 169 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m0plus + 170 [ "$dir_pw_build:optimize_debugging" ] 171 } 172 } 173 cortex_m0plus_speed_optimized = { 174 name = "arm_gcc_cortex_m0plus_speed_optimized" 175 forward_variables_from(arm_gcc_toolchain_tools, "*") 176 defaults = { 177 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m0plus + 178 [ "$dir_pw_build:optimize_speed" ] 179 } 180 } 181 cortex_m0plus_size_optimized = { 182 name = "arm_gcc_cortex_m0plus_size_optimized" 183 forward_variables_from(arm_gcc_toolchain_tools, "*") 184 defaults = { 185 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m0plus + 186 [ "$dir_pw_build:optimize_size" ] 187 } 188 } 189 cortex_m3_debug = { 190 name = "arm_gcc_cortex_m3_debug" 191 forward_variables_from(arm_gcc_toolchain_tools, "*") 192 defaults = { 193 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m3 + 194 [ "$dir_pw_build:optimize_debugging" ] 195 } 196 } 197 cortex_m3_speed_optimized = { 198 name = "arm_gcc_cortex_m3_speed_optimized" 199 forward_variables_from(arm_gcc_toolchain_tools, "*") 200 defaults = { 201 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m3 + 202 [ "$dir_pw_build:optimize_speed" ] 203 } 204 } 205 cortex_m3_size_optimized = { 206 name = "arm_gcc_cortex_m3_size_optimized" 207 forward_variables_from(arm_gcc_toolchain_tools, "*") 208 defaults = { 209 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m3 + 210 [ "$dir_pw_build:optimize_size" ] 211 } 212 } 213 cortex_m4_debug = { 214 name = "arm_gcc_cortex_m4_debug" 215 forward_variables_from(arm_gcc_toolchain_tools, "*") 216 defaults = { 217 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4 + 218 [ "$dir_pw_build:optimize_debugging" ] 219 } 220 } 221 cortex_m4_speed_optimized = { 222 name = "arm_gcc_cortex_m4_speed_optimized" 223 forward_variables_from(arm_gcc_toolchain_tools, "*") 224 defaults = { 225 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4 + 226 [ "$dir_pw_build:optimize_speed" ] 227 } 228 } 229 cortex_m4_size_optimized = { 230 name = "arm_gcc_cortex_m4_size_optimized" 231 forward_variables_from(arm_gcc_toolchain_tools, "*") 232 defaults = { 233 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4 + 234 [ "$dir_pw_build:optimize_size" ] 235 } 236 } 237 cortex_m4f_debug = { 238 name = "arm_gcc_cortex_m4f_debug" 239 forward_variables_from(arm_gcc_toolchain_tools, "*") 240 defaults = { 241 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4f + 242 [ "$dir_pw_build:optimize_debugging" ] 243 } 244 } 245 cortex_m4f_speed_optimized = { 246 name = "arm_gcc_cortex_m4f_speed_optimized" 247 forward_variables_from(arm_gcc_toolchain_tools, "*") 248 defaults = { 249 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4f + 250 [ "$dir_pw_build:optimize_speed" ] 251 } 252 } 253 cortex_m4f_size_optimized = { 254 name = "arm_gcc_cortex_m4f_size_optimized" 255 forward_variables_from(arm_gcc_toolchain_tools, "*") 256 defaults = { 257 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m4f + 258 [ "$dir_pw_build:optimize_size" ] 259 } 260 } 261 cortex_m7_debug = { 262 name = "arm_gcc_cortex_m7_debug" 263 forward_variables_from(arm_gcc_toolchain_tools, "*") 264 defaults = { 265 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7 + 266 [ "$dir_pw_build:optimize_debugging" ] 267 } 268 } 269 cortex_m7_speed_optimized = { 270 name = "arm_gcc_cortex_m7_speed_optimized" 271 forward_variables_from(arm_gcc_toolchain_tools, "*") 272 defaults = { 273 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7 + 274 [ "$dir_pw_build:optimize_speed" ] 275 } 276 } 277 cortex_m7_size_optimized = { 278 name = "arm_gcc_cortex_m7_size_optimized" 279 forward_variables_from(arm_gcc_toolchain_tools, "*") 280 defaults = { 281 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7 + 282 [ "$dir_pw_build:optimize_size" ] 283 } 284 } 285 cortex_m7f_debug = { 286 name = "arm_gcc_cortex_m7f_debug" 287 forward_variables_from(arm_gcc_toolchain_tools, "*") 288 defaults = { 289 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7f + 290 [ "$dir_pw_build:optimize_debugging" ] 291 } 292 } 293 cortex_m7f_speed_optimized = { 294 name = "arm_gcc_cortex_m7f_speed_optimized" 295 forward_variables_from(arm_gcc_toolchain_tools, "*") 296 defaults = { 297 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7f + 298 [ "$dir_pw_build:optimize_speed" ] 299 } 300 } 301 cortex_m7f_size_optimized = { 302 name = "arm_gcc_cortex_m7f_size_optimized" 303 forward_variables_from(arm_gcc_toolchain_tools, "*") 304 defaults = { 305 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m7f + 306 [ "$dir_pw_build:optimize_size" ] 307 } 308 } 309 cortex_m33_debug = { 310 name = "arm_gcc_cortex_m33_debug" 311 forward_variables_from(arm_gcc_toolchain_tools, "*") 312 defaults = { 313 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33 + 314 [ "$dir_pw_build:optimize_debugging" ] 315 } 316 } 317 cortex_m33_speed_optimized = { 318 name = "arm_gcc_cortex_m33_speed_optimized" 319 forward_variables_from(arm_gcc_toolchain_tools, "*") 320 defaults = { 321 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33 + 322 [ "$dir_pw_build:optimize_speed" ] 323 } 324 } 325 cortex_m33_size_optimized = { 326 name = "arm_gcc_cortex_m33_size_optimized" 327 forward_variables_from(arm_gcc_toolchain_tools, "*") 328 defaults = { 329 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33 + 330 [ "$dir_pw_build:optimize_size" ] 331 } 332 } 333 cortex_m33f_debug = { 334 name = "arm_gcc_cortex_m33f_debug" 335 forward_variables_from(arm_gcc_toolchain_tools, "*") 336 defaults = { 337 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33f + 338 [ "$dir_pw_build:optimize_debugging" ] 339 } 340 } 341 cortex_m33f_speed_optimized = { 342 name = "arm_gcc_cortex_m33f_speed_optimized" 343 forward_variables_from(arm_gcc_toolchain_tools, "*") 344 defaults = { 345 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33f + 346 [ "$dir_pw_build:optimize_speed" ] 347 } 348 } 349 cortex_m33f_size_optimized = { 350 name = "arm_gcc_cortex_m33f_size_optimized" 351 forward_variables_from(arm_gcc_toolchain_tools, "*") 352 defaults = { 353 default_configs = pigweed_default_configs + _arm_gcc + _cortex_m33f + 354 [ "$dir_pw_build:optimize_size" ] 355 } 356 } 357 358 cortex_a32_debug = { 359 name = "arm_gcc_cortex_a32_debug" 360 forward_variables_from(arm_gcc_toolchain_tools, "*") 361 defaults = { 362 default_configs = pigweed_default_configs + _arm_gcc + _cortex_a32 + 363 [ "$dir_pw_build:optimize_debugging" ] 364 } 365 } 366 cortex_a32_speed_optimized = { 367 name = "arm_gcc_cortex_a32_speed_optimized" 368 forward_variables_from(arm_gcc_toolchain_tools, "*") 369 defaults = { 370 default_configs = pigweed_default_configs + _arm_gcc + _cortex_a32 + 371 [ "$dir_pw_build:optimize_speed" ] 372 } 373 } 374 cortex_a32_size_optimized = { 375 name = "arm_gcc_cortex_a32_size_optimized" 376 forward_variables_from(arm_gcc_toolchain_tools, "*") 377 defaults = { 378 default_configs = pigweed_default_configs + _arm_gcc + _cortex_a32 + 379 [ "$dir_pw_build:optimize_size" ] 380 } 381 } 382} 383 384# This list just contains the members of the above scope for convenience to make 385# it trivial to generate all the toolchains in this file via a 386# `generate_toolchains` target. 387pw_toolchain_arm_gcc_list = [ 388 pw_toolchain_arm_gcc.cortex_m0plus_debug, 389 pw_toolchain_arm_gcc.cortex_m0plus_speed_optimized, 390 pw_toolchain_arm_gcc.cortex_m0plus_size_optimized, 391 pw_toolchain_arm_gcc.cortex_m3_debug, 392 pw_toolchain_arm_gcc.cortex_m3_speed_optimized, 393 pw_toolchain_arm_gcc.cortex_m3_size_optimized, 394 pw_toolchain_arm_gcc.cortex_m4_debug, 395 pw_toolchain_arm_gcc.cortex_m4_speed_optimized, 396 pw_toolchain_arm_gcc.cortex_m4_size_optimized, 397 pw_toolchain_arm_gcc.cortex_m4f_debug, 398 pw_toolchain_arm_gcc.cortex_m4f_speed_optimized, 399 pw_toolchain_arm_gcc.cortex_m4f_size_optimized, 400 pw_toolchain_arm_gcc.cortex_m7_debug, 401 pw_toolchain_arm_gcc.cortex_m7_speed_optimized, 402 pw_toolchain_arm_gcc.cortex_m7_size_optimized, 403 pw_toolchain_arm_gcc.cortex_m7f_debug, 404 pw_toolchain_arm_gcc.cortex_m7f_speed_optimized, 405 pw_toolchain_arm_gcc.cortex_m7f_size_optimized, 406 pw_toolchain_arm_gcc.cortex_m33_debug, 407 pw_toolchain_arm_gcc.cortex_m33_speed_optimized, 408 pw_toolchain_arm_gcc.cortex_m33_size_optimized, 409 pw_toolchain_arm_gcc.cortex_m33f_debug, 410 pw_toolchain_arm_gcc.cortex_m33f_speed_optimized, 411 pw_toolchain_arm_gcc.cortex_m33f_size_optimized, 412 pw_toolchain_arm_gcc.cortex_a32_debug, 413 pw_toolchain_arm_gcc.cortex_a32_speed_optimized, 414 pw_toolchain_arm_gcc.cortex_a32_size_optimized, 415] 416 417# Configs that require Arm GCC 12 or newer to use. Downstream projects that use 418# older compilers should remove these from default_configs. 419pw_toolchain_arm_gcc_12_configs = 420 [ "$dir_pw_toolchain/arm_gcc:disable_rwx_segment_warning" ] 421