# 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")

declare_args() {
  # These aren't used but they are set by the Pigweed toolchain. Declaring them
  # here silences gn warnings.
  pw_trace_BACKEND = ""
  pw_trace_tokenizer_time = ""
}

config("common_config") {
  include_dirs = [ "//include" ]

  # No language extensions, to promote portability.
  cflags_c = [
    "-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",
  ]
  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, "*")
}
