# 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")

  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
    }

    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)
  }
}
