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

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

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",
      "utils/dds:dds",
    ]
  }

  if (is_linux || is_android) {
    deps += [ "runtime/bin:abstract_socket_test" ]
  }
}

# A separate target and not included in group("runtime"). This way the target\
# "runtime" does not get many executables extra as build output.
group("run_ffi_unit_tests") {
  deps = [ "runtime/bin/ffi_unit_test:run_ffi_unit_tests" ]
}

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 (is_linux || is_android) {
    deps += [ "runtime/bin:abstract_socket_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("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" ]
}

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

  template("dart_fuchsia_test_package") {
    fuchsia_package(target_name) {
      package_name = invoker.package_name
      if (is_debug) {
        package_name += "_debug"
      } else if (is_release) {
        package_name += "_release"
      } else if (is_product) {
        package_name += "_product"
      }
      testonly = true
      deps = invoker.deps
    }
  }

  template("dart_fuchsia_test_component") {
    fuchsia_component(target_name) {
      testonly = true
      data_deps = [ "runtime/bin:dart" ]
      if (defined(invoker.data_deps)) {
        data_deps += invoker.data_deps
      }
      manifest = "build/fuchsia/dart.cmx"

      library_files = []
      if (defined(invoker.library_files)) {
        library_files += invoker.library_files
      }
      resource_files = [
        ".dart_tool/package_config.json",
        "pkg/testing/test/hello_test.dart",
        "tools/addlatexhash.dart",
      ]
      resource_dirs = invoker.resource_dirs

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

  dart_fuchsia_test_component("fuchsia_test_component") {
    resource_dirs = [
      "tests/standalone_2",
      "pkg/async_helper",
      "pkg/expect",
      "pkg/meta",
      "pkg/native_stack_traces",
      "pkg/smith",
      "third_party/pkg/args",
      "third_party/pkg/async",
      "third_party/pkg/charcode",
      "third_party/pkg/collection",
      "third_party/pkg/convert",
      "third_party/pkg/crypto",
      "third_party/pkg/http",
      "third_party/pkg/http_parser",
      "third_party/pkg/path",
      "third_party/pkg/pool",
      "third_party/pkg/stack_trace",
      "third_party/pkg/string_scanner",
      "third_party/pkg/typed_data",
    ]
  }

  dart_fuchsia_test_package("fuchsia_test_package") {
    package_name = "dart_test"
    deps = [ ":fuchsia_test_component" ]
  }

  dart_fuchsia_test_component("fuchsia_ffi_test_component") {
    data_deps = [
      "runtime/bin:ffi_test_dynamic_library",
      "runtime/bin:ffi_test_functions",
    ]
    library_files = [
      "libffi_test_dynamic_library.so",
      "libffi_test_functions.so",
    ]
    resource_dirs = [
      "pkg/expect",
      "pkg/meta",
      "tests/ffi",
      "third_party/pkg/ffi",
    ]
  }

  dart_fuchsia_test_package("fuchsia_ffi_test_package") {
    package_name = "dart_ffi_test"
    deps = [ ":fuchsia_ffi_test_component" ]
  }
}
