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

    packages_file = "$mkbootfs_gen/packages"

    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 = [
      "--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(magenta_bootdata),
    ]
    args += read_file(packages_file, "list lines")
  }
}
