# Copyright 2017 The Fuchsia 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/dart/fidl_move.gni")
import("//build/dart/toolchain.gni")
import("//build/toolchain/basic_toolchain.gni")
import("//build/toolchain/concurrent_jobs.gni")

declare_args() {
  # Maximum number of Dart processes to run in parallel.
  #
  # Dart analyzer uses a lot of memory which may cause issues when building
  # with many parallel jobs e.g. when using goma. To avoid out-of-memory
  # errors we explicitly reduce the number of jobs.
  concurrent_dart_jobs = default_concurrent_jobs.dart
}

# TODO(fxb/58062): Delete after all packages are migrated away from dart_app
# and flutter_app.
group("deprecated_dart_app_allowlist") {
  #  ________  _________  ________  ________
  # |\   ____\|\___   ___\\   __  \|\   __  \
  # \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
  #  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
  #   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
  #     ____\_\  \   \ \__\ \ \_______\ \__\
  #    |\_________\   \|__|  \|_______|\|__|
  #    \|_________|
  # This is an allowlist of packages that have not migrated to use dart_component.
  # This is only intended to be used as a temporary allowlist. Do not add to this list.
  allowlist = [
    "//examples/diagnostics/inspect/codelab/dart/client:bin",
    "//examples/diagnostics/inspect/codelab/dart/fizzbuzz:bin",
    "//examples/diagnostics/inspect/codelab/dart/part_1:bin",
    "//examples/diagnostics/inspect/codelab/dart/part_2:bin",
    "//examples/diagnostics/inspect/codelab/dart/part_3:bin",
    "//examples/diagnostics/inspect/codelab/dart/part_4:bin",
    "//examples/diagnostics/inspect/codelab/dart/part_5:bin",
    "//examples/fidl/dart/client:echo-dart-client",
    "//examples/fidl/dart/request_pipelining/client:echo-launcher-dart-client",
    "//examples/fidl/dart/request_pipelining/server:echo-launcher-dart-server",
    "//examples/fidl/dart/server:echo-dart-server",
    "//src/diagnostics/validator/logs/encoding/puppet/dart:log-validator-dart-puppet",
    "//src/tests/intl/timestamp-server-dart:timestamp-server-dart",
    get_label_info(dart_package_label.fuchsia_inspect, "dir") +
        "/test/integration:dart-inspect-vmo-test-writer",
    get_label_info(dart_package_label.fuchsia_inspect, "dir") +
        "/test/validator_puppet:dart-inspect-validator-puppet",
    "//topaz/public/dart/fuchsia_modular/examples/fibonacci_agent:fibonacci-agent",
    get_label_info(dart_package_label.fuchsia_services, "dir") +
        "/test_support:fuchsia-services-foo-test-server",
    "//topaz/tests/dart-inspect-benchmarks:dart-inspect-benchmarks",
  ]

  visibility = []
  foreach(target, allowlist) {
    visibility += [
      target,
      target + "_manifest_dist",
      target + "_manifest_dist_generate",
      target + "_component_manifests",
    ]
  }
}

# Copies the patched SDK files for the dart runner
copy("platform_files") {
  sources = [
    "//prebuilt/third_party/flutter/$target_cpu/release/aot/dart_runner_patched_sdk/platform_strong.dill",
    "//prebuilt/third_party/flutter/$target_cpu/release/aot/dart_runner_patched_sdk/platform_strong.dill.d",
    "//prebuilt/third_party/flutter/$target_cpu/release/aot/dart_runner_patched_sdk/vm_outline_strong.dill",
  ]
  outputs = [ "$root_out_dir/dart_runner_patched_sdk/{{source_file_part}}" ]
}

if (current_toolchain == dart_toolchain) {
  pool("dart_pool") {
    depth = concurrent_dart_jobs
  }
} else {
  # A toolchain dedicated to processing and analyzing Dart packages.
  # The only targets in this toolchain are action() targets, so it
  # has no real tools.  But every toolchain needs stamp and copy.
  basic_toolchain("dartlang") {
    expected_label = dart_toolchain
  }
}
