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