# 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/build/dart/rules.gni")
import("//flutter/lib/ui/dart_ui.gni")
import("//third_party/dart/sdk_nnbd/lib/_http/http_sources.gni")
import(
    "//third_party/dart/sdk_nnbd/lib/_internal/js_runtime/interceptors_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/async/async_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/collection/collection_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/convert/convert_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/core/core_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/developer/developer_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/ffi/ffi_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/html/html_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/internal/internal_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/io/io_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/isolate/isolate_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/js/js_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/js_util/js_util_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/math/math_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/typed_data/typed_data_sources.gni")
import("//third_party/dart/sdk_nnbd/lib/wasm/wasm_sources.gni")

if (!is_fuchsia) {
  copy("copy_sky_engine_authors") {
    sources = [
      "//AUTHORS",
    ]

    outputs = [
      "$root_gen_dir/dart-pkg/sky_engine/{{source_file_part}}",
    ]
  }
}

dart_sdk_nnbd_lib_path = rebase_path("//third_party/dart/sdk_nnbd/lib")

copy("async") {
  lib_path = rebase_path("async", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(async_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/async/{{source_file_part}}",
  ]
}

copy("collection") {
  lib_path = rebase_path("collection", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(collection_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/collection/{{source_file_part}}",
  ]
}

copy("convert") {
  lib_path = rebase_path("convert", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(convert_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/convert/{{source_file_part}}",
  ]
}

copy("core") {
  lib_path = rebase_path("core", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(core_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/core/{{source_file_part}}",
  ]
}

copy("developer") {
  lib_path = rebase_path("developer", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(developer_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/developer/{{source_file_part}}",
  ]
}

copy("_http") {
  lib_path = rebase_path("_http", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(http_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/_http/{{source_file_part}}",
  ]
}

copy("_interceptors") {
  lib_path = rebase_path("_internal/js_runtime", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(interceptors_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/_interceptors/{{source_file_part}}",
  ]
}

copy("internal") {
  lib_path = rebase_path("internal", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(internal_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/internal/{{source_file_part}}",
  ]
}

copy("io") {
  lib_path = rebase_path("io", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(io_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/io/{{source_file_part}}",
  ]
}

copy("ffi") {
  lib_path = rebase_path("ffi", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(ffi_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/ffi/{{source_file_part}}",
  ]
}

copy("html") {
  lib_path = rebase_path("html", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(html_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/html/{{source_file_part}}",
  ]
}

copy("isolate") {
  lib_path = rebase_path("isolate", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(isolate_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/isolate/{{source_file_part}}",
  ]
}

copy("js") {
  lib_path = rebase_path("js", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(js_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/js/{{source_file_part}}",
  ]
}

copy("js_util") {
  lib_path = rebase_path("js_util", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(js_util_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/js_util/{{source_file_part}}",
  ]
}

copy("math") {
  lib_path = rebase_path("math", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(math_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/math/{{source_file_part}}",
  ]
}

copy("typed_data") {
  lib_path = rebase_path("typed_data", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(typed_data_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/typed_data/{{source_file_part}}",
  ]
}

copy("wasm") {
  lib_path = rebase_path("wasm", "", dart_sdk_nnbd_lib_path)
  sources = rebase_path(wasm_sdk_sources, "", lib_path)
  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/wasm/{{source_file_part}}",
  ]
}

copy("copy_dart_ui") {
  sources = dart_ui_files

  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/ui/{{source_file_part}}",
  ]
}

copy("copy_allowed_experiments") {
  sources = [
    "//third_party/dart/sdk_nnbd/lib/_internal/allowed_experiments.json",
  ]

  outputs = [
    "$root_gen_dir/dart-pkg/sky_engine/lib/_internal/allowed_experiments.json",
  ]
}

group("copy_dart_sdk") {
  deps = [
    ":_http",
    ":_interceptors",
    ":async",
    ":collection",
    ":convert",
    ":copy_allowed_experiments",
    ":core",
    ":developer",
    ":ffi",
    ":html",
    ":internal",
    ":io",
    ":isolate",
    ":js",
    ":js_util",
    ":math",
    ":typed_data",
    ":wasm",
  ]
}

dart_pkg("sky_engine") {
  sources = [
    "LICENSE",
    "README.md",
    "lib/_embedder.yaml",
    "lib/_empty.dart",
    "pubspec.yaml",
  ]

  deps = [
    ":copy_dart_sdk",
    ":copy_dart_ui",
  ]

  if (!is_fuchsia) {
    deps += [ ":copy_sky_engine_authors" ]
  }

  service_isolate_dir = "//third_party/dart/sdk_nnbd/lib/_internal/vm/bin/"
  sdk_ext_directory = "$root_gen_dir/sky/bindings"
  sdk_ext_files = [
    "$service_isolate_dir/vmservice_io.dart",
    "$service_isolate_dir/vmservice_server.dart",
  ]
}
