# Copyright (c) 2017, 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.

import("../build/dart/dart_action.gni")

_dart_root = get_path_info("..", "abspath")

template("compile_platform") {
  assert(defined(invoker.libraries_specification_uri),
         "Need 'libraries_specification_uri' in $target_name")
  assert(defined(invoker.outputs), "Need 'outputs' in $target_name")
  assert(defined(invoker.args), "Need 'args' in $target_name")
  if (defined(invoker.single_root_scheme)) {
    assert(defined(invoker.single_root_base),
           "Need 'single_root_base' in $target_name")
  }
  if (defined(invoker.single_root_base)) {
    assert(defined(invoker.single_root_scheme),
           "Need 'single_root_scheme' in $target_name")
  }
  assert(!defined(invoker.script), "Remove 'script' from $target_name")
  assert(!defined(invoker.depfile), "Remove 'depfile' from $target_name")

  # In order to automatically compute dependencies, we need to add a dependency
  # on vm_outline.dill. This is used to include the source code of Fasta itself
  # in the dependency file. Without this, a change to Fasta wouldn't cause the
  # platform dill files to be rebuilt.  However, when building
  # vm_outline_strong.dill, we shouldn't list it as a dependency as this would
  # lead to cyclic dependencies.
  add_implicit_vm_platform_dependency = true
  if (defined(invoker.add_implicit_vm_platform_dependency)) {
    add_implicit_vm_platform_dependency =
        invoker.add_implicit_vm_platform_dependency
  }

  prebuilt_dart_action(target_name) {
    script = "$_dart_root/pkg/front_end/tool/_fasta/compile_platform.dart"

    packages = "$_dart_root/.packages"

    outputs = invoker.outputs

    inputs = []
    deps = []
    args = []

    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }

    if (add_implicit_vm_platform_dependency) {
      inputs += [ "$root_out_dir/vm_outline_strong.dill" ]
      deps += [ "$_dart_root/runtime/vm:vm_platform" ]
    }
    depfile = outputs[0] + ".d"

    args += invoker.args
    if (defined(invoker.single_root_scheme)) {
      args += [ "--single-root-scheme=" + invoker.single_root_scheme ]
    }
    if (defined(invoker.single_root_base)) {
      args += [ "--single-root-base=" + invoker.single_root_base ]
    }
    if (defined(invoker.single_root_scheme)) {
      args += [ invoker.libraries_specification_uri ]
    } else {
      args +=
          [ rebase_path(invoker.libraries_specification_uri, root_build_dir) ]
    }
    args +=
        [ rebase_path("$root_out_dir/vm_outline_strong.dill", root_build_dir) ]
    args += rebase_path(outputs, root_build_dir)
  }
}
