# 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") {
  deps = [
    ":runtime",
  ]
}

group("most") {
  deps = [
    ":analysis_server",
    ":create_sdk",
    ":dart2js",
    ":dartanalyzer",
    ":dartdevc",
    ":runtime",
    ":samples",
  ]
}

group("runtime") {
  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") {
  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",
                              [ rebase_path("sdk/lib") ],
                              "list lines")

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

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

  inputs = rebase_path(sdk_lib_files, "", "sdk/lib") +
           rebase_path(preamble_files, "", "sdk/lib") +
           rebase_path(sdk_bin_files, "", "sdk/bin") +
           [
             "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",
  ]
}
