# 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")

targeting_fuchsia = target_os == "fuchsia"

# This target will be built if no target is specified when invoking ninja.
group("default") {
  if (targeting_fuchsia) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [ ":runtime" ]
}

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

group("runtime") {
  import("runtime/runtime_args.gni")

  if (targeting_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)",
    "samples/ffi/http:fake_http",
    "utils/dartdev:dartdev",
    "utils/dds:dds",
    "utils/kernel-service:kernel-service",
  ]

  # This flag is set in runtime/runtime_args.gni
  # The analyze_snapshot tool is only supported on 64 bit AOT builds running
  # under linux and android platforms
  if (build_analyze_snapshot) {
    deps += [
      # The `analyze_snapshot` tests require the `analyze_snapshot` as well as
      # `gen_snapshot` binaries.
      "runtime/bin:analyze_snapshot",
      "runtime/bin:analyze_snapshot($host_toolchain)",
      "runtime/bin:gen_snapshot",
      "runtime/bin:gen_snapshot($host_toolchain)",
    ]
  }

  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_platform") {
  deps = [
    ":runtime_precompiled",
    "utils/dart2wasm:compile_dart2wasm_js_compatibility_platform",
    "utils/dart2wasm:compile_dart2wasm_platform",
    "utils/dart2wasm:compile_dart2wasm_stringref_platform",
    "utils/dart2wasm:dart2wasm_snapshot",
  ]
  if (defined(is_product)) {
    if (is_product) {
      deps += [ "utils/dart2wasm:dart2wasm_product_snapshot" ]
    } else {
      deps += [ "utils/dart2wasm:dart2wasm_asserts_snapshot" ]
    }
  }
}

group("dart2wasm") {
  deps = [
    ":dart2wasm_platform",
    "utils/dart2wasm:test_wasm_modules",
  ]
}

group("dart2wasm_benchmark") {
  deps = [
    ":dart2wasm_platform",
    "third_party/binaryen:wasm-opt",
  ]
}

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

group("ddc") {
  deps = [ "utils/ddc: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 = invoker.manifest

      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") {
    manifest = "build/fuchsia/fuchsia_test_component.cmx"
    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") {
    manifest = "build/fuchsia/fuchsia_ffi_test_component.cmx"
    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" ]
  }

  # TODO(38752): Remove "cfv2" once everything is migrated to CFv2.
  dart_fuchsia_test_component("fuchsia_ffi_test_component_cfv2") {
    manifest = "build/fuchsia/fuchsia_ffi_test_component.cml"
    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_cfv2") {
    package_name = "dart_ffi_test_cfv2"
    deps = [ ":fuchsia_ffi_test_component_cfv2" ]
  }
}
