# Copyright 2015 The Chromium Authors
# 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),
    ]
    if (defined(invoker.touch) && invoker.touch) {
      args += [ "--touch=" + rebase_path(invoker.source, 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"
  }
}
