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

import("//flutter/shell/platform/glfw/config.gni")
import("//flutter/testing/testing.gni")

group("linux") {
  deps = [
    ":flutter_linux_gtk",
    ":publish_headers_linux",
  ]
  if (build_glfw_shell) {
    deps += [
      ":flutter_linux_glfw",
      "//flutter/shell/platform/glfw:publish_headers_glfw",
      "//flutter/shell/platform/glfw/client_wrapper:publish_wrapper_glfw",
    ]
  }
}

# Temporary workaround for the issue describe in
# https://github.com/flutter/flutter/issues/14509 and
# https://github.com/flutter/flutter/issues/14438
# Remove once the build infrastructure moves to Ubuntu 18.04 or newer, where
# the underlying issue is fixed.
config("disable_fatal_link_warnings") {
  visibility = [ ":*" ]
  ldflags = [ "-Wl,--no-fatal-warnings" ]
}

if (build_glfw_shell) {
  shared_library("flutter_linux_glfw") {
    deps = [ "//flutter/shell/platform/glfw:flutter_glfw" ]

    configs += [ ":disable_fatal_link_warnings" ]

    public_configs = [ "//flutter:config" ]
  }
}

_public_headers = [
  "public/flutter_linux/fl_basic_message_channel.h",
  "public/flutter_linux/fl_binary_codec.h",
  "public/flutter_linux/fl_binary_messenger.h",
  "public/flutter_linux/fl_dart_project.h",
  "public/flutter_linux/fl_engine.h",
  "public/flutter_linux/fl_event_channel.h",
  "public/flutter_linux/fl_json_message_codec.h",
  "public/flutter_linux/fl_json_method_codec.h",
  "public/flutter_linux/fl_message_codec.h",
  "public/flutter_linux/fl_method_call.h",
  "public/flutter_linux/fl_method_channel.h",
  "public/flutter_linux/fl_method_codec.h",
  "public/flutter_linux/fl_method_response.h",
  "public/flutter_linux/fl_pixel_buffer_texture.h",
  "public/flutter_linux/fl_plugin_registrar.h",
  "public/flutter_linux/fl_plugin_registry.h",
  "public/flutter_linux/fl_standard_message_codec.h",
  "public/flutter_linux/fl_standard_method_codec.h",
  "public/flutter_linux/fl_string_codec.h",
  "public/flutter_linux/fl_texture.h",
  "public/flutter_linux/fl_texture_gl.h",
  "public/flutter_linux/fl_texture_registrar.h",
  "public/flutter_linux/fl_value.h",
  "public/flutter_linux/fl_view.h",
  "public/flutter_linux/flutter_linux.h",
]

config("relative_flutter_linux_headers") {
  include_dirs = [ "public" ]
}

source_set("flutter_linux_sources") {
  public = _public_headers + [
             "fl_binary_messenger_private.h",
             "fl_dart_project_private.h",
             "fl_engine_private.h",
             "fl_keyboard_manager.h",
             "fl_key_event.h",
             "fl_key_responder.h",
             "fl_key_channel_responder.h",
             "fl_key_embedder_responder.h",
             "fl_key_embedder_responder_private.h",
             "fl_method_call_private.h",
             "fl_method_channel_private.h",
             "fl_method_codec_private.h",
             "fl_plugin_registrar_private.h",
             "fl_standard_message_codec_private.h",
             "key_mapping.h",
           ]

  configs += [ "//flutter/shell/platform/linux/config:gtk" ]

  sources = [
    "fl_accessibility_plugin.cc",
    "fl_accessible_node.cc",
    "fl_backing_store_provider.cc",
    "fl_basic_message_channel.cc",
    "fl_binary_codec.cc",
    "fl_binary_messenger.cc",
    "fl_dart_project.cc",
    "fl_engine.cc",
    "fl_event_channel.cc",
    "fl_gl_area.cc",
    "fl_json_message_codec.cc",
    "fl_json_method_codec.cc",
    "fl_key_channel_responder.cc",
    "fl_key_embedder_responder.cc",
    "fl_key_event.cc",
    "fl_key_responder.cc",
    "fl_keyboard_manager.cc",
    "fl_message_codec.cc",
    "fl_method_call.cc",
    "fl_method_channel.cc",
    "fl_method_codec.cc",
    "fl_method_response.cc",
    "fl_mouse_cursor_plugin.cc",
    "fl_pixel_buffer_texture.cc",
    "fl_platform_plugin.cc",
    "fl_plugin_registrar.cc",
    "fl_plugin_registry.cc",
    "fl_renderer.cc",
    "fl_renderer_gl.cc",
    "fl_renderer_headless.cc",
    "fl_settings_plugin.cc",
    "fl_standard_message_codec.cc",
    "fl_standard_method_codec.cc",
    "fl_string_codec.cc",
    "fl_task_runner.cc",
    "fl_task_runner.h",
    "fl_text_input_plugin.cc",
    "fl_texture.cc",
    "fl_texture_gl.cc",
    "fl_texture_registrar.cc",
    "fl_value.cc",
    "fl_view.cc",
    "fl_view_accessible.cc",
    "key_mapping.cc",
  ]

  # Set flag to stop headers being directly included (library users should not do this)
  defines = [
    "FLUTTER_LINUX_COMPILATION",
    "FLUTTER_ENGINE_NO_PROTOTYPES",
  ]

  deps = [
    "//flutter/shell/platform/common:common_cpp_input",
    "//flutter/shell/platform/common:common_cpp_switches",
    "//flutter/shell/platform/embedder:embedder_headers",
    "//third_party/rapidjson",
  ]
}

