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