# Copyright 2020 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_chrono/backend.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_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_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"

  # Configure backend for assert facade.
  pw_assert_BACKEND = "$dir_pw_assert_basic"

  # Configure backend for logging facade.
  pw_log_BACKEND = "$dir_pw_log_basic"

  # Configure backends for pw_sync's facades.
  pw_sync_INTERRUPT_SPIN_LOCK_BACKEND = "$dir_pw_sync_stl:interrupt_spin_lock"
  pw_sync_BINARY_SEMAPHORE_BACKEND = "$dir_pw_sync_stl:binary_semaphore_backend"
  pw_sync_COUNTING_SEMAPHORE_BACKEND =
      "$dir_pw_sync_stl:counting_semaphore_backend"
  pw_sync_MUTEX_BACKEND = "$dir_pw_sync_stl: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 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_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")
}

# 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",
]
_gcc_default_configs = [
  "$dir_pw_build:extra_strict_warnings",
  "$dir_pw_toolchain/host_gcc:threading_support",
]

pw_target_toolchain_host = {
  _excluded_members = [
    "defaults",
    "name",
  ]

  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, "*")
      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.gcc_debug,
  pw_target_toolchain_host.gcc_speed_optimized,
  pw_target_toolchain_host.gcc_size_optimized,
]
