# 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("dart2wasm") {
  deps = [
    ":runtime_precompiled",
    "utils/dart2wasm:compile_dart2wasm_platform",
    "utils/dart2wasm:dart2wasm_asserts_snapshot",
    "utils/dart2wasm:dart2wasm_snapshot",
    "utils/dart2wasm:test_wasm_modules",
  ]
}

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