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

if (is_fuchsia) {
  import("//build/fuchsia/sdk.gni")
}

# Whether to build the dartdevc sdk, libraries, and source files
# required for the flutter web sdk.
declare_args() {
  full_dart_sdk = false
}

group("flutter") {
  testonly = true

  public_deps = []

  if (!is_fuchsia) {
    public_deps += [
      "//flutter/lib/snapshot:generate_snapshot_bin",
      "//flutter/lib/snapshot:kernel_platform_files",
    ]
  }

  public_deps += [
    "//flutter/shell/platform/embedder:flutter_engine",
    "//flutter/sky",
  ]

  if (current_toolchain == host_toolchain) {
    public_deps += [ "//flutter/tools/font-subset" ]
  }

  if (current_toolchain == host_toolchain) {
    public_deps += [ "//flutter/shell/testing" ]
    public_deps += [ "//flutter/tools/const_finder" ]
  }

  if (is_fuchsia) {
    public_deps += [
      "//flutter/shell/platform/fuchsia",
      "//flutter/shell/testing($host_toolchain)",
    ]
  }

  if (!is_fuchsia) {
    if (current_toolchain == host_toolchain) {
      public_deps += [
        "//flutter/flutter_frontend_server:frontend_server",
        "//third_party/dart:create_sdk",
      ]

      if (full_dart_sdk) {
        public_deps += [ "//flutter/web_sdk" ]
      }
    }
  }

  # If on the host, compile all unittests targets.
  if (current_toolchain == host_toolchain) {
    if (is_mac) {
      public_deps += [
        "//flutter/shell/platform/darwin:flutter_channels_unittests",
        "//flutter/shell/platform/darwin/macos:flutter_desktop_darwin_unittests",
      ]
    }

    public_deps += [
      "//flutter/flow:flow_unittests",
      "//flutter/fml:fml_unittests",
      "//flutter/lib/ui:ui_unittests",
      "//flutter/runtime:runtime_unittests",
      "//flutter/shell/common:shell_unittests",
      "//flutter/shell/platform/common/cpp:common_cpp_core_unittests",
      "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper_unittests",
      "//flutter/shell/platform/embedder:embedder_unittests",
      "//flutter/shell/platform/glfw/client_wrapper:client_wrapper_glfw_unittests",
      "//flutter/testing:testing_unittests",
      "//flutter/third_party/txt:txt_unittests",
    ]

    if (is_win) {
      public_deps += [
        "//flutter/shell/platform/windows:flutter_windows_unittests",
        "//flutter/shell/platform/windows/client_wrapper:client_wrapper_windows_unittests",
      ]
    }

    if (!is_win) {
      public_deps += [
        "//flutter/fml:fml_benchmarks",
        "//flutter/shell/common:shell_benchmarks",
        "//flutter/third_party/txt:txt_benchmarks",
      ]
    }
  }
}

config("config") {
  include_dirs = [ ".." ]
  if (is_win) {
    if (current_cpu != "x86") {
      cflags = [ "/WX" ]  # Treat warnings as errors.
    }
  }
}

config("export_dynamic_symbols") {
  if (is_linux || is_fuchsia) {
    inputs = [
      "//flutter/common/exported_symbols.sym",
    ]
    ldflags = [ "-Wl,--dynamic-list=" + rebase_path(inputs[0], root_build_dir) ]
  }
}

group("dist") {
  testonly = true

  deps = [
    "//flutter/sky/dist",
  ]
}

# Fuchsia currently only supports a subset of our unit tests
# When adding a new dep here, please also ensure the dep is added to
# testing/fuchsia/run_tests.sh and testing/fuchsia/test_fars
if (is_fuchsia) {
  group("fuchsia_tests") {
    testonly = true

    deps = [
      "//flutter/flow:flow_tests",
      "//flutter/fml:fml_tests",
      "//flutter/runtime:runtime_tests",
      "//flutter/shell/common:shell_tests",
      "//flutter/shell/platform/fuchsia/flutter:flutter_runner_scenic_tests",
      "//flutter/shell/platform/fuchsia/flutter:flutter_runner_tests",
    ]
  }
}
