xref: /aosp_15_r20/external/pigweed/targets/host/target_toolchains.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1# Copyright 2024 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")
16
17import("$dir_pigweed/targets/common/stl.gni")
18import("$dir_pw_async/backend.gni")
19import("$dir_pw_async2/backend.gni")
20import("$dir_pw_perf_test/perf_test.gni")
21import("$dir_pw_protobuf_compiler/proto.gni")
22import("$dir_pw_rpc/system_server/backend.gni")
23import("$dir_pw_sys_io/backend.gni")
24import("$dir_pw_system/backend.gni")
25import("$dir_pw_third_party/nanopb/nanopb.gni")
26import("$dir_pw_toolchain/host_clang/toolchains.gni")
27import("$dir_pw_toolchain/host_gcc/toolchains.gni")
28import("$dir_pw_toolchain/traits.gni")
29import("$dir_pw_trace/backend.gni")
30import("$dir_pw_trace_tokenized/config.gni")
31
32_host_common = {
33  forward_variables_from(pw_targets_STL_BACKEND_GROUP, "*")
34
35  # Use logging-based test output on host.
36  pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main"
37
38  # Used to configure logging-based perftest on host
39  pw_perf_test_MAIN_FUNCTION = "$dir_pw_perf_test:logging_main"
40
41  # Configure backend for assert facade.
42  pw_assert_BACKEND = "$dir_pw_assert:print_and_abort_check_backend"
43  pw_assert_LITE_BACKEND = "$dir_pw_assert:print_and_abort_assert_backend"
44
45  # Configure backend for legacy facade.
46  pw_async_TASK_BACKEND = "$dir_pw_async_basic:task"
47  pw_async_FAKE_DISPATCHER_BACKEND = "$dir_pw_async_basic:fake_dispatcher"
48
49  # Configure backend for async facade.
50  pw_async2_DISPATCHER_BACKEND = "$dir_pw_async2_basic:dispatcher_backend"
51
52  # Configure backend for logging facade.
53  pw_log_BACKEND = "$dir_pw_log_basic"
54
55  # Enable decimal expansion when converting floats to string.
56  pw_string_CONFIG = "$dir_pw_string:enable_decimal_float_expansion"
57
58  # Configure backend for pw_sys_io facade.
59  pw_sys_io_BACKEND = "$dir_pw_sys_io_stdio"
60
61  # Configure backend for pw_rpc_system_server.
62  pw_rpc_system_server_BACKEND = "$dir_pigweed/targets/host:system_rpc_server"
63
64  # Configure backend for trace facade.
65  pw_trace_BACKEND = "$dir_pw_trace_tokenized"
66
67  # Tokenizer trace time.
68  pw_trace_tokenizer_time = "$dir_pw_trace_tokenized:host_trace_time"
69
70  # Configure backend for pw_perf_test timing facade.
71  pw_perf_test_TIMER_INTERFACE_BACKEND = "$dir_pw_perf_test:chrono_timer"
72
73  pw_build_LINK_DEPS = []  # Explicit list overwrite required by GN
74  pw_build_LINK_DEPS = [
75    "$dir_pw_assert:impl",
76    "$dir_pw_log:impl",
77  ]
78
79  # Specify builtin GN variables.
80  current_os = host_os
81  current_cpu = host_cpu
82}
83
84# Linux-specific target configuration.
85_linux_config = {
86  pw_bloat_BLOATY_CONFIG = get_path_info("linux.bloaty", "abspath")
87  pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test", "abspath")
88  pw_async2_DISPATCHER_BACKEND = "$dir_pw_async2_epoll:dispatcher_backend"
89}
90
91# macOS-specific target configuration.
92_mac_config = {
93  pw_bloat_BLOATY_CONFIG = get_path_info("macos.bloaty", "abspath")
94  pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test", "abspath")
95}
96
97# Windows-specific target configuration.
98_win_config = {
99  # This is here as bloaty_config_file cannot be an empty string or GN fails.
100  # TODO(frolv): Add this file and enable size reports on Windows.
101  pw_bloat_BLOATY_CONFIG = get_path_info("windows.bloaty", "abspath")
102  pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test.bat", "abspath")
103}
104
105_os_specific_config = {
106  if (host_os == "linux") {
107    forward_variables_from(_linux_config, "*")
108  } else if (host_os == "mac") {
109    forward_variables_from(_mac_config, "*")
110  } else if (host_os == "win") {
111    forward_variables_from(_win_config, "*")
112  }
113}
114
115_clang_default_configs = [
116  "$dir_pw_build:extra_strict_warnings",
117  "$dir_pw_build:clang_thread_safety_warnings",
118]
119_internal_clang_default_configs =
120    _clang_default_configs + [ "$dir_pw_build:internal_strict_warnings" ]
121
122_gcc_default_configs = [
123  "$dir_pw_build:extra_strict_warnings",
124  "$dir_pw_toolchain/host_gcc:threading_support",
125]
126_internal_gcc_default_configs =
127    _gcc_default_configs + [ "$dir_pw_build:internal_strict_warnings" ]
128
129_excluded_members = [
130  "defaults",
131  "name",
132]
133
134pw_target_toolchain_host = {
135  clang_debug = {
136    name = "host_clang_debug"
137    _toolchain_base = pw_toolchain_host_clang.debug
138    forward_variables_from(_toolchain_base, "*", _excluded_members)
139    defaults = {
140      forward_variables_from(_toolchain_base.defaults, "*")
141      forward_variables_from(_host_common, "*")
142      forward_variables_from(_os_specific_config, "*")
143      default_configs += _clang_default_configs
144    }
145  }
146
147  clang_speed_optimized = {
148    name = "host_clang_speed_optimized"
149    _toolchain_base = pw_toolchain_host_clang.speed_optimized
150    forward_variables_from(_toolchain_base, "*", _excluded_members)
151    defaults = {
152      forward_variables_from(_toolchain_base.defaults, "*")
153      forward_variables_from(_host_common, "*")
154      forward_variables_from(_os_specific_config, "*")
155      default_configs += _clang_default_configs
156    }
157  }
158
159  clang_size_optimized = {
160    name = "host_clang_size_optimized"
161    _toolchain_base = pw_toolchain_host_clang.size_optimized
162    forward_variables_from(_toolchain_base, "*", _excluded_members)
163    defaults = {
164      forward_variables_from(_toolchain_base.defaults, "*")
165      forward_variables_from(_host_common, "*")
166      forward_variables_from(_os_specific_config, "*")
167      default_configs += _clang_default_configs
168    }
169  }
170
171  clang_fuzz = {
172    name = "host_clang_fuzz"
173    _toolchain_base = pw_toolchain_host_clang.fuzz
174    forward_variables_from(_toolchain_base, "*", _excluded_members)
175    defaults = {
176      forward_variables_from(_toolchain_base.defaults, "*")
177      forward_variables_from(_host_common, "*", [ "pw_unit_test_MAIN" ])
178      forward_variables_from(_os_specific_config, "*")
179      default_configs += _clang_default_configs
180
181      # Always use the FuzzTest wrappers around gtest and gtest_main.
182      pw_unit_test_MAIN = "$dir_pw_fuzzer:fuzztest_main"
183      pw_unit_test_BACKEND = "$dir_pw_fuzzer:gtest"
184    }
185  }
186
187  clang_asan = {
188    name = "host_clang_asan"
189    _toolchain_base = pw_toolchain_host_clang.asan
190    forward_variables_from(_toolchain_base, "*", _excluded_members)
191    defaults = {
192      forward_variables_from(_toolchain_base.defaults, "*")
193      forward_variables_from(_host_common, "*")
194      forward_variables_from(_os_specific_config, "*")
195      default_configs += _clang_default_configs
196    }
197  }
198
199  clang_ubsan = {
200    name = "host_clang_ubsan"
201    _toolchain_base = pw_toolchain_host_clang.ubsan
202    forward_variables_from(_toolchain_base, "*", _excluded_members)
203    defaults = {
204      forward_variables_from(_toolchain_base.defaults, "*")
205      forward_variables_from(_host_common, "*")
206      forward_variables_from(_os_specific_config, "*")
207      default_configs += _clang_default_configs
208    }
209  }
210
211  clang_ubsan_heuristic = {
212    name = "host_clang_ubsan_heuristic"
213    _toolchain_base = pw_toolchain_host_clang.ubsan_heuristic
214    forward_variables_from(_toolchain_base, "*", _excluded_members)
215    defaults = {
216      forward_variables_from(_toolchain_base.defaults, "*")
217      forward_variables_from(_host_common, "*")
218      forward_variables_from(_os_specific_config, "*")
219      default_configs += _clang_default_configs
220    }
221  }
222
223  clang_msan = {
224    name = "host_clang_msan"
225    _toolchain_base = pw_toolchain_host_clang.msan
226    forward_variables_from(_toolchain_base, "*", _excluded_members)
227    defaults = {
228      forward_variables_from(_toolchain_base.defaults, "*")
229      forward_variables_from(_host_common, "*")
230      forward_variables_from(_os_specific_config, "*")
231      default_configs += _clang_default_configs
232    }
233  }
234
235  clang_tsan = {
236    name = "host_clang_tsan"
237    _toolchain_base = pw_toolchain_host_clang.tsan
238    forward_variables_from(_toolchain_base, "*", _excluded_members)
239    defaults = {
240      forward_variables_from(_toolchain_base.defaults, "*")
241      forward_variables_from(_host_common, "*")
242      forward_variables_from(_os_specific_config, "*")
243      default_configs += _clang_default_configs
244    }
245  }
246
247  clang_coverage = {
248    name = "host_clang_coverage"
249    _toolchain_base = pw_toolchain_host_clang.coverage
250    forward_variables_from(_toolchain_base, "*", _excluded_members)
251    defaults = {
252      forward_variables_from(_toolchain_base.defaults, "*")
253      forward_variables_from(_host_common, "*")
254      forward_variables_from(_os_specific_config, "*")
255      default_configs += _clang_default_configs
256    }
257  }
258
259  gcc_debug = {
260    name = "host_gcc_debug"
261    _toolchain_base = pw_toolchain_host_gcc.debug
262    forward_variables_from(_toolchain_base, "*", _excluded_members)
263    defaults = {
264      forward_variables_from(_toolchain_base.defaults, "*")
265      forward_variables_from(_host_common, "*")
266      forward_variables_from(_os_specific_config, "*")
267      default_configs += _gcc_default_configs
268    }
269  }
270
271  gcc_speed_optimized = {
272    name = "host_gcc_speed_optimized"
273    _toolchain_base = pw_toolchain_host_gcc.speed_optimized
274    forward_variables_from(_toolchain_base, "*", _excluded_members)
275    defaults = {
276      forward_variables_from(_toolchain_base.defaults, "*")
277      forward_variables_from(_host_common, "*")
278      forward_variables_from(_os_specific_config, "*")
279      default_configs += _gcc_default_configs
280    }
281  }
282
283  gcc_size_optimized = {
284    name = "host_gcc_size_optimized"
285    _toolchain_base = pw_toolchain_host_gcc.size_optimized
286    forward_variables_from(_toolchain_base, "*", _excluded_members)
287    defaults = {
288      forward_variables_from(_toolchain_base.defaults, "*")
289      forward_variables_from(_host_common, "*")
290      forward_variables_from(_os_specific_config, "*")
291      default_configs += _gcc_default_configs
292    }
293  }
294}
295
296# This list just contains the members of the above scope for convenience to make
297# it trivial to generate all the toolchains in this file via a
298# `generate_toolchains` target.
299pw_target_toolchain_host_list = [
300  pw_target_toolchain_host.clang_debug,
301  pw_target_toolchain_host.clang_speed_optimized,
302  pw_target_toolchain_host.clang_size_optimized,
303  pw_target_toolchain_host.clang_fuzz,
304  pw_target_toolchain_host.clang_asan,
305  pw_target_toolchain_host.clang_ubsan,
306  pw_target_toolchain_host.clang_ubsan_heuristic,
307  pw_target_toolchain_host.clang_msan,
308  pw_target_toolchain_host.clang_tsan,
309  pw_target_toolchain_host.clang_coverage,
310  pw_target_toolchain_host.gcc_debug,
311  pw_target_toolchain_host.gcc_speed_optimized,
312  pw_target_toolchain_host.gcc_size_optimized,
313]
314
315# Additional configuration intended only for upstream Pigweed use.
316_pigweed_internal = {
317  pw_status_CONFIG = "$dir_pw_status:check_if_used"
318
319  # TODO: b/241565082 - Enable NC testing in GN Windows when it is fixed.
320  pw_compilation_testing_NEGATIVE_COMPILATION_ENABLED = host_os != "win"
321}
322
323# Host toolchains exclusively for upstream Pigweed use. To give upstream Pigweed
324# flexibility in how it compiles code, these toolchains may not be used by
325# downstream projects.
326pw_internal_host_toolchains = [
327  {
328    name = "pw_strict_host_clang_debug"
329    _toolchain_base = pw_toolchain_host_clang.debug
330    forward_variables_from(_toolchain_base, "*", _excluded_members)
331    defaults = {
332      forward_variables_from(_toolchain_base.defaults, "*")
333      forward_variables_from(_host_common, "*")
334      forward_variables_from(_pigweed_internal, "*")
335      forward_variables_from(_os_specific_config, "*")
336      default_configs += _internal_clang_default_configs
337    }
338  },
339  {
340    name = "pw_strict_host_clang_speed_optimized"
341    _toolchain_base = pw_toolchain_host_clang.speed_optimized
342    forward_variables_from(_toolchain_base, "*", _excluded_members)
343    defaults = {
344      forward_variables_from(_toolchain_base.defaults, "*")
345      forward_variables_from(_host_common, "*")
346      forward_variables_from(_pigweed_internal, "*")
347      forward_variables_from(_os_specific_config, "*")
348      default_configs += _internal_clang_default_configs
349    }
350  },
351  {
352    name = "pw_strict_host_clang_size_optimized"
353    _toolchain_base = pw_toolchain_host_clang.size_optimized
354    forward_variables_from(_toolchain_base, "*", _excluded_members)
355    defaults = {
356      forward_variables_from(_toolchain_base.defaults, "*")
357      forward_variables_from(_host_common, "*")
358      forward_variables_from(_pigweed_internal, "*")
359      forward_variables_from(_os_specific_config, "*")
360      default_configs += _internal_clang_default_configs
361    }
362  },
363  {
364    name = "pw_strict_host_clang_fuzz"
365    _toolchain_base = pw_toolchain_host_clang.fuzz
366    forward_variables_from(_toolchain_base, "*", _excluded_members)
367    defaults = {
368      forward_variables_from(_toolchain_base.defaults, "*")
369      forward_variables_from(_host_common, "*", [ "pw_unit_test_MAIN" ])
370      forward_variables_from(_pigweed_internal, "*")
371      forward_variables_from(_os_specific_config, "*")
372      default_configs += _internal_clang_default_configs
373
374      # Always use the FuzzTest wrapper around gtest_main.
375      pw_unit_test_MAIN = "$dir_pw_fuzzer:fuzztest_main"
376      pw_unit_test_BACKEND = "$dir_pw_fuzzer:gtest"
377    }
378  },
379  {
380    name = "pw_strict_host_gcc_debug"
381    _toolchain_base = pw_toolchain_host_gcc.debug
382    forward_variables_from(_toolchain_base, "*", _excluded_members)
383    defaults = {
384      forward_variables_from(_toolchain_base.defaults, "*")
385      forward_variables_from(_host_common, "*")
386      forward_variables_from(_pigweed_internal, "*")
387      forward_variables_from(_os_specific_config, "*")
388      default_configs += _internal_gcc_default_configs
389    }
390  },
391  {
392    name = "pw_strict_host_gcc_speed_optimized"
393    _toolchain_base = pw_toolchain_host_gcc.speed_optimized
394    forward_variables_from(_toolchain_base, "*", _excluded_members)
395    defaults = {
396      forward_variables_from(_toolchain_base.defaults, "*")
397      forward_variables_from(_host_common, "*")
398      forward_variables_from(_pigweed_internal, "*")
399      forward_variables_from(_os_specific_config, "*")
400      default_configs += _internal_gcc_default_configs
401    }
402  },
403  {
404    name = "pw_strict_host_gcc_size_optimized"
405    _toolchain_base = pw_toolchain_host_gcc.size_optimized
406    forward_variables_from(_toolchain_base, "*", _excluded_members)
407    defaults = {
408      forward_variables_from(_toolchain_base.defaults, "*")
409      forward_variables_from(_host_common, "*")
410      forward_variables_from(_pigweed_internal, "*")
411      forward_variables_from(_os_specific_config, "*")
412      default_configs += _internal_gcc_default_configs
413    }
414  },
415  {
416    name = "pw_strict_host_clang_size_optimized_cpp20"
417    _toolchain_base = pw_toolchain_host_clang.size_optimized
418    forward_variables_from(_toolchain_base, "*", _excluded_members)
419    defaults = {
420      forward_variables_from(_toolchain_base.defaults, "*")
421      forward_variables_from(_host_common, "*")
422      forward_variables_from(_pigweed_internal, "*")
423      forward_variables_from(_os_specific_config, "*")
424      default_configs += _internal_clang_default_configs
425
426      # Don't enable span asserts since C++20 provides the implementation for
427      # pw::span, and there's no way to ensure asserts are enabled for the C++
428      # standard library's std::span implementation.
429      pw_span_ENABLE_ASSERTS = false
430
431      # Set the C++ standard to C++20 instead of the default.
432      pw_toolchain_CXX_STANDARD = pw_toolchain_STANDARD.CXX20
433    }
434  },
435  {
436    name = "pw_strict_host_clang_size_optimized_minimal_cpp_stdlib"
437    _toolchain_base = pw_toolchain_host_clang.size_optimized
438    forward_variables_from(_toolchain_base, "*", _excluded_members)
439    defaults = {
440      forward_variables_from(_toolchain_base.defaults, "*")
441      forward_variables_from(_host_common, "*")
442      forward_variables_from(_pigweed_internal, "*")
443      forward_variables_from(_os_specific_config, "*")
444      default_configs += _internal_clang_default_configs
445      default_public_deps = [ "$dir_pw_minimal_cpp_stdlib" ]
446    }
447  },
448  {
449    name = "pw_strict_host_clang_debug_dynamic_allocation"
450    _toolchain_base = pw_toolchain_host_clang.debug
451    forward_variables_from(_toolchain_base, "*", _excluded_members)
452    defaults = {
453      forward_variables_from(_toolchain_base.defaults, "*")
454      forward_variables_from(_host_common, "*")
455      forward_variables_from(_pigweed_internal, "*")
456      forward_variables_from(_os_specific_config, "*")
457      default_configs += _internal_clang_default_configs
458
459      pw_function_CONFIG = "$dir_pw_function:enable_dynamic_allocation"
460      pw_rpc_CONFIG = "$dir_pw_rpc:use_dynamic_allocation"
461    }
462  },
463]
464