# Copyright 2024 The Pigweed Authors # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. import("//build_overrides/pigweed.gni") import("$dir_pw_async/backend.gni") import("$dir_pw_async2/backend.gni") import("$dir_pw_chrono/backend.gni") import("$dir_pw_perf_test/perf_test.gni") import("$dir_pw_protobuf_compiler/proto.gni") import("$dir_pw_rpc/system_server/backend.gni") import("$dir_pw_sync/backend.gni") import("$dir_pw_sys_io/backend.gni") import("$dir_pw_system/backend.gni") import("$dir_pw_third_party/nanopb/nanopb.gni") import("$dir_pw_thread/backend.gni") import("$dir_pw_toolchain/host_clang/toolchains.gni") import("$dir_pw_toolchain/host_gcc/toolchains.gni") import("$dir_pw_toolchain/traits.gni") import("$dir_pw_trace/backend.gni") import("$dir_pw_trace_tokenized/config.gni") _host_common = { # Use logging-based test output on host. pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main" # Used to configure logging-based perftest on host pw_perf_test_MAIN_FUNCTION = "$dir_pw_perf_test:logging_main" # Configure backend for assert facade. pw_assert_BACKEND = "$dir_pw_assert:print_and_abort_check_backend" pw_assert_LITE_BACKEND = "$dir_pw_assert:print_and_abort_assert_backend" # Configure backend for legacy facade. pw_async_TASK_BACKEND = "$dir_pw_async_basic:task" pw_async_FAKE_DISPATCHER_BACKEND = "$dir_pw_async_basic:fake_dispatcher" # Configure backend for async facade. pw_async2_DISPATCHER_BACKEND = "$dir_pw_async2_basic:dispatcher_backend" # Configure backend for logging facade. pw_log_BACKEND = "$dir_pw_log_basic" # Enable decimal expansion when converting floats to string. pw_string_CONFIG = "$dir_pw_string:enable_decimal_float_expansion" # Configure backends for pw_sync's facades. pw_sync_BINARY_SEMAPHORE_BACKEND = "$dir_pw_sync_stl:binary_semaphore_backend" pw_sync_CONDITION_VARIABLE_BACKEND = "$dir_pw_sync_stl:condition_variable_backend" pw_sync_COUNTING_SEMAPHORE_BACKEND = "$dir_pw_sync_stl:counting_semaphore_backend" pw_sync_INTERRUPT_SPIN_LOCK_BACKEND = "$dir_pw_sync_stl:interrupt_spin_lock" pw_sync_MUTEX_BACKEND = "$dir_pw_sync_stl:mutex_backend" pw_sync_RECURSIVE_MUTEX_BACKEND = "$dir_pw_sync_stl:recursive_mutex_backend" pw_sync_TIMED_MUTEX_BACKEND = "$dir_pw_sync_stl:timed_mutex_backend" pw_sync_THREAD_NOTIFICATION_BACKEND = "$dir_pw_sync:binary_semaphore_thread_notification_backend" pw_sync_TIMED_THREAD_NOTIFICATION_BACKEND = "$dir_pw_sync:binary_semaphore_timed_thread_notification_backend" # Configure backend for pw_sys_io facade. pw_sys_io_BACKEND = "$dir_pw_sys_io_stdio" # Configure backend for pw_rpc_system_server. pw_rpc_system_server_BACKEND = "$dir_pigweed/targets/host:system_rpc_server" # Configure backend for trace facade. pw_trace_BACKEND = "$dir_pw_trace_tokenized" # Tokenizer trace time. pw_trace_tokenizer_time = "$dir_pw_trace_tokenized:host_trace_time" # Configure backend for pw_chrono's facades. pw_chrono_SYSTEM_CLOCK_BACKEND = "$dir_pw_chrono_stl:system_clock" pw_chrono_SYSTEM_TIMER_BACKEND = "$dir_pw_chrono_stl:system_timer" # Configure backend for pw_perf_test timing facade. pw_perf_test_TIMER_INTERFACE_BACKEND = "$dir_pw_perf_test:chrono_timer" # Configure backends for pw_thread's facades. pw_thread_ID_BACKEND = "$dir_pw_thread_stl:id" pw_thread_YIELD_BACKEND = "$dir_pw_thread_stl:yield" pw_thread_SLEEP_BACKEND = "$dir_pw_thread_stl:sleep" pw_thread_THREAD_BACKEND = "$dir_pw_thread_stl:thread" pw_thread_THREAD_ITERATION_BACKEND = "$dir_pw_thread_stl:thread_iteration" pw_thread_TEST_THREAD_CONTEXT_BACKEND = "$dir_pw_thread_stl:test_thread_context" pw_build_LINK_DEPS = [] # Explicit list overwrite required by GN pw_build_LINK_DEPS = [ "$dir_pw_assert:impl", "$dir_pw_log:impl", ] # Specify builtin GN variables. current_os = host_os current_cpu = host_cpu } # Linux-specific target configuration. _linux_config = { pw_bloat_BLOATY_CONFIG = get_path_info("linux.bloaty", "abspath") pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test", "abspath") pw_async2_DISPATCHER_BACKEND = "$dir_pw_async2_epoll:dispatcher_backend" } # macOS-specific target configuration. _mac_config = { pw_bloat_BLOATY_CONFIG = get_path_info("macos.bloaty", "abspath") pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test", "abspath") } # Windows-specific target configuration. _win_config = { # This is here as bloaty_config_file cannot be an empty string or GN fails. # TODO(frolv): Add this file and enable size reports on Windows. pw_bloat_BLOATY_CONFIG = get_path_info("windows.bloaty", "abspath") pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test.bat", "abspath") } _os_specific_config = { if (host_os == "linux") { forward_variables_from(_linux_config, "*") } else if (host_os == "mac") { forward_variables_from(_mac_config, "*") } else if (host_os == "win") { forward_variables_from(_win_config, "*") } } _clang_default_configs = [ "$dir_pw_build:extra_strict_warnings", "$dir_pw_build:clang_thread_safety_warnings", ] _internal_clang_default_configs = _clang_default_configs + [ "$dir_pw_build:internal_strict_warnings" ] _gcc_default_configs = [ "$dir_pw_build:extra_strict_warnings", "$dir_pw_toolchain/host_gcc:threading_support", ] _internal_gcc_default_configs = _gcc_default_configs + [ "$dir_pw_build:internal_strict_warnings" ] _excluded_members = [ "defaults", "name", ] pw_target_toolchain_host = { clang_debug = { name = "host_clang_debug" _toolchain_base = pw_toolchain_host_clang.debug forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_speed_optimized = { name = "host_clang_speed_optimized" _toolchain_base = pw_toolchain_host_clang.speed_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_size_optimized = { name = "host_clang_size_optimized" _toolchain_base = pw_toolchain_host_clang.size_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_fuzz = { name = "host_clang_fuzz" _toolchain_base = pw_toolchain_host_clang.fuzz forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*", [ "pw_unit_test_MAIN" ]) forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs # Always use the FuzzTest wrappers around gtest and gtest_main. pw_unit_test_MAIN = "$dir_pw_fuzzer:fuzztest_main" pw_unit_test_BACKEND = "$dir_pw_fuzzer:gtest" } } clang_asan = { name = "host_clang_asan" _toolchain_base = pw_toolchain_host_clang.asan forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_ubsan = { name = "host_clang_ubsan" _toolchain_base = pw_toolchain_host_clang.ubsan forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_ubsan_heuristic = { name = "host_clang_ubsan_heuristic" _toolchain_base = pw_toolchain_host_clang.ubsan_heuristic forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_msan = { name = "host_clang_msan" _toolchain_base = pw_toolchain_host_clang.msan forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_tsan = { name = "host_clang_tsan" _toolchain_base = pw_toolchain_host_clang.tsan forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } clang_coverage = { name = "host_clang_coverage" _toolchain_base = pw_toolchain_host_clang.coverage forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _clang_default_configs } } gcc_debug = { name = "host_gcc_debug" _toolchain_base = pw_toolchain_host_gcc.debug forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _gcc_default_configs } } gcc_speed_optimized = { name = "host_gcc_speed_optimized" _toolchain_base = pw_toolchain_host_gcc.speed_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _gcc_default_configs } } gcc_size_optimized = { name = "host_gcc_size_optimized" _toolchain_base = pw_toolchain_host_gcc.size_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_os_specific_config, "*") default_configs += _gcc_default_configs } } } # This list just contains the members of the above scope for convenience to make # it trivial to generate all the toolchains in this file via a # `generate_toolchains` target. pw_target_toolchain_host_list = [ pw_target_toolchain_host.clang_debug, pw_target_toolchain_host.clang_speed_optimized, pw_target_toolchain_host.clang_size_optimized, pw_target_toolchain_host.clang_fuzz, pw_target_toolchain_host.clang_asan, pw_target_toolchain_host.clang_ubsan, pw_target_toolchain_host.clang_ubsan_heuristic, pw_target_toolchain_host.clang_msan, pw_target_toolchain_host.clang_tsan, pw_target_toolchain_host.clang_coverage, pw_target_toolchain_host.gcc_debug, pw_target_toolchain_host.gcc_speed_optimized, pw_target_toolchain_host.gcc_size_optimized, ] # Additional configuration intended only for upstream Pigweed use. _pigweed_internal = { pw_status_CONFIG = "$dir_pw_status:check_if_used" # TODO: b/241565082 - Enable NC testing in GN Windows when it is fixed. pw_compilation_testing_NEGATIVE_COMPILATION_ENABLED = host_os != "win" } # Host toolchains exclusively for upstream Pigweed use. To give upstream Pigweed # flexibility in how it compiles code, these toolchains may not be used by # downstream projects. pw_internal_host_toolchains = [ { name = "pw_strict_host_clang_debug" _toolchain_base = pw_toolchain_host_clang.debug forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_clang_default_configs } }, { name = "pw_strict_host_clang_speed_optimized" _toolchain_base = pw_toolchain_host_clang.speed_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_clang_default_configs } }, { name = "pw_strict_host_clang_size_optimized" _toolchain_base = pw_toolchain_host_clang.size_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_clang_default_configs } }, { name = "pw_strict_host_clang_fuzz" _toolchain_base = pw_toolchain_host_clang.fuzz forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*", [ "pw_unit_test_MAIN" ]) forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_clang_default_configs # Always use the FuzzTest wrapper around gtest_main. pw_unit_test_MAIN = "$dir_pw_fuzzer:fuzztest_main" pw_unit_test_BACKEND = "$dir_pw_fuzzer:gtest" } }, { name = "pw_strict_host_gcc_debug" _toolchain_base = pw_toolchain_host_gcc.debug forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_gcc_default_configs } }, { name = "pw_strict_host_gcc_speed_optimized" _toolchain_base = pw_toolchain_host_gcc.speed_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_gcc_default_configs } }, { name = "pw_strict_host_gcc_size_optimized" _toolchain_base = pw_toolchain_host_gcc.size_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_gcc_default_configs } }, { name = "pw_strict_host_clang_size_optimized_cpp20" _toolchain_base = pw_toolchain_host_clang.size_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_clang_default_configs # Don't enable span asserts since C++20 provides the implementation for # pw::span, and there's no way to ensure asserts are enabled for the C++ # standard library's std::span implementation. pw_span_ENABLE_ASSERTS = false # Set the C++ standard to C++20 instead of the default. pw_toolchain_CXX_STANDARD = pw_toolchain_STANDARD.CXX20 } }, { name = "pw_strict_host_clang_size_optimized_minimal_cpp_stdlib" _toolchain_base = pw_toolchain_host_clang.size_optimized forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_clang_default_configs default_public_deps = [ "$dir_pw_minimal_cpp_stdlib" ] } }, { name = "pw_strict_host_clang_debug_dynamic_allocation" _toolchain_base = pw_toolchain_host_clang.debug forward_variables_from(_toolchain_base, "*", _excluded_members) defaults = { forward_variables_from(_toolchain_base.defaults, "*") forward_variables_from(_host_common, "*") forward_variables_from(_pigweed_internal, "*") forward_variables_from(_os_specific_config, "*") default_configs += _internal_clang_default_configs pw_function_CONFIG = "$dir_pw_function:enable_dynamic_allocation" pw_rpc_CONFIG = "$dir_pw_rpc:use_dynamic_allocation" } }, ]