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

import("../build/compiled_action.gni")

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

declare_args() {
  # Default to building app-jit snapshots. The simulator and cross builds
  # override this to script snapshots to cut down on build time.
  dart_snapshot_kind = "app-jit"
  if (target_cpu != host_cpu) {
    dart_snapshot_kind = "script"
  }
}

template("application_snapshot") {
  assert(defined(invoker.main_dart), "Must specify 'main_dart'")
  assert(defined(invoker.training_args), "Must specify 'training_args'")
  vm_args = []
  if (defined(invoker.vm_args)) {
    vm_args = invoker.vm_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 = [ main_dart ]
  if (defined(invoker.inputs)) {
    extra_inputs += invoker.inputs
  }
  if (defined(invoker.dot_packages)) {
    dot_packages = invoker.dot_packages
  } else {
    dot_packages = rebase_path("$_dart_root/.packages")
  }
  compiled_action(target_name) {
    tool = "$_dart_root/runtime/bin:dart"
    deps = extra_deps
    depfile = "$root_gen_dir/$name.dart.snapshot.d"

    main_file = rebase_path(main_dart)

    inputs = extra_inputs + [ main_file ]

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

    abs_depfile = rebase_path(depfile)
    abs_output = rebase_path(output, root_build_dir)

    args = [
      "--deterministic",
      "--packages=$dot_packages",
      "--snapshot=$abs_output",
      "--snapshot-depfile=$abs_depfile",
    ] + vm_args

    if (dart_snapshot_kind == "script") {
      args += [
        "--snapshot-kind=script",
        main_file,
      ]
      assert(training_args != "", "Ignoring unused argument")
    } else if (dart_snapshot_kind == "app-jit") {
      args += [
                "--snapshot-kind=app-jit",
                main_file,
              ] + training_args
    } else {
      assert(false, "Bad dart_snapshot_kind: $dart_snapshot_kind")
    }
  }
}
