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

action("create_sdk") {
  deps = [
    "runtime/bin:dart",
    "utils/analysis_server",
    "utils/compiler:dart2js",
    "utils/compiler:utils_wrapper",
    "utils/dartanalyzer:generate_dartanalyzer_snapshot",
    "utils/dartanalyzer:generate_summary_spec",
    "utils/dartanalyzer:generate_summary_strong",
    "utils/dartdevc",
    "utils/dartdoc",
    "utils/dartfmt",
    "utils/pub",
  ]

  sdk_lib_files = exec_script("tools/list_dart_files.py",
                              [
                                "absolute",
                                rebase_path("sdk/lib"),
                              ],
                              "list lines")

  preamble_files =
      exec_script("tools/list_files.py",
                  [
                    "absolute",
                    "",
                    rebase_path("sdk/lib/_internal/js_runtime/lib/preambles"),
                  ],
                  "list lines")

  sdk_bin_files = exec_script("tools/list_files.py",
                              [
                                "absolute",
                                "",
                                rebase_path("sdk/bin"),
                              ],
                              "list lines")

  inputs = sdk_lib_files + preamble_files + sdk_bin_files + [
             "sdk/lib/dart_client.platform",
             "sdk/lib/dart_server.platform",
             "sdk/lib/dart_shared.platform",
             "$root_gen_dir/dart2js.dart.snapshot",
             "$root_gen_dir/utils_wrapper.dart.snapshot",
             "$root_gen_dir/pub.dart.snapshot",
             "$root_gen_dir/dartanalyzer.dart.snapshot",
             "$root_gen_dir/dartdevc.dart.snapshot",
             "$root_gen_dir/dartfmt.dart.snapshot",
             "$root_gen_dir/analysis_server.dart.snapshot",
             "$root_gen_dir/dartdoc.dart.snapshot",
             "$root_gen_dir/spec.sum",
             "$root_gen_dir/strong.sum",
             "tools/VERSION",
           ]

  outputs = [
    "$root_out_dir/dart-sdk/README",
  ]

  script = "tools/create_sdk.py"
  args = [
    "--sdk_output_dir",
    rebase_path("$root_out_dir/dart-sdk"),
    "--snapshot_location",
    rebase_path("$root_gen_dir"),
  ]
  if (defined(is_fuchsia) && is_fuchsia_host) {
    args += [ "--copy_libs" ]
  }
  if (defined(is_fuchsia) && (is_fuchsia || is_fuchsia_host)) {
    # The binaries are already stripped.
    args += [ "--disable_stripping" ]
  }
}

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),
      ]
    }
  }
}
