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

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

group("create_platform_sdk") {
  public_deps = [ "sdk: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" ]
}

if (is_fuchsia) {
  import("third_party/fuchsia/sdk/linux/build/component.gni")
  import("third_party/fuchsia/sdk/linux/build/package.gni")

  fuchsia_component("dart_sdk_fuchsia_test_component") {
    testonly = true
    data_deps = [ "runtime/bin:dart" ]
    manifest = "build/fuchsia/dart.cmx"

    resource_files = [
      ".packages",
    ]
    resource_dirs = [
      "tests/standalone",
      "pkg/async_helper",
      "pkg/expect",
      "pkg/meta",
      "pkg/smith",
      "third_party/pkg/args",
      "third_party/pkg/async",
      "third_party/pkg/collection",
      "third_party/pkg/path",
      "third_party/pkg/pool",
      "third_party/pkg/stack_trace",
    ]

    resources = []
    foreach(file, resource_files) {
      resources += [{
        path = file
        dest = "data/" + file
      }]
    }
    resources += exec_script(
        "tools/fuchsia/find_resources.py", resource_dirs, "json")
  }

  fuchsia_package("dart_sdk_fuchsia_test_package") {
    testonly = true
    deps = [ ":dart_sdk_fuchsia_test_component" ]
  }
}
