# 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")

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

  executable(target_name) {
    output_name = invoker_output_name

    defines = extra_defines

    libs = []

    sources = [
      "accessibility_bridge.cc",
      "accessibility_bridge.h",
      "component.cc",
      "component.h",
      "compositor_context.cc",
      "compositor_context.h",
      "engine.cc",
      "engine.h",
      "flutter_runner_product_configuration.cc",
      "flutter_runner_product_configuration.h",
      "fuchsia_intl.cc",
      "fuchsia_intl.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",
      "session_connection.cc",
      "session_connection.h",
      "surface.cc",
      "surface.h",
      "task_observers.cc",
      "task_observers.h",
      "task_runner_adapter.cc",
      "task_runner_adapter.h",
      "thread.cc",
      "thread.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 = [
      "../flutter:fuchsia_legacy_gpu_configuration",
      "//flutter/assets",
      "//flutter/common",
      "//flutter/fml",
      "//flutter/flow:flow_fuchsia_legacy",
      "//flutter/lib/ui:ui_fuchsia_legacy",
      "//flutter/runtime:runtime_fuchsia_legacy",
      "//flutter/shell/common:common_fuchsia_legacy",
      "//flutter/vulkan",
    ]

    _fuchsia_platform = "//flutter/shell/platform/fuchsia"

    # TODO(kaushikiska) evaluate if all of these are needed.
    fuchsia_deps = [
      "${_fuchsia_platform}/dart-pkg/fuchsia",
      "${_fuchsia_platform}/dart-pkg/zircon",
      "${_fuchsia_platform}/runtime/dart/utils",
    ]

    deps = [
             "$fuchsia_sdk_root/fidl:fuchsia.accessibility.semantics",
             "$fuchsia_sdk_root/fidl:fuchsia.fonts",
             "$fuchsia_sdk_root/fidl:fuchsia.images",
             "$fuchsia_sdk_root/fidl:fuchsia.intl",
             "$fuchsia_sdk_root/fidl:fuchsia.io",
             "$fuchsia_sdk_root/fidl:fuchsia.sys",
             "$fuchsia_sdk_root/fidl:fuchsia.ui.app",
             "$fuchsia_sdk_root/fidl:fuchsia.ui.scenic",
             "$fuchsia_sdk_root/pkg:async-cpp",
             "$fuchsia_sdk_root/pkg:async-default",
             "$fuchsia_sdk_root/pkg:async-loop",
             "$fuchsia_sdk_root/pkg:async-loop-cpp",
             "$fuchsia_sdk_root/pkg:fdio",
             "$fuchsia_sdk_root/pkg:fidl_cpp",
             "$fuchsia_sdk_root/pkg:scenic_cpp",
             "$fuchsia_sdk_root/pkg:sys_cpp",
             "$fuchsia_sdk_root/pkg:syslog",
             "$fuchsia_sdk_root/pkg:trace",
             "$fuchsia_sdk_root/pkg:trace-engine",
             "$fuchsia_sdk_root/pkg:trace-provider-so",
             "$fuchsia_sdk_root/pkg:vfs_cpp",
             "$fuchsia_sdk_root/pkg:zx",
             "//third_party/skia",
             "//flutter/third_party/tonic",
           ] + fuchsia_deps + flutter_deps + extra_deps

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

    if (!invoker.product) {
      # 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" ]
    }
  }
}
