# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
# for details. 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/dart_host_sdk_toolchain.gni")

targetting_fuchsia = target_os == "fuchsia"

# This target will be built if no target is specified when invoking ninja.
group("default") {
  if (targetting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":runtime_kernel",
  ]
}

group("most") {
  if (targetting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":analysis_server",
    ":create_sdk",
    ":dart2js",
    ":dartanalyzer",
    ":dartdevc",
    ":runtime",
    ":samples",
  ]
}

group("runtime") {
  if (targetting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    "runtime/bin:dart",
    "runtime/bin:dart_bootstrap($host_toolchain)",
    "runtime/bin:process_test",
    "runtime/bin:run_vm_tests",
    "runtime/bin:sample_extension",
    "runtime/bin:test_extension",
  ]
}

group("runtime_kernel") {
  import("runtime/runtime_args.gni")

  target_supports_aot = dart_target_arch == "arm" || dart_target_arch == "arm64" || dart_target_arch == "x64"

  if (targetting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":runtime",
    "runtime/vm:kernel_platform_files($host_toolchain)",

    # TODO(rmacnak): Link this into 'dart'.
    "utils/kernel-service:copy_kernel_service_snapshot",
    "utils/kernel-service:kernel-service",
  ]

  if (target_supports_aot) {
    deps += ["runtime/bin:precompiler_entry_points_json"]
  }
}

group("runtime_precompiled") {
  deps = [
    "runtime/bin:dart_bootstrap($host_toolchain)",
    "runtime/bin:dart_precompiled_runtime",
    "runtime/bin:process_test",
  ]
}

group("create_sdk") {
  public_deps = [
    "sdk:create_sdk",
  ]
}

if (defined(dart_host_sdk_toolchain) &&
    dart_host_sdk_toolchain != host_toolchain) {
  group("create_host_sdk") {
    deps = [
      "sdk:create_sdk($dart_host_sdk_toolchain)",
    ]
  }
}

group("dart2js") {
  deps = [
    "utils/compiler:dart2js",
  ]
}

group("dartanalyzer") {
  deps = [
    "utils/dartanalyzer",
  ]
}

group("dartdevc") {
  deps = [
    "utils/dartdevc",
  ]
}

group("dartfmt") {
  deps = [
    "utils/dartfmt",
  ]
}

group("analysis_server") {
  deps = [
    "utils/analysis_server",
  ]
}

# This is the target that is built on the dart2js build bots.
# It must depend on anything that is required by the dart2js
# test suites.
group("dart2js_bot") {
  deps = [
    ":create_sdk",
  ]
}

group("samples") {
  deps = [
    "runtime/bin:sample_extension",
  ]
}

group("observatory_archive") {
  deps = [
    "runtime/observatory:observatory_archive"
  ]
}

# The rules below build a Fuchsia OS image that includes the Dart tree
# under /system/test/dart.  To get this into the `user.bootfs` generated
# by the Fuchsia build, add the GN build argument:
#   extra_bootdata = [ "//third_party/dart:dart_test_bootfs" ]
if (is_fuchsia) {
  import("//build/config/fuchsia/bootdata.gni")

  action("generate_dart_test_manifest") {
    testonly = true

    output_prefix = "$target_gen_dir/dart_test_tree"
    outputs = [
      "$output_prefix.manifest",
    ]

    mode = "release"
    if (is_debug) {
      mode = "debug"
    }

    script = "tools/gen_fuchsia_test_manifest.py"
    args = [
      "-m",
      mode,
      "-o",
      rebase_path(output_prefix),
    ]
  }

  bootdata("dart_test_bootfs") {
    testonly = true
    deps = [
      ":generate_dart_test_manifest",
      "runtime/bin:dart",
      "runtime/bin:process_test",
      "runtime/bin:run_vm_tests",
    ]
    inputs = [
      "$target_gen_dir/dart_test_tree.manifest",
    ]
  }
}
