# 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.

import("compiled_action.gni")
import("executable_suffix.gni")
import("prebuilt_dart_sdk.gni")

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

# A template for running Dart scripts during the build. This should *not* be
# used for generating snapshots. It uses the dart binary from the prebuilt
# Dart SDK if one is available, and dart_bootstrap otherwise.
#
# Parameters:
#  script:
#    The un-rebased path to the Dart script.
#
#  args:
#    The arguments to pass to the Dart script.

#  packages (optional):
#    The un-rebased path to the .packages file.
#
#  Forwarded to action() with the usual meaning:
#    depfile
#    deps
#    inputs
#    outputs
#    visibility
template("dart_action") {
  assert(defined(invoker.script), "script must be defined for $target_name")
  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
  assert(defined(invoker.args), "args must be defined for $target_name")
  assert(!defined(invoker.sources),
         "dart_action doesn't take a sources arg. Use inputs instead.")

  if (prebuilt_dart_exe_works) {
    action(target_name) {
      forward_variables_from(invoker, [
          "inputs",
          "outputs",
          "deps",
          "visibility",
          "depfile",
      ])
      script = "$_dart_root/build/gn_run_binary.py"
      prebuilt_dart_binary =
          "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart$executable_suffix"

      inputs += [ invoker.script ]
      if (defined(invoker.packages)) {
        inputs += [ invoker.packages ]
      }

      args = [
        "compiled_action",
        rebase_path(prebuilt_dart_binary),
      ]
      if (defined(invoker.packages)) {
        args += [
          "--packages=" + rebase_path(invoker.packages),
        ]
      }
      args += [ rebase_path(invoker.script) ] + invoker.args
    }
  } else {
    compiled_action(target_name) {
      forward_variables_from(invoker, [
          "inputs",
          "outputs",
          "deps",
          "visibility",
          "depfile",
      ])

      inputs += [ invoker.script ]
      if (defined(invoker.packages)) {
        inputs += [ invoker.packages ]
      }

      tool = "runtime/bin:dart_bootstrap"
      args = []
      if (defined(invoker.packages)) {
        args += [
          "--packages=" + rebase_path(invoker.packages),
        ]
      }
      args += [ rebase_path(invoker.script) ] + invoker.args
    }
  }
}
