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

import("//flutter/common/config.gni")
import("//flutter/testing/testing.gni")

config("desktop_library_implementation") {
  defines = [ "FLUTTER_DESKTOP_LIBRARY" ]
}

_public_headers = [
  "public/flutter_export.h",
  "public/flutter_messenger.h",
  "public/flutter_plugin_registrar.h",
]

# Any files that are built by clients (client_wrapper code, library headers for
# implementations using this shared code, etc.) include the public headers
# assuming they are in the include path. This configuration should be added to
# any such code that is also built by GN to make the includes work.
config("relative_flutter_library_headers") {
  include_dirs = [ "public" ]
}

# The headers are a separate source set since the client wrapper is allowed
# to depend on the public headers, but none of the rest of the code.
source_set("common_cpp_library_headers") {
  public = _public_headers

  configs += [ ":desktop_library_implementation" ]
}

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

source_set("common_cpp_input") {
  public = [
    "text_input_model.h",
    "text_range.h",
  ]

  sources = [ "text_input_model.cc" ]

  configs += [ ":desktop_library_implementation" ]

  public_configs = [ "//flutter:config" ]

  deps = [ "//flutter/fml:fml" ]

  if (is_win) {
    # For wstring_conversion. See issue #50053.
    defines = [ "_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING" ]
  }
}

source_set("common_cpp_switches") {
  public = [ "engine_switches.h" ]

  sources = [ "engine_switches.cc" ]

  public_configs = [
    "//flutter:config",
    "//flutter/common:flutter_config",
  ]
}

source_set("common_cpp") {
  public = [
    "incoming_message_dispatcher.h",
    "json_message_codec.h",
    "json_method_codec.h",
  ]

  # TODO: Refactor flutter_glfw.cc to move the implementations corresponding
  # to the _public_headers above into this target.
  sources = [
    "incoming_message_dispatcher.cc",
    "json_message_codec.cc",
    "json_method_codec.cc",
  ]

  configs += [ ":desktop_library_implementation" ]

  public_configs = [ "//flutter:config" ]

  deps = [
    ":common_cpp_library_headers",
    "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
    "//flutter/shell/platform/embedder:embedder_as_internal_library",
  ]

  public_deps = [
    ":common_cpp_core",
    "//third_party/rapidjson",
  ]
}

# The portion of common_cpp that has no dependencies on the public/
# headers. This division should be revisited once the Linux GTK
# embedding is futher along and it's clearer how much, if any, shared
# API surface there will be.
source_set("common_cpp_core") {
  public = [ "path_utils.h" ]

  sources = [ "path_utils.cc" ]

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

if (enable_unittests) {
  test_fixtures("common_cpp_core_fixtures") {
    fixtures = []
  }

  executable("common_cpp_core_unittests") {
    testonly = true

    sources = [ "path_utils_unittests.cc" ]

    deps = [
      ":common_cpp_core",
      ":common_cpp_core_fixtures",
      "//flutter/testing",
      "//third_party/dart/runtime:libdart_jit",
    ]

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

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

  executable("common_cpp_unittests") {
    testonly = true

    sources = [
      "engine_switches_unittests.cc",
      "json_message_codec_unittests.cc",
      "json_method_codec_unittests.cc",
      "text_input_model_unittests.cc",
      "text_range_unittests.cc",
    ]

    deps = [
      ":common_cpp",
      ":common_cpp_fixtures",
      ":common_cpp_input",
      ":common_cpp_switches",
      "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
      "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper_library_stubs",
      "//flutter/testing",
    ]

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