# Copyright 2013 The Flutter Authors. 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/fuchsia/sdk.gni")
import("//flutter/common/config.gni")
import("//flutter/tools/fuchsia/dart.gni")
import("//third_party/dart/utils/compile_platform.gni")

compile_platform("kernel_platform_files") {
  single_root_scheme = "org-dartlang-sdk"
  single_root_base = rebase_path("../../../../../../")

  libraries_specification_uri = "org-dartlang-sdk:///flutter/shell/platform/fuchsia/dart_runner/kernel/libraries.json"

  outputs = [
    "$root_out_dir/dart_runner_patched_sdk/platform_strong.dill",
    "$root_out_dir/dart_runner_patched_sdk/vm_outline_strong.dill",
  ]

  args = [
    "--nnbd-agnostic",
    "--target=dart_runner",
    "dart:core",
  ]
}

template("create_kernel_core_snapshot") {
  assert(defined(invoker.product), "The parameter 'product' must be defined")
  product_suffix = ""
  if (invoker.product) {
    product_suffix = "_product"
  }

  compiled_action(target_name) {
    deps = [ ":kernel_platform_files" ]

    platform_dill = "$root_out_dir/dart_runner_patched_sdk/platform_strong.dill"
    inputs = [ platform_dill ]

    vm_snapshot_data = "$target_gen_dir/vm_data${product_suffix}.bin"
    vm_snapshot_instructions =
        "$target_gen_dir/vm_instructions${product_suffix}.bin"
    isolate_snapshot_data = "$target_gen_dir/isolate_data${product_suffix}.bin"
    isolate_snapshot_instructions =
        "$target_gen_dir/isolate_instructions${product_suffix}.bin"
    snapshot_profile = "$target_gen_dir/snapshot_profile${product_suffix}.json"
    outputs = [
      vm_snapshot_data,
      vm_snapshot_instructions,
      isolate_snapshot_data,
      isolate_snapshot_instructions,
      snapshot_profile,
    ]

    gen_snapshot_to_use = gen_snapshot
    if (invoker.product) {
      gen_snapshot_to_use = gen_snapshot_product
    }

    tool = gen_snapshot_to_use

    args = [
      "--lazy_async_stacks",
      "--enable_mirrors=false",
      "--deterministic",
      "--snapshot_kind=core-jit",
      "--vm_snapshot_data=" + rebase_path(vm_snapshot_data, root_build_dir),
      "--vm_snapshot_instructions=" +
          rebase_path(vm_snapshot_instructions, root_build_dir),
      "--isolate_snapshot_data=" +
          rebase_path(isolate_snapshot_data, root_build_dir),
      "--isolate_snapshot_instructions=" +
          rebase_path(isolate_snapshot_instructions, root_build_dir),
      "--write_v8_snapshot_profile_to=" +
          rebase_path(snapshot_profile, root_build_dir),
    ]

    # No asserts in debug or release product.
    # No asserts in release with flutter_profile=true (non-product)
    # Yes asserts in non-product debug.
    if (!invoker.product &&
        (is_debug || !(flutter_runtime_mode == "profile"))) {
      args += [ "--enable_asserts" ]
    }
    args += [ rebase_path(platform_dill) ]
  }
}

create_kernel_core_snapshot("kernel_core_snapshot") {
  product = false
}

create_kernel_core_snapshot("kernel_core_snapshot_product") {
  product = true
}
