# 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.

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

group("most") {
  if (defined(is_fuchsia) && (is_fuchsia || is_fuchsia_host)) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":analysis_server",
    ":create_sdk",
    ":dart2js",
    ":dartanalyzer",
    ":dartdevc",
    ":runtime",
    ":samples",
  ]
}

group("runtime") {
  if (defined(is_fuchsia) && (is_fuchsia || is_fuchsia_host)) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    "runtime/bin:dart",
    "runtime/bin:dart_bootstrap($host_toolchain)",
    "runtime/bin:process_test",
    "runtime/bin:run_vm_tests",
    "runtime/bin:sample_extension",
    "runtime/bin:test_extension",
    "runtime/vm:patched_sdk",
  ]
}

group("runtime_kernel") {
  if (defined(is_fuchsia) && (is_fuchsia || is_fuchsia_host)) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":runtime",

    # TODO(rmacnak): Link this into 'dart'.
    "utils/kernel-service:kernel-service",
  ]
}

group("runtime_precompiled") {
  deps = [
    "runtime/bin:dart_bootstrap($host_toolchain)",
    "runtime/bin:dart_precompiled_runtime",
    "runtime/bin:process_test",
    "runtime/vm:patched_sdk",
  ]
}

group("create_sdk") {
  deps = [
    "sdk:create_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",
  ]
}

# The rules below build a qemu Fuchsia OS image that includes the Dart tree
# under /system/test/dart. Building this image is gated by the GN argument
# 'dart_build_fuchsia_test_image' because building the image is slow.
if (defined(is_fuchsia) && is_fuchsia) {
  declare_args() {
    dart_build_fuchsia_test_image = false
  }

  if (dart_build_fuchsia_test_image) {
    action("generate_dart_test_manifest") {
      testonly = true

      deps = [
        "//packages/gn:mkbootfs",
      ]

      output_prefix = "$target_gen_dir/dart_test_tree"
      outputs = [
        "$output_prefix.manifest",
      ]

      mode = "release"
      if (is_debug) {
        mode = "debug"
      }

      mkbootfs_gen = get_label_info("//packages/gn:mkbootfs", "target_gen_dir")
      user_manifest = "$mkbootfs_gen/user.bootfs.manifest"

      script = "tools/gen_fuchsia_test_manifest.py"
      args = [
        "-m",
        mode,
        "-u",
        rebase_path(user_manifest),
        "-o",
        rebase_path(output_prefix),
      ]
    }

    action("generate_dart_test_image") {
      testonly = true
      deps = [
        ":generate_dart_test_manifest",
        "runtime/bin:dart",
        "runtime/bin:process_test",
        "runtime/bin:run_vm_tests",
      ]

      # Compute path to magenta bootdata.bin
      if (current_cpu == "arm64") {
        magenta_bootdata =
            "//out/build-magenta/build-magenta-qemu-arm64/bootdata.bin"
      } else if (current_cpu == "x64") {
        magenta_bootdata =
            "//out/build-magenta/build-magenta-pc-x86-64/bootdata.bin"
      } else {
        assert(false, "unable to determine path to magenta's bootdata.bin")
      }

      input = "$target_gen_dir/dart_test_tree.manifest"
      inputs = [
        magenta_bootdata,
        input,
      ]

      output = "$root_out_dir/dart_test_tree.bin"
      outputs = [
        output,
      ]

      script = "//packages/gn/make_bootfs.py"
      args = [
        "--manifest",
        rebase_path(input),
        "--output-file",
        rebase_path(output),
        "--build-id-map",
        rebase_path("$target_gen_dir/build_id_map"),
        "--pre-binaries",
        rebase_path(magenta_bootdata),
      ]
    }
  }
}
