• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  pw_rust_ENABLE_EXPERIMENTAL_BUILD = true
90}
91
92# macOS-specific target configuration.
93_mac_config = {
94  pw_bloat_BLOATY_CONFIG = get_path_info("macos.bloaty", "abspath")
95  pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test", "abspath")
96}
97
98# Windows-specific target configuration.
99_win_config = {
100  # This is here as bloaty_config_file cannot be an empty string or GN fails.
101  # TODO(frolv): Add this file and enable size reports on Windows.
102  pw_bloat_BLOATY_CONFIG = get_path_info("windows.bloaty", "abspath")
103  pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test.bat", "abspath")
104}
105
106_os_specific_config = {
107  if (host_os == "linux") {
108    forward_variables_from(_linux_config, "*")
109  } else if (host_os == "mac") {
110    forward_variables_from(_mac_config, "*")
111  } else if (host_os == "win") {
112    forward_variables_from(_win_config, "*")
113  }
114}
115
116_clang_default_configs = [
117  "$dir_pw_build:extra_strict_warnings",
118  "$dir_pw_build:clang_thread_safety_warnings",
119]
120_internal_clang_default_configs =
121    _clang_default_configs + [ "$dir_pw_build:internal_strict_warnings" ]
122
123_gcc_default_configs = [
124  "$dir_pw_build:extra_strict_warnings",
125  "$dir_pw_toolchain/host_gcc:threading_support",
126]
127_internal_gcc_default_configs =
128    _gcc_default_configs + [ "$dir_pw_build:internal_strict_warnings" ]
129
130_excluded_members = [
131  "defaults",
132  "name",
133]
134
135pw_target_toolchain_host = {
136  clang_debug = {
137    name = "host_clang_debug"
138    _toolchain_base = pw_toolchain_host_clang.debug
139    forward_variables_from(_toolchain_base, "*", _excluded_members)
140    defaults = {
141      forward_variables_from(_toolchain_base.defaults, "*")
142      forward_variables_from(_host_common, "*")
143      forward_variables_from(_os_specific_config, "*")
144      default_configs += _clang_default_configs
145    }
146  }
147
148  clang_speed_optimized = {
149    name = "host_clang_speed_optimized"
150    _toolchain_base = pw_toolchain_host_clang.speed_optimized
151    forward_variables_from(_toolchain_base, "*", _excluded_members)
152    defaults = {
153      forward_variables_from(_toolchain_base.defaults, "*")
154      forward_variables_from(_host_common, "*")
155      forward_variables_from(_os_specific_config, "*")
156      default_configs += _clang_default_configs
157    }
158  }
159
160  clang_size_optimized = {
161    name = "host_clang_size_optimized"
162    _toolchain_base = pw_toolchain_host_clang.size_optimized
163    forward_variables_from(_toolchain_base, "*", _excluded_members)
164    defaults = {
165      forward_variables_from(_toolchain_base.defaults, "*")
166      forward_variables_from(_host_common, "*")
167      forward_variables_from(_os_specific_config, "*")
168      default_configs += _clang_default_configs
169    }
170  }
171
172  clang_fuzz = {
173    name = "host_clang_fuzz"
174    _toolchain_base = pw_toolchain_host_clang.fuzz
175    forward_variables_from(_toolchain_base, "*", _excluded_members)
176    defaults = {
177      forward_variables_from(_toolchain_base.defaults, "*")
178      forward_variables_from(_host_common, "*", [ "pw_unit_test_MAIN" ])
179      forward_variables_from(_os_specific_config, "*")
180      default_configs += _clang_default_configs
181
182      # Always use the FuzzTest wrappers around gtest and gtest_main.
183      pw_unit_test_MAIN = "$dir_pw_fuzzer:fuzztest_main"
184      pw_unit_test_BACKEND = "$dir_pw_fuzzer:gtest"
185    }
186  }
187
188  clang_asan = {
189    name = "host_clang_asan"
190    _toolchain_base = pw_toolchain_host_clang.asan
191    forward_variables_from(_toolchain_base, "*", _excluded_members)
192    defaults = {
193      forward_variables_from(_toolchain_base.defaults, "*")
194      forward_variables_from(_host_common, "*")
195      forward_variables_from(_os_specific_config, "*")
196      default_configs += _clang_default_configs
197    }
198  }
199
200  clang_ubsan = {
201    name = "host_clang_ubsan"
202    _toolchain_base = pw_toolchain_host_clang.ubsan
203    forward_variables_from(_toolchain_base, "*", _excluded_members)
204    defaults = {
205      forward_variables_from(_toolchain_base.defaults, "*")
206      forward_variables_from(_host_common, "*")
207      forward_variables_from(_os_specific_config, "*")
208      default_configs += _clang_default_configs
209    }
210  }
211
212  clang_ubsan_heuristic = {
213    name = "host_clang_ubsan_heuristic"
214    _toolchain_base = pw_toolchain_host_clang.ubsan_heuristic
215    forward_variables_from(_toolchain_base, "*", _excluded_members)
216    defaults = {
217      forward_variables_from(_toolchain_base.defaults, "*")
218      forward_variables_from(_host_common, "*")
219      forward_variables_from(_os_specific_config, "*")
220      default_configs += _clang_default_configs
221    }
222  }
223
224  clang_msan = {
225    name = "host_clang_msan"
226    _toolchain_base = pw_toolchain_host_clang.msan
227    forward_variables_from(_toolchain_base, "*", _excluded_members)
228    defaults = {
229      forward_variables_from(_toolchain_base.defaults, "*")
230      forward_variables_from(_host_common, "*")
231      forward_variables_from(_os_specific_config, "*")
232      default_configs += _clang_default_configs
233    }
234  }
235
236  clang_tsan = {
237    name = "host_clang_tsan"
238    _toolchain_base = pw_toolchain_host_clang.tsan
239    forward_variables_from(_toolchain_base, "*", _excluded_members)
240    defaults = {
241      forward_variables_from(_toolchain_base.defaults, "*")
242      forward_variables_from(_host_common, "*")
243      forward_variables_from(_os_specific_config, "*")
244      default_configs += _clang_default_configs
245    }
246  }
247
248  clang_coverage = {
249    name = "host_clang_coverage"
250    _toolchain_base = pw_toolchain_host_clang.coverage
251    forward_variables_from(_toolchain_base, "*", _excluded_members)
252    defaults = {
253      forward_variables_from(_toolchain_base.defaults, "*")
254      forward_variables_from(_host_common, "*")
255      forward_variables_from(_os_specific_config, "*")
256      default_configs += _clang_default_configs
257    }
258  }
259
260  gcc_debug = {
261    name = "host_gcc_debug"
262    _toolchain_base = pw_toolchain_host_gcc.debug
263    forward_variables_from(_toolchain_base, "*", _excluded_members)
264    defaults = {
265      forward_variables_from(_toolchain_base.defaults, "*")
266      forward_variables_from(_host_common, "*")
267      forward_variables_from(_os_specific_config, "*")
268      default_configs += _gcc_default_configs
269    }
270  }
271
272  gcc_speed_optimized = {
273    name = "host_gcc_speed_optimized"
274    _toolchain_base = pw_toolchain_host_gcc.speed_optimized
275    forward_variables_from(_toolchain_base, "*", _excluded_members)
276    defaults = {
277      forward_variables_from(_toolchain_base.defaults, "*")
278      forward_variables_from(_host_common, "*")
279      forward_variables_from(_os_specific_config, "*")
280      default_configs += _gcc_default_configs
281    }
282  }
283
284  gcc_size_optimized = {
285    name = "host_gcc_size_optimized"
286    _toolchain_base = pw_toolchain_host_gcc.size_optimized
287    forward_variables_from(_toolchain_base, "*", _excluded_members)
288    defaults = {
289      forward_variables_from(_toolchain_base.defaults, "*")
290      forward_variables_from(_host_common, "*")
291      forward_variables_from(_os_specific_config, "*")
292      default_configs += _gcc_default_configs
293    }
294  }
295}
296
297# This list just contains the members of the above scope for convenience to make
298# it trivial to generate all the toolchains in this file via a
299# `generate_toolchains` target.
300pw_target_toolchain_host_list = [
301  pw_target_toolchain_host.clang_debug,
302  pw_target_toolchain_host.clang_speed_optimized,
303  pw_target_toolchain_host.clang_size_optimized,
304  pw_target_toolchain_host.clang_fuzz,
305  pw_target_toolchain_host.clang_asan,
306  pw_target_toolchain_host.clang_ubsan,
307  pw_target_toolchain_host.clang_ubsan_heuristic,
308  pw_target_toolchain_host.clang_msan,
309  pw_target_toolchain_host.clang_tsan,
310  pw_target_toolchain_host.clang_coverage,
311  pw_target_toolchain_host.gcc_debug,
312  pw_target_toolchain_host.gcc_speed_optimized,
313  pw_target_toolchain_host.gcc_size_optimized,
314]
315
316# Additional configuration intended only for upstream Pigweed use.
317_pigweed_internal = {
318  pw_status_CONFIG = "$dir_pw_status:check_if_used"
319
320  # TODO: b/241565082 - Enable NC testing in GN Windows when it is fixed.
321  pw_compilation_testing_NEGATIVE_COMPILATION_ENABLED = host_os != "win"
322}
323
324# Host toolchains exclusively for upstream Pigweed use. To give upstream Pigweed
325# flexibility in how it compiles code, these toolchains may not be used by
326# downstream projects.
327pw_internal_host_toolchains = [
328  {
329    name = "pw_strict_host_clang_debug"
330    _toolchain_base = pw_toolchain_host_clang.debug
331    forward_variables_from(_toolchain_base, "*", _excluded_members)
332    defaults = {
333      forward_variables_from(_toolchain_base.defaults, "*")
334      forward_variables_from(_host_common, "*")
335      forward_variables_from(_pigweed_internal, "*")
336      forward_variables_from(_os_specific_config, "*")
337      default_configs += _internal_clang_default_configs
338    }
339  },
340  {
341    name = "pw_strict_host_clang_speed_optimized"
342    _toolchain_base = pw_toolchain_host_clang.speed_optimized
343    forward_variables_from(_toolchain_base, "*", _excluded_members)
344    defaults = {
345      forward_variables_from(_toolchain_base.defaults, "*")
346      forward_variables_from(_host_common, "*")
347      forward_variables_from(_pigweed_internal, "*")
348      forward_variables_from(_os_specific_config, "*")
349      default_configs += _internal_clang_default_configs
350    }
351  },
352  {
353    name = "pw_strict_host_clang_size_optimized"
354    _toolchain_base = pw_toolchain_host_clang.size_optimized
355    forward_variables_from(_toolchain_base, "*", _excluded_members)
356    defaults = {
357      forward_variables_from(_toolchain_base.defaults, "*")
358      forward_variables_from(_host_common, "*")
359      forward_variables_from(_pigweed_internal, "*")
360      forward_variables_from(_os_specific_config, "*")
361      default_configs += _internal_clang_default_configs
362    }
363  },
364  {
365    name = "pw_strict_host_clang_fuzz"
366    _toolchain_base = pw_toolchain_host_clang.fuzz
367    forward_variables_from(_toolchain_base, "*", _excluded_members)
368    defaults = {
369      forward_variables_from(_toolchain_base.defaults, "*")
370      forward_variables_from(_host_common, "*", [ "pw_unit_test_MAIN" ])
371      forward_variables_from(_pigweed_internal, "*")
372      forward_variables_from(_os_specific_config, "*")
373      default_configs += _internal_clang_default_configs
374
375      # Always use the FuzzTest wrapper around gtest_main.
376      pw_unit_test_MAIN = "$dir_pw_fuzzer:fuzztest_main"
377      pw_unit_test_BACKEND = "$dir_pw_fuzzer:gtest"
378    }
379  },
380  {
381    name = "pw_strict_host_gcc_debug"
382    _toolchain_base = pw_toolchain_host_gcc.debug
383    forward_variables_from(_toolchain_base, "*", _excluded_members)
384    defaults = {
385      forward_variables_from(_toolchain_base.defaults, "*")
386      forward_variables_from(_host_common, "*")
387      forward_variables_from(_pigweed_internal, "*")
388      forward_variables_from(_os_specific_config, "*")
389      default_configs += _internal_gcc_default_configs
390    }
391  },
392  {
393    name = "pw_strict_host_gcc_speed_optimized"
394    _toolchain_base = pw_toolchain_host_gcc.speed_optimized
395    forward_variables_from(_toolchain_base, "*", _excluded_members)
396    defaults = {
397      forward_variables_from(_toolchain_base.defaults, "*")
398      forward_variables_from(_host_common, "*")
399      forward_variables_from(_pigweed_internal, "*")
400      forward_variables_from(_os_specific_config, "*")
401      default_configs += _internal_gcc_default_configs
402    }
403  },
404  {
405    name = "pw_strict_host_gcc_size_optimized"
406    _toolchain_base = pw_toolchain_host_gcc.size_optimized
407    forward_variables_from(_toolchain_base, "*", _excluded_members)
408    defaults = {
409      forward_variables_from(_toolchain_base.defaults, "*")
410      forward_variables_from(_host_common, "*")
411      forward_variables_from(_pigweed_internal, "*")
412      forward_variables_from(_os_specific_config, "*")
413      default_configs += _internal_gcc_default_configs
414    }
415  },
416  {
417    name = "pw_strict_host_clang_size_optimized_cpp20"
418    _toolchain_base = pw_toolchain_host_clang.size_optimized
419    forward_variables_from(_toolchain_base, "*", _excluded_members)
420    defaults = {
421      forward_variables_from(_toolchain_base.defaults, "*")
422      forward_variables_from(_host_common, "*")
423      forward_variables_from(_pigweed_internal, "*")
424      forward_variables_from(_os_specific_config, "*")
425      default_configs += _internal_clang_default_configs
426
427      # Don't enable span asserts since C++20 provides the implementation for
428      # pw::span, and there's no way to ensure asserts are enabled for the C++
429      # standard library's std::span implementation.
430      pw_span_ENABLE_ASSERTS = false
431
432      # Set the C++ standard to C++20 instead of the default.
433      pw_toolchain_CXX_STANDARD = pw_toolchain_STANDARD.CXX20
434    }
435  },
436  {
437    name = "pw_strict_host_clang_size_optimized_minimal_cpp_stdlib"
438    _toolchain_base = pw_toolchain_host_clang.size_optimized
439    forward_variables_from(_toolchain_base, "*", _excluded_members)
440    defaults = {
441      forward_variables_from(_toolchain_base.defaults, "*")
442      forward_variables_from(_host_common, "*")
443      forward_variables_from(_pigweed_internal, "*")
444      forward_variables_from(_os_specific_config, "*")
445      default_configs += _internal_clang_default_configs
446      default_public_deps = [ "$dir_pw_minimal_cpp_stdlib" ]
447    }
448  },
449  {
450    name = "pw_strict_host_clang_debug_dynamic_allocation"
451    _toolchain_base = pw_toolchain_host_clang.debug
452    forward_variables_from(_toolchain_base, "*", _excluded_members)
453    defaults = {
454      forward_variables_from(_toolchain_base.defaults, "*")
455      forward_variables_from(_host_common, "*")
456      forward_variables_from(_pigweed_internal, "*")
457      forward_variables_from(_os_specific_config, "*")
458      default_configs += _internal_clang_default_configs
459
460      pw_function_CONFIG = "$dir_pw_function:enable_dynamic_allocation"
461      pw_rpc_CONFIG = "$dir_pw_rpc:use_dynamic_allocation"
462    }
463  },
464]
465