# 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"
  }
}
