# 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/dart_host_toolchain.gni")

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

group("most") {
  if (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 (is_fuchsia || is_fuchsia_host) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    "runtime/bin:dart",
    "runtime/bin:dart_bootstrap($dart_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 (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($dart_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 Fuchsia OS image that includes the Dart tree
# under /system/test/dart.
if (is_fuchsia) {
  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")
    system_manifest = "$mkbootfs_gen/system.bootfs.manifest"

    script = "tools/gen_fuchsia_test_manifest.py"
    args = [
      "-m",
      mode,
      "-u",
      rebase_path(system_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",
    ]

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

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

    packages_file = "$mkbootfs_gen/packages"

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

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

    script = "//packages/gn/make_bootfs.py"
    args = [
      "--boot-manifest",
      rebase_path(boot_manifest),
      "--system-manifest",
      rebase_path(input),
      "--output-file",
      rebase_path(output),
      "--build-id-map",
      rebase_path("$target_gen_dir/build_id_map"),
      "--pre-binaries",
      rebase_path(zircon_bootdata),
    ]
    args += read_file(packages_file, "list lines")
  }
}
