# 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")
import("../sdk_args.gni")

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

template("compile_platform") {
  assert(defined(invoker.libraries_specification_uri),
         "Need 'libraries_specification_uri' in $target_name")
  assert(defined(invoker.outputs), "Need 'outputs' in $target_name")
  assert(defined(invoker.args), "Need 'args' in $target_name")
  if (defined(invoker.single_root_scheme)) {
    assert(defined(invoker.single_root_base),
           "Need 'single_root_base' in $target_name")
  }
  if (defined(invoker.single_root_base)) {
    assert(defined(invoker.single_root_scheme),
           "Need 'single_root_scheme' in $target_name")
  }
  assert(!defined(invoker.script), "Remove 'script' from $target_name")
  assert(!defined(invoker.depfile), "Remove 'depfile' from $target_name")

  # In order to automatically compute dependencies, we need to add a dependency
  # on vm_outline.dill. This is used to include the source code of Fasta itself
  # in the dependency file. Without this, a change to Fasta wouldn't cause the
  # platform dill files to be rebuilt.  However, when building
  # vm_outline.dill, we shouldn't list it as a dependency as this would
  # lead to cyclic dependencies.
  add_implicit_vm_platform_dependency = true
  if (defined(invoker.add_implicit_vm_platform_dependency)) {
    add_implicit_vm_platform_dependency =
        invoker.add_implicit_vm_platform_dependency
  }

  outline = "vm_outline.dill"
  if (defined(invoker.outline)) {
    outline = invoker.outline
  }

  if (precompile_tools) {
    action(target_name) {
      if (defined(invoker.pool)) {
        pool = invoker.pool
      }

      outputs = invoker.outputs

      compile_platform_tool = "//utils:compile_platform.exe($host_toolchain)"

      deps = [ compile_platform_tool ]
      if (defined(invoker.deps)) {
        deps += invoker.deps
      }

      inputs = []
      if (defined(invoker.inputs)) {
        inputs += invoker.inputs
      }

      if (add_implicit_vm_platform_dependency) {
        inputs += [ "$root_out_dir/$outline" ]
        deps += [ "$_dart_root/runtime/vm:vm_platform" ]
      }

      depfile = outputs[0] + ".d"

      script = "$_dart_root/build/gn_run_binary.py"
      args = [
        "compiled_action",
        rebase_path(get_label_info(compile_platform_tool, "root_out_dir") +
                        "/compile_platform.exe",
                    root_build_dir),
      ]
      args += invoker.args
      if (defined(invoker.single_root_scheme)) {
        args += [ "--single-root-scheme=" + invoker.single_root_scheme ]
      }
      if (defined(invoker.single_root_base)) {
        args += [ "--single-root-base=" + invoker.single_root_base ]
      }
      if (defined(invoker.single_root_scheme)) {
        args += [ invoker.libraries_specification_uri ]
      } else {
        args +=
            [ rebase_path(invoker.libraries_specification_uri, root_build_dir) ]
      }
      args += [ rebase_path("$root_out_dir/$outline", root_build_dir) ]
      args += rebase_path(outputs, root_build_dir)
    }
  } else {
    prebuilt_dart_action(target_name) {
      if (defined(invoker.pool)) {
        pool = invoker.pool
      }
      script = "$_dart_root/pkg/front_end/tool/compile_platform.dart"

      packages = "$_dart_root/.dart_tool/package_config.json"

      outputs = invoker.outputs

      vm_args = [ "-Dsdk_hash=$sdk_hash" ]

      inputs = []
      deps = []
      args = []
      if (defined(invoker.deps)) {
        deps += invoker.deps
      }

      if (defined(invoker.inputs)) {
        inputs += invoker.inputs
      }

      if (add_implicit_vm_platform_dependency) {
        inputs += [ "$root_out_dir/$outline" ]
        deps += [ "$_dart_root/runtime/vm:vm_platform" ]
      }
      depfile = outputs[0] + ".d"

      args += invoker.args
      if (defined(invoker.single_root_scheme)) {
        args += [ "--single-root-scheme=" + invoker.single_root_scheme ]
      }
      if (defined(invoker.single_root_base)) {
        args += [ "--single-root-base=" + invoker.single_root_base ]
      }
      if (defined(invoker.single_root_scheme)) {
        args += [ invoker.libraries_specification_uri ]
      } else {
        args +=
            [ rebase_path(invoker.libraries_specification_uri, root_build_dir) ]
      }
      args += [ rebase_path("$root_out_dir/$outline", root_build_dir) ]
      args += rebase_path(outputs, root_build_dir)
    }
  }
}
