# 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.

assert(is_fuchsia)

import("//build/fuchsia/sdk.gni")
import("$flutter_root/common/fuchsia_config.gni")
import("$flutter_root/tools/fuchsia/common_libs.gni")
import("$flutter_root/tools/fuchsia/dart.gni")
import("$flutter_root/tools/fuchsia/package_dir.gni")

template("runner") {
  assert(defined(invoker.product), "The parameter 'product' must be defined")
  assert(defined(invoker.output_name),
         "The parameter 'output_name' must be defined")

  invoker_output_name = invoker.output_name
  extra_defines = invoker.extra_defines
  extra_deps = invoker.extra_deps

  executable(target_name) {
    output_name = invoker_output_name

    sources = [
      "builtin_libraries.cc",
      "builtin_libraries.h",
      "dart_component_controller.cc",
      "dart_component_controller.h",
      "dart_runner.cc",
      "dart_runner.h",
      "logging.h",
      "main.cc",
      "mapped_resource.cc",
      "mapped_resource.h",
      "service_isolate.cc",
      "service_isolate.h",
    ]

    defines = extra_defines

    dart_deps = []
    if (!invoker.product) {
      dart_deps += [ "//third_party/dart/runtime/bin:dart_io_api" ]
    } else {
      dart_deps += [ "//third_party/dart/runtime/bin:dart_io_api_product" ]
    }

    deps = [
             "$flutter_root/common",
             "$flutter_root/fml",
             "$flutter_root/runtime:libdart",
             "$flutter_root/shell/platform/fuchsia/dart-pkg/fuchsia",
             "$flutter_root/shell/platform/fuchsia/dart-pkg/zircon",
             "$flutter_root/shell/platform/fuchsia/runtime/dart/utils",
             "$fuchsia_sdk_root/pkg:async-cpp",
             "$fuchsia_sdk_root/pkg:async-loop",
             "$fuchsia_sdk_root/pkg:async-loop-cpp",
             "$fuchsia_sdk_root/pkg:fidl_cpp",
             "$fuchsia_sdk_root/pkg:syslog",
             "$fuchsia_sdk_root/pkg:trace",
             "$fuchsia_sdk_root/pkg:trace-provider-so",
             "$fuchsia_sdk_root/pkg/lib/sys/cpp",
             "$fuchsia_sdk_root/pkg/lib/vfs/cpp",
             "//third_party/tonic",
           ] + dart_deps + extra_deps
  }
}

runner("dart_jit_runner_bin") {
  output_name = "dart_jit_runner"
  product = false
  extra_defines = []
  if (flutter_runtime_mode == "profile") {
    extra_defines += [ "FLUTTER_PROFILE" ]
  }
  extra_deps = [
    "//third_party/dart/runtime:libdart_jit",
    "//third_party/dart/runtime/platform:libdart_platform_jit",
  ]
}

runner("dart_jit_product_runner_bin") {
  output_name = "dart_jit_product_runner"
  product = true
  extra_defines = [ "DART_PRODUCT" ]
  extra_deps = [
    "//third_party/dart/runtime:libdart_jit_product",
    "//third_party/dart/runtime/platform:libdart_platform_jit_product",
  ]
}

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

  package_dir(target_name) {
    deps = [
      ":dart_jit${product_suffix}_runner_bin",
      "kernel:kernel_core_snapshot${product_suffix}",
    ]

    if (!invoker.product) {
      deps += [ observatory_target ]
    }

    binary = "dart_jit${product_suffix}_runner"

    meta_dir = "$flutter_root/shell/platform/fuchsia/dart_runner/meta"

    libraries = common_libs

    resources = [
      {
        path =
            rebase_path("$target_gen_dir/kernel/vm_data${product_suffix}.bin")
        dest = "vm_snapshot_data.bin"
      },
      {
        path = rebase_path(
                "$target_gen_dir/kernel/vm_instructions${product_suffix}.bin")
        dest = "vm_snapshot_instructions.bin"
      },
      {
        path = rebase_path(
                "$target_gen_dir/kernel/isolate_data${product_suffix}.bin")
        dest = "isolate_core_snapshot_data.bin"
      },
      {
        path = rebase_path(
                "$target_gen_dir/kernel/isolate_instructions${product_suffix}.bin")
        dest = "isolate_core_snapshot_instructions.bin"
      },
    ]

    if (!invoker.product) {
      resources += [
        {
          path = rebase_path(observatory_archive_file)
          dest = "observatory.tar"
        },
      ]
    }

    meta = [
      {
        path = rebase_path("meta/dart_jit${product_suffix}_runner.cmx")
        dest = "dart_jit${product_suffix}_runner.cmx"
      },
    ]
  }
}

jit_runner_package("dart_jit_runner") {
  product = false
}

jit_runner_package("dart_jit_product_runner") {
  product = true
}