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

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
  }
  compiled_action(target_name) {
    tool = "$_dart_root/runtime/bin:dart"
    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" ]

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