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

group("runtime_kernel") {
  if (is_fuchsia || is_fuchsia_host) {
    # Fuchsia has run_vm_tests marked testonly.
    testonly = true
  }
  deps = [
    ":runtime",
    "runtime/vm:kernel_platform_files($dart_host_toolchain)",

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

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