# Copyright (c) 2017, 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/dart/dart_action.gni")
import("../../build/dart/dart_host_sdk_toolchain.gni")
import("../../runtime/runtime_args.gni")
import("../application_snapshot.gni")

group("kernel-service") {
  if (create_kernel_service_snapshot) {
    deps = [
      # TODO(rmacnak): Link this into 'dart'.
      ":copy_kernel-service_snapshot",
    ]
  } else {
    deps = [
      ":kernel_service_dill",
    ]
  }
}

# TODO: Switch this to use kernel based app-jit snapshot
# when we are ready to switch to the kernel based core snapshots.
kernel_application_snapshot("kernel-service_snapshot") {
  main_dart = "$root_gen_dir/kernel_service.dill"
  deps = [
    ":kernel_service_dill",
  ]
  training_args = [
    "--train",
    "file:///" + rebase_path("../../pkg/compiler/lib/src/dart2js.dart"),
  ]
  output = "$root_gen_dir/kernel-service.dart.snapshot"
}

copy("copy_kernel-service_snapshot") {
  deps = [
    ":kernel-service_snapshot",
  ]
  sources = [
    "$root_gen_dir/kernel-service.dart.snapshot",
  ]
  outputs = [
    "$root_out_dir/kernel-service.dart.snapshot",
  ]
}

application_snapshot("frontend_server") {
  main_dart = "../../pkg/vm/bin/frontend_server_starter.dart"
  deps = [
    "../../runtime/vm:kernel_platform_files($dart_host_toolchain)",
  ]
  sdk_root = rebase_path("$root_out_dir")
  training_args = [
    "--train",
    "--sdk-root=$sdk_root/",
    "--platform=$sdk_root/vm_platform_strong.dill",
  ]
  output = "$root_out_dir/frontend_server.dart.snapshot"
}

template("kernel_service_dill") {
  prebuilt_dart_action("kernel_service" + target_name + "_dill") {
    deps = [
      "../../runtime/vm:kernel_platform_files($dart_host_toolchain)",
      "../../runtime/vm:vm_platform",
    ]
    kernel_service_script = "../../pkg/vm/bin/kernel_service.dart"
    gen_kernel_script = "../../pkg/vm/bin/gen_kernel.dart"

    inputs = [
      gen_kernel_script,
      kernel_service_script,
      "$root_out_dir/vm_platform_strong.dill",
    ]
    output = "$root_gen_dir/kernel_service" + invoker.target_name + ".dill"
    outputs = [
      output,
    ]

    depfile = "$root_gen_dir/kernel_service" + invoker.target_name + "_dill.d"
    abs_depfile = rebase_path(depfile)
    rebased_output = rebase_path(output, root_build_dir)
    vm_args = [
      "--depfile=$abs_depfile",
      "--depfile_output_filename=$rebased_output",
    ]

    script = gen_kernel_script

    args =
        invoker.extra_args + [
          "--packages=" + rebase_path("../../.packages"),
          "--platform=" + rebase_path("$root_out_dir/vm_platform_strong.dill"),
          "--no-aot",
          "--no-embed-sources",
          "--output=" + rebase_path(output),
          rebase_path(kernel_service_script),
        ]
  }
}

kernel_service_dill("") {
  extra_args = []
}

kernel_service_dill("_bytecode") {
  extra_args = [ "--gen-bytecode" ]
}
