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