# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# 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
#
#     http://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("//starboard/build/platforms.gni")

declare_args() {
  is_clang = true

  build_type = "devel"

  target_platform = "stub"

  is_starboard = true

  cobalt_fastbuild = getenv("IS_CI") == 1

  is_internal_build = false
}

is_debug = build_type == "debug"
is_devel = build_type == "devel"
is_qa = build_type == "qa"
is_gold = build_type == "gold"
assert(is_debug || is_devel || is_qa || is_gold)

declare_args() {
  use_tsan = getenv("USE_TSAN") == 1
}

declare_args() {
  use_asan = (is_debug || is_devel || getenv("USE_ASAN") == 1) && !use_tsan
}

assert(!(use_tsan && use_asan), "ASAN and TSAN are mutually exclusive.")

# Set some variables we never want to change.
sb_allows_memory_tracking = !is_gold
host_byteorder = "little"
is_official_build = false  # Chromium's build files expect this to be set.

# The os/cpu definitions are here to set the current platform type in
# os_definitions.gni below.
if (target_os == "") {
  target_os = host_os
}
if (target_cpu == "") {
  target_cpu = host_cpu
}
if (current_os == "") {
  current_os = target_os
}
if (current_cpu == "") {
  current_cpu = target_cpu
}
import("//starboard/build/config/os_definitions.gni")

# Get the path to the starboard implementation and include its GN
# configuration.
foreach(platform, platforms) {
  if (platform.name == target_platform) {
    starboard_path = platform.path
  }
}
assert(defined(starboard_path),
       "Please port your platform to starboard/build/platforms.gni")
host_toolchain = "//$starboard_path/toolchain:host"
_default_toolchain = "//$starboard_path/toolchain:target"
set_default_toolchain(_default_toolchain)

import("//$starboard_path/platform_configuration/configuration.gni")
import("//starboard/build/config/build_assertions.gni")

# =============================================================================
# TARGET DEFAULTS
# =============================================================================
#
# Set up the default configuration for every build target of the given type.
# The values configured here will be automatically set on the scope of the
# corresponding target. Target definitions can add or remove to the settings
# here as needed.
#
# WHAT GOES HERE?
#
# Other than the main compiler and linker configs, the only reason for a config
# to be in this list is if some targets need to explicitly override that config
# by removing it. This is how targets opt-out of flags. If you don't have that
# requirement and just need to add a config everywhere, reference it as a
# sub-config of an existing one, most commonly the main "compiler" one.

default_compiler_configs = [
  "//build/config/compiler:default_include_dirs",
  "//build/config/compiler:no_exceptions",
  "//starboard/build/config:base",
  "//starboard/build/config:host",
  "//starboard/build/config:size",
  "//starboard/build/config:target",
  "//$starboard_path/platform_configuration",
]

if (is_starboard) {
  default_compiler_configs += [ "//starboard/build/config:starboard" ]
}

set_defaults("static_library") {
  configs = default_compiler_configs + static_library_configs
}
set_defaults("source_set") {
  configs = default_compiler_configs + source_set_configs
}
set_defaults("loadable_module") {
  configs = default_compiler_configs + loadable_module_configs
}
set_defaults("executable") {
  configs = default_compiler_configs + executable_configs
}
set_defaults("shared_library") {
  configs = default_compiler_configs + shared_library_configs
}

# Set up the method of generating the install targets as defined by the
# platform.
import("$install_target_path")
template("executable") {
  executable(target_name) {
    forward_variables_from(invoker, "*", [ "install_target" ])
  }

  if (!defined(invoker.install_target) || invoker.install_target) {
    executable_target_name = target_name
    install_target(target_name + "_install") {
      forward_variables_from(invoker,
                             [
                               "content",
                               "testonly",
                             ])
      installable_target_name = executable_target_name
      type = "executable"
    }
  }
}

template("shared_library") {
  shared_library(target_name) {
    forward_variables_from(invoker, "*", [ "install_target" ])
  }

  if (!defined(invoker.install_target) || invoker.install_target) {
    shared_library_target_name = target_name
    install_target(target_name + "_install") {
      forward_variables_from(invoker,
                             [
                               "content",
                               "testonly",
                             ])
      installable_target_name = shared_library_target_name
      type = "shared_library"
    }
  }
}

# Import this down here as it relies on variables set during configuration.
import("//starboard/build/config/components.gni")
