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