# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Creates a symlink.
# Args:
#   source: Path to link to.
#   output: Where to create the symlink.
template("symlink") {
  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "data_deps",
                             "deps",
                             "testonly",
                             "visibility",
                           ])
    outputs = [
      invoker.output,
    ]
    script = "//build/symlink.py"
    args = [
      "-f",
      rebase_path(invoker.source, get_path_info(invoker.output, "dir")),
      rebase_path(invoker.output, root_build_dir),
    ]
  }
}

# Creates a symlink from root_build_dir/target_name to |binary_label|. This rule
# is meant to be used within if (current_toolchain == default_toolchain) blocks
# and point to targets in the non-default toolchain.
# Note that for executables, using a copy (as opposed to a symlink) does not
# work when is_component_build=true, since dependent libraries are found via
# relative location.
#
# Args:
#   binary_label: Target that builds the file to symlink to. e.g.:
#       ":$target_name($host_toolchain)".
#   binary_output_name: The output_name set by the binary_label target
#       (if applicable).
#   output_name: Where to create the symlink
#       (default="$root_out_dir/$binary_output_name").
#
# Example:
#   if (current_toolchain == host_toolchain) {
#     executable("foo") { ... }
#   } else if (current_toolchain == default_toolchain) {
#     binary_symlink("foo") {
#       binary_label = ":foo($host_toolchain)"
#     }
#   }
template("binary_symlink") {
  symlink(target_name) {
    forward_variables_from(invoker,
                           [
                             "output",
                             "testonly",
                             "visibility",
                           ])
    deps = [
      invoker.binary_label,
    ]
    data_deps = [
      invoker.binary_label,
    ]
    if (defined(invoker.data_deps)) {
      data_deps += invoker.data_deps
    }

    _out_dir = get_label_info(invoker.binary_label, "root_out_dir")
    if (defined(invoker.binary_output_name)) {
      _name = invoker.binary_output_name
    } else {
      _name = get_label_info(invoker.binary_label, "name")
    }
    source = "$_out_dir/$_name"

    _output_name = _name
    if (defined(invoker.output_name)) {
      _output_name = invoker.output_name
    }
    output = "$root_out_dir/$_output_name"
  }
}
