# 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/config/gclient_args.gni")
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",
  ]
  if (checkout_llvm) {
    deps += [
      ":llvm_codegen"
    ]
  }
}

group("most") {
  import("runtime/runtime_args.gni")
  if (targetting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":create_sdk",
    ":dart2js",
    ":dartanalyzer",
    ":dartdevc",
    ":runtime",
    ":samples",
  ]
  if (dart_target_arch != "arm") {
    deps += [ ":analysis_server" ]
  }
}

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

  if (targetting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    "runtime/bin:dart",
    "runtime/bin:process_test",
    "runtime/bin:run_vm_tests",
    "runtime/bin:sample_extension",
    "runtime/bin:test_extension",
    "runtime/bin:entrypoints_verification_test_extension",
    "runtime/bin:ffi_test_dynamic_library",
    "runtime/bin:ffi_test_functions",
    "runtime/vm:kernel_platform_files($host_toolchain)",
    "utils/kernel-service:kernel-service",
  ]
}

group("runtime_kernel") {
  if (targetting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":runtime",
  ]
}

group("runtime_precompiled") {
  deps = [
    "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",
  ]
}

group("check_llvm") {
  if (checkout_llvm) {
    deps = [
      "runtime/llvm_codegen/test",
    ]
  }
}

group("llvm_codegen") {
  if (checkout_llvm) {
    deps = [
      "runtime/llvm_codegen/codegen",
      "runtime/llvm_codegen/bit",
    ]
  }
}

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