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