# 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.

default_dart_root = rebase_path("../..")

# This build rule will copy the source for one Dart SDK library.
#
# Required arguments:
#   sdk_lib_name
#       The name of a Dart SDK library.
#
# Optional arguments:
#   destination
#       Base path to copy sources. Default value is "$root_gen_dir/dart_sdk".
#
#   dart_root
#       Path to the Dart SDK source root. Default value is "../..".
#
# The sources will be copied into $root_gen_dir/dart_sdk/$sdk_lib_name/.
#
template("dart_sdk_lib_copy") {
  assert(defined(invoker.sdk_lib_name))
  if (defined(invoker.dart_root)) {
    dart_root = rebase_path(invoker.dart_root)
  } else {
    dart_root = default_dart_root
  }
  if (defined(invoker.destination)) {
    destination = invoker.destination
  } else {
    destination = "$root_gen_dir/dart_sdk"
  }
  dart_sdk_sdk_lib_path = rebase_path("sdk/lib", "", dart_root)
  dart_sdk_tools_gypi_to_gn_path =
      rebase_path("tools/gypi_to_gn.py", "", dart_root)

  # The name of the SDK library being copied.
  lib_name = invoker.sdk_lib_name

  # The path to the libraries source directory.
  lib_path = rebase_path(lib_name, "", dart_sdk_sdk_lib_path)

  # The path to the sources gypi.
  lib_sources_gypi = lib_name + "_sources.gypi"

  # Get the contents of the gypi file.
  sdk_lib_sources_gypi =
      exec_script(dart_sdk_tools_gypi_to_gn_path,
                  [ rebase_path(lib_sources_gypi, "", lib_path) ],
                  "scope",
                  [ rebase_path(lib_sources_gypi, "", lib_path) ])
  copy(target_name) {
    sources = rebase_path(sdk_lib_sources_gypi.sources, "", lib_path)
    outputs = [
      "$destination/$lib_name/{{source_file_part}}",
    ]
  }
}
