# Copyright 2016 The Chromium 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/test/test_package.gni")
import("//build/testing/environments.gni")
import("//build/vulkan/config.gni")
import("//garnet/bin/ui/scenic/config.gni")
import("$flutter_root/shell/gpu/gpu.gni")

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

# Dependencies for flutter tooling
#
# While not required to run a flutter mod, these allow interacting
# with flutter via the fx tool and need to be built.
flutter_tool_deps = [ "//third_party/dart-pkg/git/flutter/packages/flutter_tools:fuchsia_attach($host_toolchain)" ]

# Builds a flutter_runner
#
# Parameters:
#
#  output_name (required):
#    The name of the resulting binary.
#
#  extra_deps (required):
#    Any additional dependencies.
#
#  product (required):
#    Whether to link against a Product mode Dart VM.
#
#  extra_defines (optional):
#    Any additional preprocessor defines.
template("flutter_runner") {
  assert(defined(invoker.output_name), "flutter_runner must define output_name")
  assert(defined(invoker.extra_deps), "flutter_runner must define extra_deps")
  assert(defined(invoker.product), "flutter_runner must define product")

  invoker_output_name = invoker.output_name
  extra_deps = invoker.extra_deps

  extra_defines = []
  if (defined(invoker.extra_defines)) {
    extra_defines += invoker.extra_defines
  }

  product_suffix = ""
  if (invoker.product) {
    product_suffix = "_product"
  }

  executable(target_name) {
    output_name = invoker_output_name

    defines = extra_defines

    libs = []

    sources = [
      "component.cc",
      "component.h",
      "compositor_context.cc",
      "compositor_context.h",
      "context_writer_bridge.cc",
      "context_writer_bridge.h",
      "engine.cc",
      "engine.h",
      "fuchsia_font_manager.cc",
      "fuchsia_font_manager.h",
      "isolate_configurator.cc",
      "isolate_configurator.h",
      "logging.h",
      "loop.cc",
      "loop.h",
      "main.cc",
      "platform_view.cc",
      "platform_view.h",
      "runner.cc",
      "runner.h",
      "semantics_bridge.cc",
      "semantics_bridge.h",
      "service_provider_dir.cc",
      "service_provider_dir.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",
      "unique_fdio_ns.h",
      "vsync_recorder.cc",
      "vsync_recorder.h",
      "vsync_waiter.cc",
      "vsync_waiter.h",
      "vulkan_surface.cc",
      "vulkan_surface.h",
      "vulkan_surface_pool.cc",
      "vulkan_surface_pool.h",
      "vulkan_surface_producer.cc",
      "vulkan_surface_producer.h",
    ]

    # The use of these dependencies is temporary and will be moved behind the
    # embedder API.
    flutter_deps = [
      ":fuchsia_gpu_configuration",
      "$flutter_root/assets",
      "$flutter_root/common",
      "$flutter_root/flow",
      "$flutter_root/lib/ui",
      "$flutter_root/runtime",
      "$flutter_root/third_party/txt",
      "$flutter_root/vulkan",
      "$flutter_root/fml",
      "$flutter_root/shell/common",
    ]

    public_deps = [
      "//zircon/public/lib/fit",
    ]

    deps = [
             "//sdk/fidl/fuchsia.accessibility",
             "//sdk/fidl/fuchsia.fonts",
             "//sdk/fidl/fuchsia.ui.app",
             "//sdk/fidl/fuchsia.ui.input",
             "//sdk/fidl/fuchsia.ui.viewsv1",
             "//garnet/public/lib/vulkan",
             "//sdk/fidl/fuchsia.modular",
             "//sdk/lib/sys/cpp",
             "//sdk/lib/vfs/cpp",
             "//sdk/lib/ui/scenic/cpp",
             "//third_party/dart/runtime/bin:libdart_builtin${product_suffix}",
             "//third_party/icu",
             "//third_party/rapidjson",
             "//third_party/skia",
             "//third_party/tonic",
             "//third_party/zlib:minizip",
             "//topaz/public/dart-pkg/fuchsia",
             "//topaz/public/lib/ui/flutter/sdk_ext",
             "//topaz/runtime/dart/utils",
             "//topaz/runtime/dart/utils:inlines",
             "//topaz/runtime/dart/utils:files",
             "//topaz/runtime/dart/utils:vmo",
             "//zircon/public/fidl/fuchsia-io",
             "//zircon/public/lib/async-cpp",
             "//zircon/public/lib/async-loop-cpp",
             "//zircon/public/lib/syslog",
             "//zircon/public/lib/trace",
             "//zircon/public/lib/trace-provider",
             "//zircon/public/lib/zx",
           ] + extra_deps + flutter_deps

    if (scenic_use_views2) {
      defines += [ "SCENIC_VIEWS2" ]
    }

    # The flags below are needed so that Dart's CPU profiler can walk the
    # C++ stack.
    cflags = [
      "-mno-omit-leaf-frame-pointer",
      "-fno-omit-frame-pointer",
    ]

    # This flag is needed so that the call to dladdr() in Dart's native symbol
    # resolver can report good symbol information for the CPU profiler.
    ldflags = [ "-rdynamic" ]
  }
}

