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

      input = "$target_gen_dir/dart_test_tree.manifest"
      inputs = [
        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"),
        "--compress",
      ]
    }
  }
}
