# 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/shell/platform/config.gni")
import("//flutter/testing/testing.gni")

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

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

# This "fuchsia_legacy" configuration includes old, non-embedder API sources and
# defines the LEGACY_FUCHSIA_EMBEDDER symbol.  This config and its associated
# template are both transitional and will be removed after the embedder API
# transition is complete.
#
# See `source_set_maybe_fuchsia_legacy` in //flutter/common/config.gni
#
# TODO(fxb/54041): Remove when no longer neccesary.
config("fuchsia_legacy") {
  if (is_fuchsia) {
    defines = [ "LEGACY_FUCHSIA_EMBEDDER" ]
  }
}

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("flutter") {
  testonly = true

  # Compile the engine.
  public_deps = [
    "//flutter/shell/platform/embedder:flutter_engine",
    "//flutter/sky",
  ]

  # If enbaled, compile the SDK / snapshot.
  if (!is_fuchsia) {
    public_deps += [
      "//flutter/lib/snapshot:generate_snapshot_bin",
      "//flutter/lib/snapshot:kernel_platform_files",
    ]

    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 tools.
  if (current_toolchain == host_toolchain) {
    public_deps += [
      "//flutter/shell/testing",
      "//flutter/tools/const_finder",
      "//flutter/tools/font-subset",
    ]
  }

  # Compile all benchmark targets if enabled.
  if (enable_unittests && !is_win) {
    public_deps += [
      "//flutter/fml:fml_benchmarks",
      "//flutter/lib/ui:ui_benchmarks",
      "//flutter/shell/common:shell_benchmarks",
      "//flutter/third_party/txt:txt_benchmarks",
    ]
  }

  # Compile all unittests targets if enabled.
  if (enable_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/testing:testing_unittests",
      "//flutter/third_party/txt:txt_unittests",
    ]

    if (is_fuchsia) {
      public_deps += [ "//flutter/shell/platform/fuchsia:tests" ]
    }

    if (is_mac) {
      public_deps +=
          [ "//flutter/shell/platform/darwin:flutter_channels_unittests" ]
    }

    if (!is_win && !is_fuchsia) {
      public_deps += [
        "//flutter/shell/platform/android/external_view_embedder:android_external_view_embedder_unittests",
        "//flutter/shell/platform/android/jni:jni_unittests",
      ]
    }

    # TODO(): Enable embedder_unittests on fucsia.
    if (!is_fuchsia) {
      public_deps += [ "//flutter/shell/platform/embedder:embedder_unittests" ]
    }

    # Unit tests for desktop embeddings should only be built if the desktop
    # embeddings are being built.
    if (enable_desktop_embeddings) {
      public_deps += [
        "//flutter/shell/platform/common/cpp:common_cpp_core_unittests",
        "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper_unittests",
      ]

      if (!is_fuchsia) {
        # These tests require the embedder and thus cannot run on fuchsia.
        # TODO(): Enable when embedder works on fuchsia.
        public_deps +=
            [ "//flutter/shell/platform/common/cpp:common_cpp_unittests" ]

        # These tests require GLFW and thus cannot run on fuchsia.
        public_deps += [ "//flutter/shell/platform/glfw/client_wrapper:client_wrapper_glfw_unittests" ]
      }

      if (is_linux) {
        public_deps +=
            [ "//flutter/shell/platform/linux:flutter_linux_unittests" ]
      }

      if (is_mac) {
        public_deps += [ "//flutter/shell/platform/darwin/macos:flutter_desktop_darwin_unittests" ]
      }

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

group("dist") {
  testonly = true

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

if (is_fuchsia) {
  group("fuchsia_tests") {
    testonly = true

    deps = [
      "//flutter/shell/platform/fuchsia:tests",
    ]
  }
}
