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

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",
    "runtime/bin:ffi_test_dynamic_library",
    "runtime/bin:ffi_test_functions",
    "runtime/bin:process_test",
    "runtime/bin:run_vm_tests",
    "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",
    ]
  }

  # We do not support AOT on ia32 and should therefore not provide native
  # snapshot tooling.
  if (dart_target_arch != "ia32" && dart_target_arch != "x86") {
    if (dart_runtime_mode == "release") {
      deps += [ "runtime/bin:analyze_snapshot_product" ]
    } else {
      deps += [ "runtime/bin:analyze_snapshot" ]
    }
  }

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

# 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/${host_os}/build/component.gni")
  import("third_party/fuchsia/sdk/${host_os}/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" ]
  }
}
