# 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/common/config.gni")
import("//flutter/shell/gpu/gpu.gni")
import("//flutter/testing/testing.gni")
import("//flutter/tools/fuchsia/dart.gni")
import("//flutter/tools/fuchsia/fuchsia_archive.gni")
import("//flutter/tools/fuchsia/fuchsia_libs.gni")
import("//flutter/vulkan/config.gni")
import("engine_flutter_runner.gni")

shell_gpu_configuration("fuchsia_gpu_configuration") {
  enable_software = false
  enable_gl = false
  enable_vulkan = true
  enable_metal = false
}

# Things that explicitly being excluded:
# 1. Kernel snapshot framework mode.
# 2. Profiler symbols.

flutter_runner("jit") {
  output_name = "flutter_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",
  ]
}

flutter_runner("jit_product") {
  output_name = "flutter_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",
  ]
}

flutter_runner("aot") {
  output_name = "flutter_aot_runner"
  product = false

  extra_defines = []
  if (flutter_runtime_mode == "profile") {
    extra_defines += [ "FLUTTER_PROFILE" ]
  }

  extra_deps = [
    "//third_party/dart/runtime:libdart_precompiled_runtime",
    "//third_party/dart/runtime/platform:libdart_platform_precompiled_runtime",
  ]
}

flutter_runner("aot_product") {
  output_name = "flutter_aot_product_runner"
  product = true

  extra_defines = [ "DART_PRODUCT" ]

  extra_deps = [
    "//third_party/dart/runtime:libdart_precompiled_runtime_product",
    "//third_party/dart/runtime/platform:libdart_platform_precompiled_runtime_product",
  ]
}

