# 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/dart_action.gni")

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

# Template to generate a patched_sdk folder.
#
# 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")

  prebuilt_dart_action(target_name) {
    forward_variables_from(invoker, [
      "deps",
    ])

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

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

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