source_set("flutter_linux") {
  configs += [
    "//flutter/shell/platform/linux/config:gtk",
    "//flutter/shell/platform/linux/config:epoxy",
  ]

  defines = [ "FLUTTER_ENGINE_NO_PROTOTYPES" ]

  public_deps = [ ":flutter_linux_sources" ]

  deps = [ "//flutter/shell/platform/embedder:embedder_as_internal_library" ]
}

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

executable("flutter_linux_unittests") {
  testonly = true

  sources = [
    "fl_accessible_node_test.cc",
    "fl_basic_message_channel_test.cc",
    "fl_binary_codec_test.cc",
    "fl_binary_messenger_test.cc",
    "fl_dart_project_test.cc",
    "fl_engine_test.cc",
    "fl_event_channel_test.cc",
    "fl_json_message_codec_test.cc",
    "fl_json_method_codec_test.cc",
    "fl_key_channel_responder_test.cc",
    "fl_key_embedder_responder_test.cc",
    "fl_keyboard_manager_test.cc",
    "fl_message_codec_test.cc",
    "fl_method_channel_test.cc",
    "fl_method_codec_test.cc",
    "fl_method_response_test.cc",
    "fl_pixel_buffer_texture_test.cc",
    "fl_standard_message_codec_test.cc",
    "fl_standard_method_codec_test.cc",
    "fl_string_codec_test.cc",
    "fl_texture_gl_test.cc",
    "fl_texture_registrar_test.cc",
    "fl_value_test.cc",
    "testing/fl_test.cc",
    "testing/mock_engine.cc",
    "testing/mock_epoxy.cc",
    "testing/mock_renderer.cc",
    "testing/mock_text_input_plugin.cc",
  ]

  public_configs = [ "//flutter:config" ]

  configs += [ "//flutter/shell/platform/linux/config:gtk" ]

  defines = [
    "FLUTTER_ENGINE_NO_PROTOTYPES",

    # Set flag to allow public headers to be directly included
    # (library users should not do this)
    "FLUTTER_LINUX_COMPILATION",
  ]

  deps = [
    ":flutter_linux_fixtures",
    ":flutter_linux_sources",
    "//flutter/runtime:libdart",
    "//flutter/shell/platform/embedder:embedder_headers",
    "//flutter/shell/platform/embedder:embedder_test_utils",
    "//flutter/testing",
  ]
}

shared_library("flutter_linux_gtk") {
  deps = [ ":flutter_linux" ]

  ldflags = [ "-Wl,-rpath,\$ORIGIN" ]

  public_configs = [ "//flutter:config" ]
}

copy("publish_headers_linux") {
  sources = _public_headers
  outputs = [ "$root_out_dir/flutter_linux/{{source_file_part}}" ]
}
