# 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_host_sdk_toolchain.gni")
import("../build/dart/prebuilt_dart_sdk.gni")

_is_fuchsia = defined(is_fuchsia_tree) && is_fuchsia_tree

if (_is_fuchsia) {
  import("//build/dart/dart.gni")
}

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

template("compile_platform") {
  assert(defined(invoker.sources), "Need 'sources' in $target_name")
  assert(defined(invoker.outputs), "Need 'outputs' in $target_name")
  assert(defined(invoker.args), "Need 'args' 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
  }

  action(target_name) {
    script = "$_dart_root/tools/compile_platform.py"

    sources = invoker.sources

    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"

    if (_is_fuchsia) {
      args += [
        "--dart-executable",
        rebase_path(prebuilt_dart),
      ]
    } else if (!prebuilt_dart_exe_works) {
      deps += [ "$_dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)" ]
      dart_out_dir = get_label_info(
              "$_dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)",
              "root_out_dir")
      args += [
        "--dart-executable",
        rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix"),
      ]
    }

    args += invoker.args
    args += rebase_path(sources, root_build_dir)
    args += rebase_path(outputs, root_build_dir)
  }
}
