# 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
  },
  {
    suffix = "_jit_product"
    configs = _jit_product_config
    snapshot = true
    compiler = true
  },
  {
    suffix = "_precompiled_runtime"
    configs = _precompiled_runtime_config
    snapshot = true
    compiler = false
  },
  {
    suffix = "_precompiled_runtime_product"
    configs = _precompiled_runtime_product_config
    snapshot = true
    compiler = false
  },
  {
    suffix = "_precompiler"
    configs = _precompiler_config
    snapshot = false
    compiler = true
  },
  {
    suffix = "_precompiler_product"
    configs = _precompiler_product_config
    snapshot = false
    compiler = true
  },
  {
    suffix = "_precompiler_fuchsia"
    configs = _precompiler_fuchsia_config
    snapshot = false
    compiler = true
  },
  {
    suffix = "_precompiler_product_fuchsia"
    configs = _precompiler_product_fuchsia_config
    snapshot = false
    compiler = true
  },
  {
    suffix = "_precompiler_host_targeting_host"
    configs = _precompiler_host_targeting_host_config
    snapshot = false
    compiler = true
  },
  {
    suffix = "_precompiler_product_host_targeting_host"
    configs = _precompiler_product_host_targeting_host_config
    snapshot = false
    compiler = true
  },
  {
    suffix = "_libfuzzer"
    configs = _libfuzzer_config
    snapshot = true
    compiler = true
  },
]

# 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
  }
  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.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" ])
          }
        }
      }
    }
  }
}
