# 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/bin:process_test",
    "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",
  ]
}
