# 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_precompiled") {
  deps = [
    "runtime/bin:dart_bootstrap($host_toolchain)",
    "runtime/bin:dart_precompiled_runtime",
    "runtime/vm:patched_sdk",
  ]
}

group("runtime_and_noopt") {
  if (defined(is_fuchsia) && (is_fuchsia || is_fuchsia_host)) {
    testonly = true
  }
  deps = [
    "runtime/bin:dart",
    "runtime/bin:dart_bootstrap($host_toolchain)",
    "runtime/bin:dart_noopt",
    "runtime/bin:process_test",
    "runtime/bin:run_vm_tests",
    "runtime/bin:sample_extension",
    "runtime/bin:test_extension",
    "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"),
  ]
}

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