flutter_runner("aot") {
  output_name = "flutter_aot_runner"
  product = false
  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",
  ]
}

flutter_runner("jit") {
  output_name = "flutter_jit_runner"
  product = false
  extra_deps = [
                 "//third_party/dart/runtime:libdart_jit",
                 "//third_party/dart/runtime/platform:libdart_platform_jit",
               ] + flutter_tool_deps
}

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",
  ]
}

import("//build/package.gni")

observatory_target =
    "//third_party/dart/runtime/observatory:observatory_archive"
observatory_archive_dir = get_label_info(observatory_target, "target_gen_dir")
observatory_archive_name = get_label_info(observatory_target, "name")
observatory_archive_file =
    "${observatory_archive_dir}/${observatory_archive_name}.tar"

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

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

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

    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"
        },
      ]
    }

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

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

  package(target_name) {
    snapshot_label = "//topaz/runtime/flutter_runner/kernel:kernel_core_snapshot${product_suffix}"
    snapshot_framework_label = "${snapshot_label}_framework"
    snapshot_gen_dir = get_label_info(snapshot_label, "target_gen_dir")

    deps = [
      ":jit${product_suffix}",
      "//topaz/runtime/flutter_runner/kernel:framework_shim_kernel",
      snapshot_framework_label,
      snapshot_label,
    ]

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

    binary = "flutter_jit${product_suffix}_runner"

    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"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/vm_isolate_snapshot${product_suffix}_framework.bin")
        dest = "framework_vm_snapshot_data.bin"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/vm_snapshot_instructions${product_suffix}_framework.bin")
        dest = "framework_vm_snapshot_instructions.bin"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/isolate_snapshot${product_suffix}_framework.bin")
        dest = "framework_isolate_core_snapshot_data.bin"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/isolate_snapshot_instructions${product_suffix}_framework.bin")
        dest = "framework_isolate_core_snapshot_instructions.bin"
      },
      {
        path = rebase_path(
                "$snapshot_gen_dir/framework_shim.dilpmanifest.frameworkversion")
        dest = "runner.frameworkversion"
      },
      {
        path = rebase_path("//third_party/icu/common/icudtl.dat")
        dest = "icudtl.dat"
      },
    ]

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

    meta = [
      {
        path = rebase_path("meta/flutter_jit${product_suffix}_runner.cmx")
        dest = "flutter_jit${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
}

executable("flutter_runner_unittests") {
  testonly = true

  output_name = "flutter_runner_tests"

  sources = [
    "fuchsia_font_manager.cc",
    "fuchsia_font_manager.h",
    "fuchsia_font_manager_unittest.cc",
    "logging.h",
  ]

  deps = [
    "//garnet/public/lib/gtest",
    "//sdk/fidl/fuchsia.fonts",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp",
    "//third_party/googletest:gtest_main",
    "//third_party/icu",
    "//third_party/skia",
    "//topaz/runtime/dart/utils:inlines",
    "//topaz/runtime/dart/utils:vmo",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/trace",
    "//zircon/public/lib/zx",
  ]
}

test_package("flutter_runner_tests") {
  deps = [
    ":flutter_runner_unittests",
    "//third_party/skia",
  ]

  tests = [
    {
      name = "flutter_runner_tests"
      environments = basic_envs
    },
  ]

  resources = [
    {
      path = rebase_path("tests/test_manifest.json")
      dest = "testdata/test_fonts/manifest.json"
    },
  ]

  fonts = [
    "roboto/Roboto-Regular.ttf",
    "robotoslab/RobotoSlab-Regular.ttf",
  ]
  foreach(font, fonts) {
    resources += [
      {
        path = rebase_path("//garnet/bin/fonts/third_party/${font}")
        file_name = get_path_info(font, "file")
        dest = "testdata/test_fonts/${file_name}"
      },
    ]
  }
}
