# Copyright (c) 2017, 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.

import("../build/dart_host_sdk_toolchain.gni")
import("../build/prebuilt_dart_sdk.gni")

_dart_root = get_path_info("..", "abspath")

# Template to generate a patched_sdk folder. This invokes the tools/patch_sdk.py
# script and sets up the right dependencies.
#
# This template expects four arguments:
#   - mode: vm or dart2js (whether to build an sdk for the vm or for dart2js)
#   - input_patches_dir: directory containing the input library files.
#   - patched_sdk_dir: the output location
#   - deps: extra dependencies that must be built ahead of time.
template("generate_patched_sdk") {
  assert(defined(invoker.input_patches_dir),
         "Need input_patches_dir in $target_name")
  assert(defined(invoker.patched_sdk_dir),
         "Need patched_sdk_dir in $target_name")
  assert(defined(invoker.mode), "Need mode in $target_name")
  action(target_name) {
    if (defined(invoker.deps)) {
      deps = invoker.deps
    } else {
      deps = []
    }

    if (!prebuilt_dart_exe_works) {
      deps += [ "$_dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)" ]
    }

    script = "$_dart_root/tools/patch_sdk.py"

    # We list the `patch_sdk.dart` tool here because the [script] (which is
    # implicitly an input) will call it.
    inputs = [
      "$_dart_root/tools/patch_sdk.dart",
    ]

    depfile = "$root_out_dir/${target_name}.d"

    if (defined(invoker.outputs)) {
      outputs = invoker.outputs
    } else {
      outputs = [
        # Instead of listing all outputs we list those consumed by
        # other BUILD rules.
        "$root_out_dir/${invoker.patched_sdk_dir}/platform.dill",
        "$root_out_dir/${invoker.patched_sdk_dir}/outline.dill",
      ]
    }

    args = [ "--quiet" ]
    if (!prebuilt_dart_exe_works) {
      dart_out_dir = get_label_info(
              "$_dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)",
              "root_out_dir")
      dart_bootstrap =
          rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")
      args += [
        "--dart-executable",
        dart_bootstrap,
      ]
    }
    args += [
      invoker.mode,
      rebase_path("$_dart_root/sdk"),
      rebase_path(invoker.input_patches_dir),
      rebase_path("$root_out_dir/${invoker.patched_sdk_dir}", root_build_dir),
      rebase_path("$_dart_root/.packages"),
    ]
  }
}
