# 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/toolchain.gni")
import("//build/python/python_binary.gni")
import("//build/python/python_host_test.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
}

python_binary("run_analysis") {
  main_source = "run_analysis.py"
  deps = [ "//third_party/pyyaml:yaml" ]
}

python_binary("gen_meta_file") {
  main_source = "sdk/gen_meta_file.py"
  deps = [ "//third_party/pyyaml:yaml" ]
}

# 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/dart/fuchsia_modular/fibonacci_agent:fibonacci-agent",
    "//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",
    "//sdk/dart/fuchsia_inspect/test/integration:dart-inspect-vmo-test-writer",
    "//sdk/dart/fuchsia_inspect/test/validator_puppet:dart-inspect-validator-puppet",
    "//sdk/dart/fuchsia_services/test_support:fuchsia-services-foo-test-server",
    "//src/diagnostics/validator/logs/encoding/puppet/dart:log-validator-dart-puppet",
    "//src/tests/intl/timestamp-server-dart:timestamp-server-dart",
    "//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
  }
}

if (current_toolchain == default_toolchain) {
  # 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
  }
}

python_host_test("gen_reference_docs_test") {
  main_source = "gen_reference_docs_test.py"
  sources = [ "gen_reference_docs.py" ]
  libraries = [ "//third_party/pyyaml:yaml" ]
}

group("tests") {
  testonly = true
  deps = [
    ":gen_reference_docs_test($host_toolchain)",
    "tests",
  ]
}
