|  | # Copyright 2020 Google LLC | 
|  | # | 
|  | # 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_pigweed/targets/host/target_toolchains.gni") | 
|  | import("$dir_pw_toolchain/generate_toolchain.gni") | 
|  |  | 
|  | config("common_config") { | 
|  | include_dirs = [ "//include" ] | 
|  |  | 
|  | # No language extensions, to promote portability. | 
|  | cflags_c = [ | 
|  | "-Wvla", | 
|  | "-std=c99", | 
|  | "-pedantic", | 
|  | ] | 
|  |  | 
|  | # Modern C++ for test and tooling. | 
|  | cflags_cc = [ "-std=c++20" ] | 
|  | } | 
|  |  | 
|  | config("enable_sanitizers") { | 
|  | filter_path = rebase_path("sanitize_filter.txt", root_build_dir) | 
|  | cflags = [ | 
|  | "-fsanitize=address,undefined,integer", | 
|  | "-fsanitize-blacklist=$filter_path",  # inclusive-language: ignore | 
|  | ] | 
|  | ldflags = cflags | 
|  | inputs = [ "sanitize_filter.txt" ] | 
|  | } | 
|  |  | 
|  | config("enable_fuzzer") { | 
|  | cflags = [ | 
|  | "-fsanitize=fuzzer", | 
|  | "-O1", | 
|  | "-fno-omit-frame-pointer", | 
|  | "-fno-optimize-sibling-calls", | 
|  | ] | 
|  | ldflags = cflags | 
|  | } | 
|  |  | 
|  | # Define a scope for each toolchain that can be fed into generate_toolchain. | 
|  | _host_debug = { | 
|  | # Use Pigweed's host_clang_debug toolchain as a base. | 
|  | _toolchain_base = pw_target_toolchain_host.clang_debug | 
|  |  | 
|  | # Forward everything except the defaults scope from that toolchain. | 
|  | forward_variables_from(_toolchain_base, "*", [ "defaults" ]) | 
|  |  | 
|  | defaults = { | 
|  | # Forward everything from the base toolchain's defaults. | 
|  | forward_variables_from(_toolchain_base.defaults, "*") | 
|  |  | 
|  | # Extend with custom build arguments for the target. | 
|  | default_configs += [ | 
|  | "//toolchains:common_config", | 
|  | "//toolchains:enable_sanitizers", | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | _host_fuzz = { | 
|  | # Use Pigweed's host_clang_debug toolchain as a base. | 
|  | _toolchain_base = pw_target_toolchain_host.clang_debug | 
|  |  | 
|  | # Forward everything except the defaults scope from that toolchain. | 
|  | forward_variables_from(_toolchain_base, "*", [ "defaults" ]) | 
|  |  | 
|  | defaults = { | 
|  | # Forward everything from the base toolchain's defaults. | 
|  | forward_variables_from(_toolchain_base.defaults, "*") | 
|  |  | 
|  | # Extend with custom build arguments for the target. | 
|  | default_configs += [ | 
|  | "//toolchains:common_config", | 
|  | "//toolchains:enable_sanitizers", | 
|  | "//toolchains:enable_fuzzer", | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | _host_optimized = { | 
|  | # Use Pigweed's host_clang_size_optimized toolchain as a base. | 
|  | _toolchain_base = pw_target_toolchain_host.clang_size_optimized | 
|  |  | 
|  | # Forward everything except the defaults scope from that toolchain. | 
|  | forward_variables_from(_toolchain_base, "*", [ "defaults" ]) | 
|  |  | 
|  | defaults = { | 
|  | # Forward everything from the base toolchain's defaults. | 
|  | forward_variables_from(_toolchain_base.defaults, "*") | 
|  |  | 
|  | # Extend with custom build arguments for the target. | 
|  | default_configs += [ "//toolchains:common_config" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | # Create the actual GN toolchains. | 
|  | generate_toolchain("host_debug") { | 
|  | forward_variables_from(_host_debug, "*") | 
|  | } | 
|  |  | 
|  | generate_toolchain("host_fuzz") { | 
|  | forward_variables_from(_host_fuzz, "*") | 
|  | } | 
|  |  | 
|  | generate_toolchain("host_optimized") { | 
|  | forward_variables_from(_host_optimized, "*") | 
|  | } |