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

# Wraps a target and any of its arguments to an executable script.
#
# Many executable targets have build-time-constant arguments. This
# template allows those to be wrapped into a single, user- or bot-friendly
# script at build time.
#
# Paths to be wrapped should be relative to root_build_dir and should be
# wrapped in "@WrappedPath(...)"; see Example below.
#
# Variables:
#   generator_script: Path to the script to use to perform the wrapping.
#     Defaults to //build/util/generate_wrapper.py. Generally should only
#     be set by other templates.
#   wrapper_script: Output path.
#   executable: Path to the executable to wrap. Can be a script or a
#     build product. Paths can be relative to the containing gn file
#     or source-absolute.
#   executable_args: List of arguments to write into the wrapper.
#   use_vpython3: If true, invoke the generated wrapper with vpython3 instead
#     of vpython.
#
# Example wrapping a checked-in script:
#   generate_wrapper("sample_wrapper") {
#     executable = "//for/bar/sample.py"
#     wrapper_script = "$root_build_dir/bin/run_sample"
#
#     _sample_argument_path = "//sample/$target_cpu/lib/sample_lib.so"
#     _rebased_sample_argument_path = rebase_path(
#         _sample_argument_path,
#         root_build_dir)
#     executable_args = [
#       "--sample-lib", "@WrappedPath(${_rebased_sample_argument_path})",
#     ]
#   }
#
# Example wrapping a build product:
#   generate_wrapper("sample_wrapper") {
#     executable = "$root_build_dir/sample_build_product"
#     wrapper_script = "$root_build_dir/bin/run_sample_build_product"
#   }
template("generate_wrapper") {
  _generator_script = "//build/util/generate_wrapper.py"
  if (defined(invoker.generator_script)) {
    _generator_script = invoker.generator_script
  }
  _executable_to_wrap = invoker.executable
  _wrapper_script = invoker.wrapper_script
  if (is_win) {
    _wrapper_script += ".bat"
  }
  if (defined(invoker.executable_args)) {
    _wrapped_arguments = invoker.executable_args
  } else {
    _wrapped_arguments = []
  }

  action(target_name) {
    forward_variables_from(invoker,
                           TESTONLY_AND_VISIBILITY + [
                                 "data",
                                 "data_deps",
                                 "deps",
                                 "sources",
                               ])
    script = _generator_script
    if (!defined(data)) {
      data = []
    }
    data += [ _wrapper_script ]
    outputs = [ _wrapper_script ]

    _rebased_executable_to_wrap =
        rebase_path(_executable_to_wrap, root_build_dir)
    _rebased_wrapper_script = rebase_path(_wrapper_script, root_build_dir)
    if (is_win) {
      _script_language = "batch"
    } else {
      _script_language = "bash"
    }
    args = [
      "--executable",
      "@WrappedPath(${_rebased_executable_to_wrap})",
      "--wrapper-script",
      _rebased_wrapper_script,
      "--output-directory",
      rebase_path(root_build_dir, root_build_dir),
      "--script-language",
      _script_language,
    ]

    if (defined(invoker.use_vpython3) && invoker.use_vpython3) {
      args += [ "--use-vpython3" ]
    }
    args += [ "--" ]
    args += _wrapped_arguments

    if (defined(invoker.write_runtime_deps)) {
      write_runtime_deps = invoker.write_runtime_deps
    }
  }
}
