# 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")
import("../sdk_args.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
  }

  outline = "vm_outline_strong.dill"
  if (defined(invoker.outline)) {
    outline = invoker.outline
  }

  prebuilt_dart_action(target_name) {
    if (defined(invoker.pool)) {
      pool = invoker.pool
    }
    script = "$_dart_root/pkg/front_end/tool/_fasta/compile_platform.dart"

    packages = "$_dart_root/.packages"

    outputs = invoker.outputs

    vm_args = [ "-Dsdk_hash=$sdk_hash" ]

    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/$outline" ]
      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/$outline", root_build_dir) ]
    args += rebase_path(outputs, root_build_dir)
  }
}
