# 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",
  ]
}

# This rule and the compressed_observatory_archive rule are for the Fuchsia
# bots that pre-build the Observatory. They copy the observatory tar files to
# the root build output directory for convenient access by the Fuchsia buildbot
# scripts.
group("observatory_archive") {
  deps = [
    "runtime/observatory:copy_observatory_archive",
  ]
}

group("compressed_observatory_archive") {
  deps = [
    "runtime/observatory:copy_compressed_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",
    ]
  }
}
