# 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("sdk_args.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 (defined(checkout_llvm) && 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:entrypoints_verification_test_extension",
    "runtime/bin:ffi_test_dynamic_library",
    "runtime/bin:ffi_test_functions",
    "runtime/bin:process_test",
    "runtime/bin:run_vm_tests",
    "runtime/bin:sample_extension",
    "runtime/bin:test_extension",
    "runtime/vm:kernel_platform_files($host_toolchain)",
    "utils/kernel-service:kernel-service",
  ]

  # TODO(bkonyi): this dep causes a segfault on Android XARM_X64 builds.
  # See issue #41776.
  if (dart_target_arch != "arm") {
    deps += [ "utils/dartdev:dartdev" ]
  }
}

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

if (dont_use_nnbd) {
  group("create_sdk") {
    public_deps = [ "sdk:create_sdk" ]
  }
} else {
  group("create_sdk") {
    public_deps = [ "sdk_nnbd:create_sdk" ]
  }
}

if (dont_use_nnbd) {
  group("create_platform_sdk") {
    public_deps = [ "sdk:create_platform_sdk" ]
  }
} else {
  group("create_platform_sdk") {
    public_deps = [ "sdk_nnbd:create_platform_sdk" ]
  }
}

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

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

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

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

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

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

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

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

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