# 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("//third_party/dart/build/dart/dart_action.gni")
import("$flutter_root/common/fuchsia_config.gni")
import("$flutter_root/tools/fuchsia/dart_kernel.gni")

dart_kernel("shim_kernel") {
  main_dart = "shim.dart"
  kernel_platform_files = "../kernel:kernel_platform_files"
  product = false
  aot = true
}

dart_kernel("shim_product_kernel") {
  main_dart = "shim.dart"
  kernel_platform_files = "../kernel:kernel_platform_files"
  product = true
  aot = true
}

template("create_aot_snapshot") {
  assert(defined(invoker.product), "The parameter 'product' must be defined")
  product_suffix = ""
  if (invoker.product) {
    product_suffix = "_product"
  }
  compiled_action("${target_name}_assembly") {
    snapshot_assembly = "$target_gen_dir/aot${product_suffix}_vm_snapshot.S"

    # gen_snapshot only needs this to go through the motions of setting up an isolate.
    shim_target = ":shim${product_suffix}_kernel($host_toolchain)"
    shim_kernel = get_label_info(shim_target, "target_gen_dir") +
                  "/shim${product_suffix}_kernel.dill"

    inputs = [
      shim_kernel,
    ]
    outputs = [
      snapshot_assembly,
    ]

    deps = [
      shim_target,
    ]
    if (invoker.product) {
      tool = gen_snapshot_product
    } else {
      tool = gen_snapshot
    }

    args = [
      "--no_causal_async_stacks",
      "--deterministic",
      "--snapshot_kind=vm-aot-assembly",
      "--assembly=" + rebase_path(snapshot_assembly),
    ]

    # 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 &&
        (!(flutter_runtime_mode == "profile") || is_debug)) {
      args += [ "--enable_asserts" ]
    }
    args += [ rebase_path(shim_kernel) ]
  }

  source_set(target_name) {
    deps = [
      ":${target_name}_assembly",
    ]

    sources = [
      "$target_gen_dir/aot${product_suffix}_vm_snapshot.S",
      "snapshot.h",
    ]
  }
}

create_aot_snapshot("dart_aot_snapshot_cc") {
  product = false
}

create_aot_snapshot("dart_aot_product_snapshot_cc") {
  product = true
}
