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

if (defined(is_win) && is_win) {
  dart_executable_suffix = ".exe"
} else {
  dart_executable_suffix = ""
}

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")
    dart = rebase_path("$dart_out_dir/dart$dart_executable_suffix")

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