# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

_dart_runtime = get_path_info("../runtime", "abspath")

_base_config = [
  "$_dart_runtime:dart_arch_config",
  "$_dart_runtime:dart_config",
  "$_dart_runtime:dart_os_config",
]

_base_fuchsia_config = [
  "$_dart_runtime:dart_arch_config",
  "$_dart_runtime:dart_config",
  "$_dart_runtime:dart_os_fuchsia_config",
]

_base_host_targeting_host_config = [ "$_dart_runtime:dart_config" ]

_maybe_product = [ "$_dart_runtime:dart_maybe_product_config" ]

_product = [ "$_dart_runtime:dart_product_config" ]

_jit_config = _base_config + _maybe_product

_jit_product_config = _base_config + _product

_base_libfuzzer_config = [ "$_dart_runtime:dart_libfuzzer_config" ]

_libfuzzer_config = _base_config + _base_libfuzzer_config

_precompiled_runtime_config =
    _base_config + [
      "$_dart_runtime:dart_maybe_product_config",
      "$_dart_runtime:dart_precompiled_runtime_config",
    ]

_precompiled_runtime_product_config =
    _base_config + [
      "$_dart_runtime:dart_precompiled_runtime_config",
      "$_dart_runtime:dart_product_config",
    ]

_precompiler_base = [ "$_dart_runtime:dart_precompiler_config" ]

_precompiler_config = _base_config + _precompiler_base + _maybe_product

_precompiler_product_config = _base_config + _precompiler_base + _product

_precompiler_fuchsia_config =
    _base_fuchsia_config + _precompiler_base + _maybe_product

_precompiler_product_fuchsia_config =
    _base_fuchsia_config + _precompiler_base + _product

_precompiler_host_targeting_host_config =
    _base_host_targeting_host_config + _precompiler_base + _maybe_product

_precompiler_product_host_targeting_host_config =
    _base_host_targeting_host_config + _precompiler_base + _product

_all_configs = [
  {
    suffix = "_jit"
    configs = _jit_config
    snapshot = true
    compiler = true
    is_product = false
  },
  {
    suffix = "_jit_product"
    configs = _jit_product_config
    snapshot = true
    compiler = true
    is_product = true
  },
  {
    suffix = "_precompiled_runtime"
    configs = _precompiled_runtime_config
    snapshot = true
    compiler = false
    is_product = false
  },
  {
    suffix = "_precompiled_runtime_product"
    configs = _precompiled_runtime_product_config
    snapshot = true
    compiler = false
    is_product = true
  },
  {
    suffix = "_precompiler"
    configs = _precompiler_config
    snapshot = false
    compiler = true
    is_product = false
  },
  {
    suffix = "_precompiler_product"
    configs = _precompiler_product_config
    snapshot = false
    compiler = true
    is_product = true
  },
  {
    suffix = "_precompiler_fuchsia"
    configs = _precompiler_fuchsia_config
    snapshot = false
    compiler = true
    is_product = false
  },
  {
    suffix = "_precompiler_product_fuchsia"
    configs = _precompiler_product_fuchsia_config
    snapshot = false
    compiler = true
    is_product = true
  },
  {
    suffix = "_precompiler_host_targeting_host"
    configs = _precompiler_host_targeting_host_config
    snapshot = false
    compiler = true
    is_product = false
  },
  {
    suffix = "_precompiler_product_host_targeting_host"
    configs = _precompiler_product_host_targeting_host_config
    snapshot = false
    compiler = true
    is_product = true
  },
  {
    suffix = "_libfuzzer"
    configs = _libfuzzer_config
    snapshot = true
    compiler = true
    is_product = false
  },
]

# This template creates a target for each of the configurations listed above.
# For example:
#
#  library_for_all_configs("libfoo") {
#    target_type = "source_set"
#    sources = [ "foo.c" ]
#    configurable_deps [ ":libbar" ]
#  }
#
# will make a source_set target for libfoo_jit, libfoo_jit_product, etc. that
# depends on libbar_jit, libbar_jit_product etc. respectively.
#
# Parameters
#
#  target_type (required):
#    The target declaration or template to repeat for each configuration.
#
#  configurable_deps (optional):
#    Dependencies of this target, which are themselves generated by
#    library_for_all_configs(). The listed dependencies will be suffixed with
#    a string that matches the configuration.
#
#  extra_deps (optional):
#    Regular additional deps that don't receive special treatment.
#
#  extra_configs (optional):
#    Any configs needed in addition to the ones above.
#
#  snapshot_sources (optional):
#    Additional sources to include when the configuration has a snapshot.
#
template("library_for_all_configs") {
  assert(defined(invoker.target_type))
  extra_configs = []
  if (defined(invoker.extra_configs)) {
    extra_configs += invoker.extra_configs
  }
  configurable_deps = []
  if (defined(invoker.configurable_deps)) {
    configurable_deps += invoker.configurable_deps
  }
  extra_deps = []
  if (defined(invoker.extra_deps)) {
    extra_deps += invoker.extra_deps
  }
  extra_product_deps = []
  if (defined(invoker.extra_product_deps)) {
    extra_product_deps += invoker.extra_product_deps
  }
  extra_nonproduct_deps = []
  if (defined(invoker.extra_nonproduct_deps)) {
    extra_nonproduct_deps += invoker.extra_nonproduct_deps
  }
  foreach(conf, _all_configs) {
    target(invoker.target_type, "${target_name}${conf.suffix}") {
      forward_variables_from(invoker,
                             "*",
                             [
                               "extra_configs",
                               "extra_deps",
                               "configurable_deps",
                             ])
      configs += conf.configs + extra_configs
      configured_deps = []
      foreach(dep, configurable_deps) {
        configured_deps += [ "${dep}${conf.suffix}" ]
      }
      if (defined(compiler_lib)) {
        if (conf.compiler) {
          configured_deps += [ "${compiler_lib}${conf.suffix}" ]
        } else {
          not_needed([ "compiler_lib" ])
        }
      }
      deps = configured_deps + extra_deps
      if (conf.is_product) {
        deps += extra_product_deps
      } else {
        deps += extra_nonproduct_deps
      }
      if (conf.snapshot) {
        if (defined(snapshot_sources)) {
          sources += snapshot_sources
        }
      } else {
        if (defined(snapshot_sources)) {
          not_needed([ "snapshot_sources" ])
        }
      }
    }
  }
}

template("library_for_all_configs_with_compiler") {
  assert(defined(invoker.target_type))
  extra_configs = []
  if (defined(invoker.extra_configs)) {
    extra_configs += invoker.extra_configs
  }
  configurable_deps = []
  if (defined(invoker.configurable_deps)) {
    configurable_deps += invoker.configurable_deps
  }
  extra_deps = []
  if (defined(invoker.extra_deps)) {
    extra_deps += invoker.extra_deps
  }
  foreach(conf, _all_configs) {
    if (conf.compiler) {
      target(invoker.target_type, "${target_name}${conf.suffix}") {
        forward_variables_from(invoker,
                               "*",
                               [
                                 "extra_configs",
                                 "extra_deps",
                                 "configurable_deps",
                               ])
        configs += conf.configs + extra_configs
        configured_deps = []
        foreach(dep, configurable_deps) {
          configured_deps += [ "${dep}${conf.suffix}" ]
        }
        deps = configured_deps + extra_deps
        if (conf.snapshot) {
          if (defined(snapshot_sources)) {
            sources += snapshot_sources
          }
        } else {
          if (defined(snapshot_sources)) {
            not_needed([ "snapshot_sources" ])
          }
        }
      }
    }
  }
}
