# 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, "*")
}
