# 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'")
  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 + [ "$_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,
    ]

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