• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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