# 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/flutter/kernel/libraries.json"

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

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

template("core_snapshot") {
  assert(defined(invoker.product),
         "core_snapshot requires 'product' to be defined")

  suffix = ""

  if (invoker.product) {
    suffix = "${suffix}_product"
  }

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

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

    vm_snapshot_data = "$target_gen_dir/vm_isolate_snapshot${suffix}.bin"
    vm_snapshot_instructions =
        "$target_gen_dir/vm_snapshot_instructions${suffix}.bin"
    isolate_snapshot_data = "$target_gen_dir/isolate_snapshot${suffix}.bin"
    isolate_snapshot_instructions =
        "$target_gen_dir/isolate_snapshot_instructions${suffix}.bin"
    snapshot_profile = "$target_gen_dir/snapshot_profile${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 = [
      "--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) ]
  }
}

core_snapshot("kernel_core_snapshot") {
  product = false
}

core_snapshot("kernel_core_snapshot_product") {
  product = true
}
