# 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("//third_party/dart/utils/application_snapshot.gni")

# TODO(kaushikiska@): Leaving this here to make it a soft-transition
# Remove this once we no longer need engine sources in fuchsia/topaz.
if (is_fuchsia_host || is_fuchsia) {
  import("//build/dart/dart_library.gni")
  import("//build/dart/dart_tool.gni")

  dart_library("flutter_frontend_server") {
    disable_analysis = true
    package_name = "flutter_frontend_server"

    sources = [
      "server.dart",
    ]

    deps = [
      "//third_party/dart-pkg/pub/args",
      "//third_party/dart-pkg/pub/cli_util",
      "//third_party/dart-pkg/pub/path",
      "//third_party/dart-pkg/pub/source_maps",
      "//third_party/dart-pkg/pub/usage",
      "//third_party/dart/pkg/analyzer",
      "//third_party/dart/pkg/build_integration",
      "//third_party/dart/pkg/dev_compiler",
      "//third_party/dart/pkg/front_end",
      "//third_party/dart/pkg/frontend_server",
      "//third_party/dart/pkg/kernel",
      "//third_party/dart/pkg/vm",
    ]
  }

  dart_tool("frontend_server_tool") {
    main_dart = "bin/starter.dart"
    source_dir = "."
    disable_analysis = true
    output_name = "frontend_server"

    sources = []

    deps = [
      ":flutter_frontend_server",
    ]
  }
}

frontend_server_files =
    exec_script("//third_party/dart/tools/list_dart_files.py",
                [
                  "absolute",
                  rebase_path("."),
                ],
                "list lines")

frontend_server_files +=
    exec_script("//third_party/dart/tools/list_dart_files.py",
                [
                  "absolute",
                  rebase_path("../../third_party/dart/pkg"),
                ],
                "list lines")

application_snapshot("frontend_server") {
  main_dart = "bin/starter.dart"
  deps = [
    ":package_incremental_compiler",
    "//flutter/lib/snapshot:kernel_platform_files",
  ]
  dot_packages = rebase_path(".packages")
  flutter_patched_sdk = rebase_path("$root_out_dir/flutter_patched_sdk")
  training_args = [
    "--train",
    "--sdk-root=$flutter_patched_sdk",
    rebase_path(main_dart),
  ]

  inputs = frontend_server_files
}

# For flutter/flutter#36738 we make the source files available so that
# we can generate a local frontend_server snapshot in the tools cache.
action("package_incremental_compiler") {
  script = "//flutter/flutter_frontend_server/package_incremental.py"

  inputs = frontend_server_files

  outputs = [
    "$root_gen_dir/dart-pkg/flutter_frontend_server/pubspec.yaml",
    "$root_gen_dir/dart-pkg/vm/pubspec.yaml",
    "$root_gen_dir/dart-pkg/build_integration/pubspec.yaml",
    "$root_gen_dir/dart-pkg/front_end/pubspec.yaml",
    "$root_gen_dir/dart-pkg/kernel/pubspec.yaml",
    "$root_gen_dir/dart-pkg/dev_compiler/pubspec.yaml",
    "$root_gen_dir/dart-pkg/frontend_server/pubspec.yaml",
  ]

  args = [
    "--input-root=" + rebase_path("//third_party/dart/pkg"),
    "--output-root=" + rebase_path("$root_gen_dir/dart-pkg"),
    "--frontend-server=" + rebase_path("//flutter"),
  ]
}
