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