# Copyright 2019 The Chromium Authors
# 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.
#
# 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") {
  action(target_name) {
    if (defined(invoker.generator_script)) {
      script = invoker.generator_script
    } else {
      script = "//build/util/generate_wrapper.py"
    }
    _wrapper_script = invoker.wrapper_script
    if (is_win) {
      _wrapper_script += ".bat"
    }

    data = [
      _wrapper_script,
      "//.vpython3",
    ]
    if (defined(invoker.data)) {
      data += invoker.data
    }
    outputs = [ _wrapper_script ]

    _rebased_executable_to_wrap =
        rebase_path(invoker.executable, 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.executable_args)) {
      args += [ "--" ] + invoker.executable_args
    }

    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
    forward_variables_from(invoker,
                           "*",
                           TESTONLY_AND_VISIBILITY + [
                                 "data",
                                 "executable",
                                 "executable_args",
                                 "generator_script",
                                 "wrapper_script",
                               ])
  }
}
