xref: /aosp_15_r20/external/pigweed/pw_toolchain/arm_gcc/toolchains.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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