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

_dart_root = rebase_path("..")

template("invoke_dart") {
  assert(defined(invoker.outputs), "invoke_dart must specify outputs")
  extra_deps = []
  if (defined(invoker.deps)) {
    extra_deps += invoker.deps
  }

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

  extra_args = []
  if (defined(invoker.args)) {
    extra_args += invoker.args
  }

  action(target_name) {
    relative_dart_root = rebase_path(_dart_root, ".")
    deps =
        extra_deps + [ "$relative_dart_root/runtime/bin:dart($host_toolchain)" ]

    dart_out_dir =
        get_label_info("$relative_dart_root/runtime/bin:dart($host_toolchain)",
                       "root_out_dir")
    if (is_win) {
      dart = rebase_path("$dart_out_dir/dart.exe")
    } else {
      dart = rebase_path("$dart_out_dir/dart")
    }

    inputs = [ dart ] + extra_inputs

    outputs = invoker.outputs

    script = "$_dart_root/tools/dart_for_gn.py"
    args = [ dart ] + extra_args
  }
}

template("application_snapshot") {
  assert(defined(invoker.main_dart), "Must specify 'main_dart'")
  assert(defined(invoker.training_args), "Must specify 'training_args'")
  main_dart = invoker.main_dart
  training_args = invoker.training_args
  name = target_name
  if (defined(invoker.name)) {
    name = invoker.name
  }
  extra_deps = []
  if (defined(invoker.deps)) {
    extra_deps += invoker.deps
  }
  extra_inputs = []
  if (defined(invoker.inputs)) {
    extra_inputs += invoker.inputs
  }
  invoke_dart(target_name) {
    deps = extra_deps + [ "$_dart_root/pkg:pkg_files_stamp" ]

    inputs = extra_inputs + [
               "$_dart_root/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart",
               "$root_gen_dir/pkg_files.stamp",
             ]

    output = "$root_gen_dir/$name.dart.snapshot"
    outputs = [
      output,
    ]

    dot_packages = rebase_path("$_dart_root/.packages")
    abs_output = rebase_path(output)
    main_file = rebase_path(main_dart)

    args = [
             "--packages=$dot_packages",
             "--snapshot=$abs_output",
             "--snapshot-kind=app-jit",
             main_file,
           ] + training_args
  }
}
