# Copyright (c) 2018, 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")
import("../build/dart_host_sdk_toolchain.gni")

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

# Template to generate entry points JSON file using dart_bootstrap tool.
# List of entry points is generated as a by-product while doing precompilation.
#
# This template expects the following arguments:
#  - input: Name of the input dart script for precompilation.
#  - output: Name of the output entry points JSON file.
#  - extra_args: Extra arguments to pass to dart_bootstrap (optional).
#
template("generate_entry_points_json_with_dart_bootstrap") {
  assert(defined(invoker.input), "Must define input dart script")
  assert(defined(invoker.output), "Must define output json file")
  extra_args = []
  if (defined(invoker.extra_args)) {
    extra_args += invoker.extra_args
  }
  compiled_action(target_name) {
    # Printing precompiler entry points is folded into precompilation, so dart_bootstrap is invoked
    # with correct arguments to generate app-aot snapshot.

    input = invoker.input
    output = invoker.output

    tool = "$_dart_root/runtime/bin:dart_bootstrap"
    inputs = [
      input,
    ]
    outputs = [
      output,
    ]
    args = [
      "--print-precompiler-entry-points=" + rebase_path(output),
      "--snapshot=" + rebase_path("$target_gen_dir/dummy.snapshot"),
      "--snapshot-kind=app-aot",
      "--use-blobs",
      "--snapshot-kind=app-aot",
    ] + extra_args + [
      rebase_path(input),
    ]
  }
}

# Template to generate entry points JSON file using gen_snapshot tool.
# List of entry points is generated as a by-product while doing precompilation.
#
# This template expects the following arguments:
#  - input: Name of the input dart script for precompilation.
#  - output: Name of the output entry points JSON file.
#  - extra_args: Extra arguments to pass to dart_bootstrap (optional).
#  - extra_inputs: Extra input dependencies (optional).
#
template("generate_entry_points_json_with_gen_snapshot") {
  assert(defined(invoker.input), "Must define input dart script")
  assert(defined(invoker.output), "Must define output json file")
  extra_args = []
  if (defined(invoker.extra_args)) {
    extra_args += invoker.extra_args
  }
  extra_inputs = []
  if (defined(invoker.extra_inputs)) {
    extra_inputs += invoker.extra_inputs
  }
  compiled_action(target_name) {
    # Printing precompiler entry points is folded into precompilation, so gen_snapshot is invoked
    # with correct arguments to generate app-aot snapshot.

    input = invoker.input
    output = invoker.output

    tool = "$_dart_root/runtime/bin:gen_snapshot"
    inputs = [
      input,
    ] + extra_inputs
    outputs = [
      output,
    ]
    args = [
      "--print-precompiler-entry-points=" + rebase_path(output),
      "--snapshot-kind=app-aot-blobs",
      "--vm_snapshot_data=" + rebase_path("$target_gen_dir/dummy.vm_data.snapshot"),
      "--vm_snapshot_instructions=" + rebase_path("$target_gen_dir/dummy.vm_instr.snapshot"),
      "--isolate_snapshot_data=" + rebase_path("$target_gen_dir/dummy.isolate_data.snapshot"),
      "--isolate_snapshot_instructions=" + rebase_path("$target_gen_dir/dummy.isolate_instr.snapshot"),
    ] + extra_args + [
      rebase_path(input),
    ]
  }
}

# Template to copy checked-in extra entry points JSON file.
#
# This template expects the following argument:
#  - output: Target destination for the extra entry points JSON file.
#
template("copy_entry_points_extra_json") {
  assert(defined(invoker.output), "Must define output json file")
  copy(target_name) {
    sources = [ "$_dart_root/pkg/vm/lib/transformations/type_flow/entry_points_extra.json" ]
    outputs = [ invoker.output ]
  }
}
