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

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

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 = [
        "runtime/bin:dart",
        "runtime/bin:run_vm_tests",
        "runtime/bin:process_test",
        ":generate_dart_test_manifest",
      ]

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