# 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/toolchain/clang.gni")
import("//flutter/common/config.gni")
import("//flutter/examples/examples.gni")
import("//flutter/shell/platform/config.gni")
import("//flutter/shell/platform/glfw/config.gni")
import("//flutter/testing/testing.gni")
import("//third_party/dart/build/dart/copy_tree.gni")

# Whether to build the dartdevc sdk, libraries, and source files
# required for the flutter web sdk.
# TODO(jacksongardner): remove this poorly named argument once the recipes stop
# using it. https://github.com/flutter/flutter/issues/113303
declare_args() {
  full_dart_sdk = false
}

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

config("export_dynamic_symbols") {
  # --dynamic-list is the GNU linker syntax supported by ELF linkers.
  # -exported_symbols_list is the macOS linker syntax. The different flags
  # accept files formatted differently, so we have exported_symbols.sym for GNU
  # linker syntax, and exported_symbols_mac.sym for the macOS linker syntax.
  if (is_linux || is_fuchsia) {
    inputs = [ "//flutter/common/exported_symbols.sym" ]
    ldflags = [ "-Wl,--dynamic-list=" + rebase_path(inputs[0], root_build_dir) ]
  } else if (is_mac) {
    inputs = [ "//flutter/common/exported_symbols_mac.sym" ]
    ldflags = [
      "-Xlinker",
      "-exported_symbols_list",
      "-Xlinker",
      rebase_path(inputs[0], root_build_dir),
    ]
  }
}

group("flutter") {
  testonly = true

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

  # Ensure the example for a sample embedder compiles.
  if (build_embedder_examples) {
    public_deps += [
      "//flutter/examples/glfw",
      "//flutter/examples/vulkan_glfw",
    ]

    if (!is_mac) {
      public_deps += [ "//flutter/examples/glfw_drm" ]
    }
  }

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

    if (build_engine_artifacts) {
      public_deps += [
        "//flutter/build/dart:dart_sdk",
        "//flutter/flutter_frontend_server:frontend_server",

        # This must be listed explicitly for desktop cross-builds since
        # //flutter/lib/snapshot:generate_snapshot_bin will only build
        # gen_snapshot for the host and not the target.
        "//third_party/dart/runtime/bin:gen_snapshot",

        # Impeller artifacts - compiler and libtessellator
        "//flutter/impeller/compiler:impellerc",
        "//flutter/impeller/tessellator:tessellator_shared",

        # path_ops
        "//flutter/tools/path_ops",
      ]

      if (host_os == "linux") {
        public_deps += [
          # Built alongside gen_snapshot for 64 bit targets
          "//third_party/dart/runtime/bin:analyze_snapshot",
        ]
      }

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

  if (build_engine_artifacts) {
    public_deps += [
      "//flutter/shell/testing",
      "//flutter/tools/const_finder",
      "//flutter/tools/font-subset",
    ]
  }

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

  if ((flutter_runtime_mode == "debug" || flutter_runtime_mode == "profile") &&
      (is_ios || is_android)) {
    public_deps += [ "//flutter/testing/scenario_app" ]
  }

  if (is_android && flutter_runtime_mode == "profile" &&
      current_cpu == "arm64") {
    public_deps += [ "//flutter/testing/android_background_image" ]
  }
}

group("unittests") {
  testonly = true

  public_deps = []
  if (is_android) {
    public_deps +=
        [ "//flutter/shell/platform/android:flutter_shell_native_unittests" ]
  }

  # Compile all unittests targets if enabled.
  if (enable_unittests) {
    public_deps += [
      "//flutter/display_list:display_list_rendertests",
      "//flutter/display_list:display_list_unittests",
      "//flutter/flow:flow_unittests",
      "//flutter/fml:fml_unittests",
      "//flutter/lib/ui:ui_unittests",
      "//flutter/runtime:dart_plugin_registrant_unittests",
      "//flutter/runtime:no_dart_plugin_registrant_unittests",
      "//flutter/runtime:runtime_unittests",
      "//flutter/shell/common:shell_unittests",
      "//flutter/shell/platform/embedder:embedder_a11y_unittests",
      "//flutter/shell/platform/embedder:embedder_proctable_unittests",
      "//flutter/shell/platform/embedder:embedder_unittests",
      "//flutter/testing:testing_unittests",
      "//flutter/testing/dart",
      "//flutter/testing/smoke_test_failure",
      "//flutter/third_party/tonic/tests:tonic_unittests",
      "//flutter/third_party/txt:txt_unittests",
    ]

    # The accessibility library only supports Mac and Windows at the moment.
    if (is_mac || is_win) {
      public_deps +=
          [ "//flutter/third_party/accessibility:accessibility_unittests" ]
    }

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

    if (is_mac || is_linux || is_win) {
      public_deps += [
        "//flutter/impeller:impeller_dart_unittests",
        "//flutter/impeller:impeller_unittests",
      ]
    }

    if (is_mac) {
      public_deps += [
        "//flutter/impeller/golden_tests:impeller_golden_tests",
        "//flutter/shell/platform/darwin/common:framework_common_unittests",
        "//flutter/third_party/spring_animation:spring_animation_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",
        "//flutter/shell/platform/android/platform_view_android_delegate:platform_view_android_delegate_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:common_cpp_core_unittests",
        "//flutter/shell/platform/common/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: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 (build_glfw_shell) {
          public_deps +=
              [ "//flutter/shell/platform/glfw:flutter_glfw_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",
        ]
      }
    }
  }
}

if (build_engine_artifacts) {
  group("archives") {
    testonly = true

    deps = [ "//flutter/build/archives:artifacts" ]
  }
}

group("dist") {
  testonly = true

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

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

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

# On Windows, when targeting Android, we only build gen_snapshot. This
# top-level target provides a convenient shorthand for the full path into the
# Dart tree, and is less ambiguous than specifying the binary to build since
# we can specify the toolchain to use, too.
if (host_os == "win") {
  _gen_snapshot_target =
      "//third_party/dart/runtime/bin:gen_snapshot($host_toolchain)"
  copy("gen_snapshot") {
    deps = [ _gen_snapshot_target ]

    gen_snapshot_out_dir = get_label_info(_gen_snapshot_target, "root_out_dir")
    sources = [ "$gen_snapshot_out_dir/gen_snapshot.exe" ]
    outputs = [ "$root_build_dir/gen_snapshot/gen_snapshot.exe" ]
  }
}
