# 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("//build/fuchsia/sdk.gni")
import("//flutter/common/config.gni")
import("//flutter/testing/testing.gni")

source_set("fml") {
  sources = [
    "ascii_trie.cc",
    "ascii_trie.h",
    "backtrace.h",
    "base32.cc",
    "base32.h",
    "build_config.h",
    "closure.h",
    "command_line.cc",
    "command_line.h",
    "compiler_specific.h",
    "concurrent_message_loop.cc",
    "concurrent_message_loop.h",
    "delayed_task.cc",
    "delayed_task.h",
    "eintr_wrapper.h",
    "file.cc",
    "file.h",
    "hash_combine.h",
    "icu_util.cc",
    "icu_util.h",
    "log_level.h",
    "log_settings.cc",
    "log_settings.h",
    "log_settings_state.cc",
    "logging.cc",
    "logging.h",
    "make_copyable.h",
    "mapping.cc",
    "mapping.h",
    "memory/ref_counted.h",
    "memory/ref_counted_internal.h",
    "memory/ref_ptr.h",
    "memory/ref_ptr_internal.h",
    "memory/task_runner_checker.cc",
    "memory/task_runner_checker.h",
    "memory/thread_checker.h",
    "memory/weak_ptr.h",
    "memory/weak_ptr_internal.cc",
    "memory/weak_ptr_internal.h",
    "message.cc",
    "message.h",
    "message_loop.cc",
    "message_loop.h",
    "message_loop_impl.cc",
    "message_loop_impl.h",
    "message_loop_task_queues.cc",
    "message_loop_task_queues.h",
    "native_library.h",
    "paths.cc",
    "paths.h",
    "posix_wrappers.h",
    "raster_thread_merger.cc",
    "raster_thread_merger.h",
    "size.h",
    "synchronization/atomic_object.h",
    "synchronization/count_down_latch.cc",
    "synchronization/count_down_latch.h",
    "synchronization/semaphore.cc",
    "synchronization/semaphore.h",
    "synchronization/shared_mutex.h",
    "synchronization/sync_switch.cc",
    "synchronization/sync_switch.h",
    "synchronization/waitable_event.cc",
    "synchronization/waitable_event.h",
    "task_runner.cc",
    "task_runner.h",
    "thread.cc",
    "thread.h",
    "thread_local.cc",
    "thread_local.h",
    "time/time_delta.h",
    "time/time_point.cc",
    "time/time_point.h",
    "trace_event.cc",
    "trace_event.h",
    "unique_fd.cc",
    "unique_fd.h",
    "unique_object.h",
    "wakeable.h",
  ]

  if (is_mac || is_ios || is_linux) {
    sources += [ "backtrace.cc" ]
  } else {
    sources += [ "backtrace_stub.cc" ]
  }

  public_deps = []

  deps = [
    "//third_party/dart/runtime:dart_api",

    # These need to be in sync with the Fuchsia buildroot.
    "//third_party/icu",
  ]

  configs += [ "//third_party/icu:icu_config" ]

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

  libs = []

  if (is_ios || is_mac) {
    sources += [ "platform/posix/shared_mutex_posix.cc" ]
  } else {
    sources += [ "synchronization/shared_mutex_std.cc" ]
  }

  if (is_ios || is_mac) {
    cflags_objc = flutter_cflags_objc
    cflags_objcc = flutter_cflags_objcc

    sources += [
      "platform/darwin/cf_utils.cc",
      "platform/darwin/cf_utils.h",
      "platform/darwin/message_loop_darwin.h",
      "platform/darwin/message_loop_darwin.mm",
      "platform/darwin/paths_darwin.mm",
      "platform/darwin/platform_version.h",
      "platform/darwin/platform_version.mm",
      "platform/darwin/scoped_block.h",
      "platform/darwin/scoped_block.mm",
      "platform/darwin/scoped_nsobject.h",
      "platform/darwin/scoped_nsobject.mm",
      "platform/darwin/string_range_sanitization.h",
      "platform/darwin/string_range_sanitization.mm",
    ]

    libs += [ "Foundation.framework" ]
  }

  if (is_android) {
    sources += [
      "platform/android/jni_util.cc",
      "platform/android/jni_util.h",
      "platform/android/jni_weak_ref.cc",
      "platform/android/jni_weak_ref.h",
      "platform/android/message_loop_android.cc",
      "platform/android/message_loop_android.h",
      "platform/android/paths_android.cc",
      "platform/android/paths_android.h",
      "platform/android/scoped_java_ref.cc",
      "platform/android/scoped_java_ref.h",
    ]

    libs += [ "android" ]
  }

  if (is_android) {
    sources += [
      "platform/linux/timerfd.cc",
      "platform/linux/timerfd.h",
    ]
  }

  if (is_linux) {
    sources += [
      "platform/linux/message_loop_linux.cc",
      "platform/linux/message_loop_linux.h",
      "platform/linux/paths_linux.cc",
      "platform/linux/timerfd.cc",
      "platform/linux/timerfd.h",
    ]
  }

  if (is_fuchsia) {
    sources += [
      "platform/fuchsia/message_loop_fuchsia.cc",
      "platform/fuchsia/message_loop_fuchsia.h",
      "platform/fuchsia/paths_fuchsia.cc",
    ]

    public_deps += [
      "$fuchsia_sdk_root/pkg:async-cpp",
      "$fuchsia_sdk_root/pkg:async-loop-cpp",
      "$fuchsia_sdk_root/pkg:async-loop-default",
      "$fuchsia_sdk_root/pkg:trace",
      "$fuchsia_sdk_root/pkg:trace-engine",
      "$fuchsia_sdk_root/pkg:zx",
    ]
  }

  if (is_win) {
    sources += [
      "platform/win/errors_win.cc",
      "platform/win/errors_win.h",
      "platform/win/file_win.cc",
      "platform/win/mapping_win.cc",
      "platform/win/message_loop_win.cc",
      "platform/win/message_loop_win.h",
      "platform/win/native_library_win.cc",
      "platform/win/paths_win.cc",
      "platform/win/posix_wrappers_win.cc",
      "platform/win/wstring_conversion.h",
    ]

    if (is_win) {
      # For wstring_conversion. See issue #50053.
      defines = [ "_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING" ]
    }
  } else {
    sources += [
      "platform/posix/file_posix.cc",
      "platform/posix/mapping_posix.cc",
      "platform/posix/native_library_posix.cc",
      "platform/posix/paths_posix.cc",
      "platform/posix/posix_wrappers_posix.cc",
    ]
  }
}

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

  executable("fml_benchmarks") {
    testonly = true

    sources = [ "message_loop_task_queues_benchmark.cc" ]

    deps = [
      "//flutter/benchmarking",
      "//flutter/fml",
      "//flutter/runtime:libdart",
    ]
  }

  executable("fml_unittests") {
    testonly = true

    sources = [
      "ascii_trie_unittests.cc",
      "backtrace_unittests.cc",
      "base32_unittest.cc",
      "command_line_unittest.cc",
      "file_unittest.cc",
      "hash_combine_unittests.cc",
      "memory/ref_counted_unittest.cc",
      "memory/task_runner_checker_unittest.cc",
      "memory/weak_ptr_unittest.cc",
      "message_loop_task_queues_merge_unmerge_unittests.cc",
      "message_loop_task_queues_unittests.cc",
      "message_loop_unittests.cc",
      "message_unittests.cc",
      "paths_unittests.cc",
      "raster_thread_merger_unittests.cc",
      "synchronization/count_down_latch_unittests.cc",
      "synchronization/semaphore_unittest.cc",
      "synchronization/sync_switch_unittest.cc",
      "synchronization/waitable_event_unittest.cc",
      "thread_local_unittests.cc",
      "thread_unittests.cc",
      "time/time_delta_unittest.cc",
      "time/time_point_unittest.cc",
      "time/time_unittest.cc",
    ]

    if (is_mac) {
      sources += [
        "platform/darwin/cf_utils_unittests.mm",
        "platform/darwin/string_range_sanitization_unittests.mm",
      ]
    }

    deps = [
      ":fml_fixtures",
      "//flutter/fml",
      "//flutter/fml/dart",
      "//flutter/runtime:libdart",
      "//flutter/testing",
    ]

    if (is_fuchsia) {
      libs =
          [ "${fuchsia_sdk_path}/arch/${target_cpu}/sysroot/lib/libzircon.so" ]
    }
  }
}
