# Copyright 2016 The Fuchsia 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/dart/toolchain.gni")
import("//topaz/runtime/dart/dart_kernel.gni")

dart_kernel("shim") {
  platform_name = "dart_runner"
  platform_deps = [ "//topaz/runtime/dart_runner/kernel:kernel_platform_files" ]
  platform_path = "$root_out_dir/dart_runner_patched_sdk"

  disable_analysis = true

  main_dart = "shim.dart"
  args = [ "--aot" ]

  visibility = [ ":*" ]
}

template("create_aot_snapshot") {
  assert(defined(invoker.product), "The parameter 'product' must be defined")
  product_suffix = ""
  if (invoker.product) {
    product_suffix = "_product"
  }
  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_kernel"
    shim_kernel =
        get_label_info(shim_target, "target_gen_dir") + "/shim_kernel.dil"

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

    deps = gen_snapshot_deps + [ shim_target ]
    if (invoker.product) {
      script = gen_snapshot_product
    } else {
      script = gen_snapshot
    }

    args = [
      "--no_causal_async_stacks",
      "--deterministic",
      "--snapshot_kind=vm-aot-assembly",
      "--assembly=" + rebase_path(snapshot_assembly),
    ]
    if (!invoker.product) {
      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
}
