# 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("../../runtime/runtime_args.gni")
import("../application_snapshot.gni")

group("kernel-service") {
  if (create_kernel_service_snapshot) {
    deps = [
      ":copy_kernel-service_snapshot",
    ]
  } else {
    deps = [
      ":kernel_service_dill",
    ]
  }
}

kernel_application_snapshot("kernel-service_snapshot") {
  main_dart = "../../pkg/vm/bin/kernel_service.dart"
  training_args = [
    "--train",

    # Force triple-slashes both on Windows and otherwise.
    # Becomes e.g. file:///full/path/to/file and "file:///C:/full/path/to/file.
    # Without the ', "/"' part, on Linux it would get four slashes.
    "file:///" + rebase_path("../../pkg/compiler/lib/src/dart2js.dart", "/"),
  ]
  if (dart_platform_bytecode) {
    training_args += [ "--bytecode" ]
  }
  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($host_toolchain)",
  ]
  sdk_root = rebase_path("$root_out_dir")
  training_args = [
    "--train",
    "--sdk-root=$sdk_root/",
    "--platform=$sdk_root/vm_platform_strong.dill",
    rebase_path(main_dart),
  ]
  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($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
    scheme = "org-dartlang-kernel-service"

    args =
        invoker.extra_args + [
          "--packages=" + scheme + ":///.packages",
          "--platform=" + rebase_path("$root_out_dir/vm_platform_strong.dill"),
          "--filesystem-root=" + rebase_path("../../"),
          "--filesystem-scheme=" + scheme,
          "--no-aot",
          "--no-embed-sources",
          "--output=" + rebase_path(output),
          scheme + ":///pkg/vm/bin/kernel_service.dart",
        ]

    if (dart_platform_bytecode) {
      args += [
        "--gen-bytecode",
        "--drop-ast",
      ]
    }
  }
}

kernel_service_dill("") {
  extra_args = []
}

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