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

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

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