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