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

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

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