# 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("../../sdk_args.gni")
import("../aot_snapshot.gni")
import("../application_snapshot.gni")
import("../create_timestamp.gni")

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

if (dart_dynamic_modules) {
  _kernel_service_script = "pkg/dart2bytecode/bin/kernel_service.dart"
} else {
  _kernel_service_script = "pkg/vm/bin/kernel_service.dart"
}

group("kernel-service") {
  if (dart_snapshot_kind == "app-jit") {
    deps = [ ":copy_kernel-service_snapshot" ]
  } else {
    deps = [ ":kernel_service_dill" ]
  }
}

application_snapshot("kernel-service_snapshot") {
  main_dart = "../../$_kernel_service_script"
  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("../../$_kernel_service_script", "/"),
  ]
  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" ]
}

create_timestamp_file("frontend_server_files_stamp") {
  path = rebase_path("../../pkg/frontend_server/lib")
  output = "$target_gen_dir/frontend_server_files.stamp"
}

create_timestamp_file("ddc_files_stamp") {
  path = rebase_path("../../pkg/dev_compiler/lib")
  output = "$target_gen_dir/ddc_files.stamp"
}

application_snapshot("frontend_server") {
  main_dart = "../../pkg/frontend_server/bin/frontend_server_starter.dart"
  deps = [
    ":ddc_files_stamp",
    ":frontend_server_files_stamp",
    "../../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.dill",
    rebase_path(main_dart),
  ]
  output = "$root_out_dir/frontend_server.dart.snapshot"
}

aot_snapshot("frontend_server_aot") {
  main_dart = "../../pkg/frontend_server/bin/frontend_server_starter.dart"
  name = "frontend_server_aot"
  output = "$root_out_dir/frontend_server_aot.dart.snapshot"
}

aot_snapshot("frontend_server_aot_product") {
  main_dart = "../../pkg/frontend_server/bin/frontend_server_starter.dart"
  name = "frontend_server_aot_product"
  output = "$root_out_dir/frontend_server_aot_product.dart.snapshot"

  # dartaotruntime in the dart sdk has dart_product_config applied to it,
  # so it is built in product mode in both release and
  # product sdks, and is built in debug mode in debug
  # builds. The following line ensures that the dartaotruntime
  # and frontend_server aot snapshot in an SDK build are
  # always compatible with each other.
  force_product_mode = !dart_debug
}

template("kernel_service_dill") {
  if (precompile_tools) {
    action("kernel_service" + target_name + "_dill") {
      if (defined(invoker.pool)) {
        pool = invoker.pool
      }

      gen_kernel_tool = "//utils:gen_kernel.exe($host_toolchain)"
      kernel_service_script = "../../$_kernel_service_script"

      deps = [
        "../../runtime/vm:vm_platform",
        gen_kernel_tool,
      ]
      inputs = [
        kernel_service_script,
        "$root_out_dir/vm_platform.dill",
      ]
      output = "$root_gen_dir/kernel_service" + invoker.target_name + ".dill"
      outputs = [ output ]
      depfile = "$root_gen_dir/kernel_service" + invoker.target_name + "_dill.d"

      scheme = "org-dartlang-kernel-service"

      script = "$_dart_root/build/gn_run_binary.py"
      args = [
        "compiled_action",
        rebase_path(
            get_label_info(gen_kernel_tool, "root_out_dir") + "/gen_kernel.exe",
            root_build_dir),
      ]
      args += invoker.extra_args
      args += [
        "--depfile=" + rebase_path(depfile, root_build_dir),

        # Ensure the compiled kernel-service will use this SDK hash when
        # consuming/producing kernel.
        "-Dsdk_hash=$sdk_hash",
        "--packages=" + scheme + ":///.dart_tool/package_config.json",
        "--platform=" +
            rebase_path("$root_out_dir/vm_platform.dill", root_build_dir),
        "--filesystem-root=" + rebase_path("../../"),
        "--filesystem-scheme=" + scheme,
        "--no-aot",
        "--no-embed-sources",
        "--output=" + rebase_path(output, root_build_dir),
        scheme + ":///$_kernel_service_script",
      ]
    }
  } else {
    prebuilt_dart_action("kernel_service" + target_name + "_dill") {
      deps = [
        "../../runtime/vm:kernel_platform_files($host_toolchain)",
        "../../runtime/vm:vm_platform",
      ]
      kernel_service_script = "../../$_kernel_service_script"
      gen_kernel_script = "../../pkg/vm/bin/gen_kernel.dart"

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

      depfile = "$root_gen_dir/kernel_service" + invoker.target_name + "_dill.d"

      vm_args = [
        "--depfile=" + rebase_path(depfile, root_build_dir),
        "--depfile_output_filename=" + rebase_path(output, root_build_dir),

        # Ensure gen_kernel.dart will use this SDK hash when consuming/producing
        # kernel.
        "-Dsdk_hash=$sdk_hash",
      ]

      script = gen_kernel_script
      scheme = "org-dartlang-kernel-service"

      args = invoker.extra_args + [
               # Ensure the compiled kernel-service will use this SDK hash when
               # consuming/producing kernel.
               "-Dsdk_hash=$sdk_hash",

               "--packages=" + scheme + ":///.dart_tool/package_config.json",
               "--platform=" + rebase_path("$root_out_dir/vm_platform.dill",
                                           root_build_dir),
               "--filesystem-root=" + rebase_path("../../"),
               "--filesystem-scheme=" + scheme,
               "--no-aot",
               "--no-embed-sources",
               "--output=" + rebase_path(output, root_build_dir),
             ]
      args += [ scheme + ":///$_kernel_service_script" ]
    }
  }
}

kernel_service_dill("") {
  extra_args = []
}