template("jit_runner") {
  product = defined(invoker.product) && invoker.product

  product_suffix = ""

  if (product) {
    product_suffix = "_product"
  }

  fuchsia_archive(target_name) {
    snapshot_label = "kernel:kernel_core_snapshot${product_suffix}"
    snapshot_gen_dir = get_label_info(snapshot_label, "target_gen_dir")

    deps = [
      ":jit${product_suffix}",
      snapshot_label,
    ]

    if (!product) {
      deps += [
        "//flutter/shell/platform/fuchsia/runtime/dart/profiler_symbols:flutter_jit_runner",
        observatory_target,
      ]
    }

    binary = "flutter_jit${product_suffix}_runner"

    meta_dir = "//flutter/shell/platform/fuchsia/flutter/meta"

    resources = [
      {
        path = rebase_path("//third_party/icu/common/icudtl.dat")
        dest = "icudtl.dat"
      },
    ]

    if (!product) {
      resources += [
        {
          path = rebase_path(observatory_archive_file)
          dest = "observatory.tar"
        },
        {
          path = rebase_path(
                  get_label_info(
                      "//flutter/shell/platform/fuchsia/runtime/dart/profiler_symbols:flutter_jit_runner",
                      "target_gen_dir") +
                  "/flutter_jit_runner.dartprofilersymbols")
          dest = "flutter_jit_runner.dartprofilersymbols"
        },
      ]
    }

    resources += [
      {
        path = rebase_path(
                "$snapshot_gen_dir/vm_isolate_snapshot${product_suffix}.bin")
        dest = "vm_snapshot_data.bin"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/vm_snapshot_instructions${product_suffix}.bin")
        dest = "vm_snapshot_instructions.bin"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/isolate_snapshot${product_suffix}.bin")
        dest = "isolate_core_snapshot_data.bin"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/isolate_snapshot_instructions${product_suffix}.bin")
        dest = "isolate_core_snapshot_instructions.bin"
      },
    ]

    _vulkan_icds = []
    _libs = common_libs
    if (enable_vulkan_validation_layers) {
      _libs += vulkan_validation_libs
      _vulkan_icds += vulkan_icds
    }

    resources += _vulkan_icds

    libraries = _libs

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

template("aot_runner") {
  product = defined(invoker.product) && invoker.product
  product_suffix = ""
  if (product) {
    product_suffix = "_product"
  }

  fuchsia_archive(target_name) {
    deps = [
      ":aot${product_suffix}",
    ]

    if (!product) {
      deps += [
        "//flutter/shell/platform/fuchsia/runtime/dart/profiler_symbols:flutter_aot_runner",
        observatory_target,
      ]
    }

    meta_dir = "//flutter/shell/platform/fuchsia/flutter/meta"

    binary = "flutter_aot${product_suffix}_runner"

    resources = [
      {
        path = rebase_path("//third_party/icu/common/icudtl.dat")
        dest = "icudtl.dat"
      },
    ]

    if (!product) {
      resources += [
        {
          path = rebase_path(observatory_archive_file)
          dest = "observatory.tar"
        },
        {
          path = rebase_path(
                  get_label_info(
                      "//flutter/shell/platform/fuchsia/runtime/dart/profiler_symbols:flutter_aot_runner",
                      "target_gen_dir") +
                  "/flutter_aot_runner.dartprofilersymbols")
          dest = "flutter_aot_runner.dartprofilersymbols"
        },
      ]
    }

    _vulkan_icds = []
    _libs = common_libs
    if (enable_vulkan_validation_layers) {
      _libs += vulkan_validation_libs
      _vulkan_icds += vulkan_icds
    }

    resources += _vulkan_icds

    libraries = _libs

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

aot_runner("flutter_aot_runner") {
  product = false
}

aot_runner("flutter_aot_product_runner") {
  product = true
}

jit_runner("flutter_jit_runner") {
  product = false
}

jit_runner("flutter_jit_product_runner") {
  product = true
}

test_fixtures("flutter_runner_fixtures") {
  fixtures = []
}

executable("flutter_runner_unittests") {
  testonly = true

  output_name = "flutter_runner_tests"

  sources = [
    "accessibility_bridge.cc",
    "accessibility_bridge.h",
    "accessibility_bridge_unittest.cc",
    "flutter_runner_fakes.h",
    "flutter_runner_product_configuration.cc",
    "flutter_runner_product_configuration.h",
    "fuchsia_intl.cc",
    "fuchsia_intl.h",
    "fuchsia_intl_unittest.cc",
    "logging.h",
    "loop.cc",
    "loop.h",
    "platform_view.cc",
    "platform_view.h",
    "platform_view_unittest.cc",
    "runner.cc",
    "runner.h",
    "runner_unittest.cc",
    "surface.cc",
    "surface.h",
    "task_observers.cc",
    "task_observers.h",
    "task_runner_adapter.cc",
    "task_runner_adapter.h",
    "tests/flutter_runner_product_configuration_unittests.cc",
    "tests/vsync_recorder_unittests.cc",
    "thread.cc",
    "thread.h",
    "vsync_recorder.cc",
    "vsync_recorder.h",
    "vsync_waiter.cc",
    "vsync_waiter.h",
    "vsync_waiter_unittests.cc",
  ]

  # This is needed for //third_party/googletest for linking zircon symbols.
  libs = [ "//fuchsia/sdk/$host_os/arch/$target_cpu/sysroot/lib/libzircon.so" ]

  deps = [
    ":aot",
    ":flutter_runner_fixtures",
    "//build/fuchsia/fidl:fuchsia.accessibility.semantics",
    "//build/fuchsia/pkg:async-default",
    "//build/fuchsia/pkg:async-loop-cpp",
    "//build/fuchsia/pkg:async-loop-default",
    "//build/fuchsia/pkg:scenic_cpp",
    "//build/fuchsia/pkg:sys_cpp_testing",
    "//flutter/lib/ui",
    "//flutter/runtime",
    "//flutter/shell/common",
    "//flutter/shell/platform/fuchsia/runtime/dart/utils",
    "//flutter/testing",
    "//third_party/dart/runtime:libdart_jit",
    "//third_party/dart/runtime/platform:libdart_platform_jit",
  ]
}

executable("flutter_runner_tzdata_unittests") {
  testonly = true

  output_name = "flutter_runner_tzdata_tests"

  sources = [
    "runner.cc",
    "runner.h",
    "runner_tzdata_unittest.cc",
  ]

  # This is needed for //third_party/googletest for linking zircon symbols.
  libs = [ "//fuchsia/sdk/$host_os/arch/$target_cpu/sysroot/lib/libzircon.so" ]

  deps = [
    ":aot",
    ":flutter_runner_fixtures",
    "//build/fuchsia/fidl:fuchsia.accessibility.semantics",
    "//build/fuchsia/pkg:async-loop-cpp",
    "//build/fuchsia/pkg:async-loop-default",
    "//build/fuchsia/pkg:scenic_cpp",
    "//build/fuchsia/pkg:sys_cpp_testing",
    "//flutter/lib/ui",
    "//flutter/runtime",
    "//flutter/shell/common",
    "//flutter/shell/platform/fuchsia/runtime/dart/utils",
    "//flutter/testing",
    "//third_party/dart/runtime:libdart_jit",
    "//third_party/dart/runtime/platform:libdart_platform_jit",
    "//third_party/icu",
    "//third_party/skia",
  ]
}

fuchsia_archive("flutter_runner_tests") {
  testonly = true

  deps = [
    ":flutter_runner_unittests",
  ]

  binary = "$target_name"

  resources = [
    {
      path = rebase_path("//third_party/icu/common/icudtl.dat")
      dest = "icudtl.dat"
    },
    {
      path = rebase_path(
              "//flutter/shell/platform/fuchsia/flutter/tests/tzdata/2019a/44/le/metaZones.res")
      dest = "tzdata/metaZones.res"
    },
    {
      path = rebase_path(
              "//flutter/shell/platform/fuchsia/flutter/tests/tzdata/2019a/44/le/timezoneTypes.res")
      dest = "tzdata/timezoneTypes.res"
    },
    {
      path = rebase_path(
              "//flutter/shell/platform/fuchsia/flutter/tests/tzdata/2019a/44/le/zoneinfo64.res")
      dest = "tzdata/zoneinfo64.res"
    },
  ]

  meta_dir = "//flutter/shell/platform/fuchsia/flutter/meta"

  libraries = common_libs

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

fuchsia_archive("flutter_runner_tzdata_tests") {
  testonly = true

  deps = [
    ":flutter_runner_tzdata_unittests",
  ]

  binary = "$target_name"

  resources = [
    {
      path = rebase_path("//third_party/icu/common/icudtl.dat")
      dest = "icudtl.dat"
    },
  ]

  meta_dir = "//flutter/shell/platform/fuchsia/flutter/meta"

  libraries = common_libs

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

executable("flutter_runner_scenic_unittests") {
  testonly = true

  output_name = "flutter_runner_scenic_tests"

  sources = [
    "component.cc",
    "component.h",
    "compositor_context.cc",
    "compositor_context.h",
    "engine.cc",
    "engine.h",
    "fuchsia_intl.cc",
    "fuchsia_intl.h",
    "isolate_configurator.cc",
    "isolate_configurator.h",
    "logging.h",
    "loop.cc",
    "loop.h",
    "platform_view.cc",
    "platform_view.h",
    "runner.cc",
    "runner.h",
    "session_connection.cc",
    "session_connection.h",
    "surface.cc",
    "surface.h",
    "task_observers.cc",
    "task_observers.h",
    "task_runner_adapter.cc",
    "task_runner_adapter.h",
    "tests/session_connection_unittests.cc",
    "thread.cc",
    "thread.h",
    "unique_fdio_ns.h",
    "vsync_recorder.cc",
    "vsync_recorder.h",
    "vsync_waiter.cc",
    "vsync_waiter.h",
    "vsync_waiter_unittests.cc",
    "vulkan_surface.cc",
    "vulkan_surface.h",
    "vulkan_surface_pool.cc",
    "vulkan_surface_pool.h",
    "vulkan_surface_producer.cc",
    "vulkan_surface_producer.h",
  ]

  # This is needed for //third_party/googletest for linking zircon symbols.
  libs = [ "//fuchsia/sdk/$host_os/arch/$target_cpu/sysroot/lib/libzircon.so" ]

  deps = [
    ":flutter_runner_fixtures",
    ":jit",
    "$fuchsia_sdk_root/fidl:fuchsia.ui.policy",
    "$fuchsia_sdk_root/pkg:trace-provider-so",
    "//build/fuchsia/fidl:fuchsia.accessibility.semantics",
    "//build/fuchsia/pkg:async-default",
    "//build/fuchsia/pkg:async-loop-cpp",
    "//build/fuchsia/pkg:async-loop-default",
    "//build/fuchsia/pkg:scenic_cpp",
    "//build/fuchsia/pkg:sys_cpp_testing",
    "//flutter/common:common",
    "//flutter/flow:flow",
    "//flutter/lib/ui",
    "//flutter/runtime",
    "//flutter/shell/common",
    "//flutter/shell/platform/fuchsia/dart-pkg/fuchsia:sdk_ext",
    "//flutter/shell/platform/fuchsia/dart-pkg/zircon:zircon",
    "//flutter/shell/platform/fuchsia/runtime/dart/utils",
    "//flutter/testing",
    "//flutter/vulkan:vulkan",
    "//third_party/dart/runtime:libdart_jit",
    "//third_party/dart/runtime/platform:libdart_platform_jit",
    "//third_party/icu",
    "//third_party/skia",
  ]

  public_deps = [
    "//third_party/googletest:gtest",
  ]
}

fuchsia_archive("flutter_runner_scenic_tests") {
  testonly = true

  deps = [
    ":flutter_runner_scenic_unittests",
  ]

  binary = "$target_name"

  resources = [
    {
      path = rebase_path("//third_party/icu/common/icudtl.dat")
      dest = "icudtl.dat"
    },
  ]

  meta_dir = "//flutter/shell/platform/fuchsia/flutter/meta"

  libraries = common_libs

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