xref: /aosp_15_r20/external/cronet/build/util/generate_wrapper.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker# Wraps a target and any of its arguments to an executable script.
6*6777b538SAndroid Build Coastguard Worker#
7*6777b538SAndroid Build Coastguard Worker# Many executable targets have build-time-constant arguments. This
8*6777b538SAndroid Build Coastguard Worker# template allows those to be wrapped into a single, user- or bot-friendly
9*6777b538SAndroid Build Coastguard Worker# script at build time.
10*6777b538SAndroid Build Coastguard Worker#
11*6777b538SAndroid Build Coastguard Worker# Paths to be wrapped should be relative to root_build_dir and should be
12*6777b538SAndroid Build Coastguard Worker# wrapped in "@WrappedPath(...)"; see Example below.
13*6777b538SAndroid Build Coastguard Worker#
14*6777b538SAndroid Build Coastguard Worker# Variables:
15*6777b538SAndroid Build Coastguard Worker#   generator_script: Path to the script to use to perform the wrapping.
16*6777b538SAndroid Build Coastguard Worker#     Defaults to //build/util/generate_wrapper.py. Generally should only
17*6777b538SAndroid Build Coastguard Worker#     be set by other templates.
18*6777b538SAndroid Build Coastguard Worker#   wrapper_script: Output path.
19*6777b538SAndroid Build Coastguard Worker#   executable: Path to the executable to wrap. Can be a script or a
20*6777b538SAndroid Build Coastguard Worker#     build product. Paths can be relative to the containing gn file
21*6777b538SAndroid Build Coastguard Worker#     or source-absolute.
22*6777b538SAndroid Build Coastguard Worker#   executable_args: List of arguments to write into the wrapper.
23*6777b538SAndroid Build Coastguard Worker#
24*6777b538SAndroid Build Coastguard Worker# Example wrapping a checked-in script:
25*6777b538SAndroid Build Coastguard Worker#   generate_wrapper("sample_wrapper") {
26*6777b538SAndroid Build Coastguard Worker#     executable = "//for/bar/sample.py"
27*6777b538SAndroid Build Coastguard Worker#     wrapper_script = "$root_build_dir/bin/run_sample"
28*6777b538SAndroid Build Coastguard Worker#
29*6777b538SAndroid Build Coastguard Worker#     _sample_argument_path = "//sample/$target_cpu/lib/sample_lib.so"
30*6777b538SAndroid Build Coastguard Worker#     _rebased_sample_argument_path = rebase_path(
31*6777b538SAndroid Build Coastguard Worker#         _sample_argument_path,
32*6777b538SAndroid Build Coastguard Worker#         root_build_dir)
33*6777b538SAndroid Build Coastguard Worker#     executable_args = [
34*6777b538SAndroid Build Coastguard Worker#       "--sample-lib", "@WrappedPath(${_rebased_sample_argument_path})",
35*6777b538SAndroid Build Coastguard Worker#     ]
36*6777b538SAndroid Build Coastguard Worker#   }
37*6777b538SAndroid Build Coastguard Worker#
38*6777b538SAndroid Build Coastguard Worker# Example wrapping a build product:
39*6777b538SAndroid Build Coastguard Worker#   generate_wrapper("sample_wrapper") {
40*6777b538SAndroid Build Coastguard Worker#     executable = "$root_build_dir/sample_build_product"
41*6777b538SAndroid Build Coastguard Worker#     wrapper_script = "$root_build_dir/bin/run_sample_build_product"
42*6777b538SAndroid Build Coastguard Worker#   }
43*6777b538SAndroid Build Coastguard Workertemplate("generate_wrapper") {
44*6777b538SAndroid Build Coastguard Worker  action(target_name) {
45*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.generator_script)) {
46*6777b538SAndroid Build Coastguard Worker      script = invoker.generator_script
47*6777b538SAndroid Build Coastguard Worker    } else {
48*6777b538SAndroid Build Coastguard Worker      script = "//build/util/generate_wrapper.py"
49*6777b538SAndroid Build Coastguard Worker    }
50*6777b538SAndroid Build Coastguard Worker    _wrapper_script = invoker.wrapper_script
51*6777b538SAndroid Build Coastguard Worker    if (is_win) {
52*6777b538SAndroid Build Coastguard Worker      _wrapper_script += ".bat"
53*6777b538SAndroid Build Coastguard Worker    }
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker    data = [
56*6777b538SAndroid Build Coastguard Worker      _wrapper_script,
57*6777b538SAndroid Build Coastguard Worker      "//.vpython3",
58*6777b538SAndroid Build Coastguard Worker    ]
59*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.data)) {
60*6777b538SAndroid Build Coastguard Worker      data += invoker.data
61*6777b538SAndroid Build Coastguard Worker    }
62*6777b538SAndroid Build Coastguard Worker    outputs = [ _wrapper_script ]
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker    _rebased_executable_to_wrap =
65*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.executable, root_build_dir)
66*6777b538SAndroid Build Coastguard Worker    _rebased_wrapper_script = rebase_path(_wrapper_script, root_build_dir)
67*6777b538SAndroid Build Coastguard Worker    if (is_win) {
68*6777b538SAndroid Build Coastguard Worker      _script_language = "batch"
69*6777b538SAndroid Build Coastguard Worker    } else {
70*6777b538SAndroid Build Coastguard Worker      _script_language = "bash"
71*6777b538SAndroid Build Coastguard Worker    }
72*6777b538SAndroid Build Coastguard Worker    args = [
73*6777b538SAndroid Build Coastguard Worker      "--executable",
74*6777b538SAndroid Build Coastguard Worker      "@WrappedPath(${_rebased_executable_to_wrap})",
75*6777b538SAndroid Build Coastguard Worker      "--wrapper-script",
76*6777b538SAndroid Build Coastguard Worker      _rebased_wrapper_script,
77*6777b538SAndroid Build Coastguard Worker      "--output-directory",
78*6777b538SAndroid Build Coastguard Worker      rebase_path(root_build_dir, root_build_dir),
79*6777b538SAndroid Build Coastguard Worker      "--script-language",
80*6777b538SAndroid Build Coastguard Worker      _script_language,
81*6777b538SAndroid Build Coastguard Worker    ]
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.executable_args)) {
84*6777b538SAndroid Build Coastguard Worker      args += [ "--" ] + invoker.executable_args
85*6777b538SAndroid Build Coastguard Worker    }
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
88*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker,
89*6777b538SAndroid Build Coastguard Worker                           "*",
90*6777b538SAndroid Build Coastguard Worker                           TESTONLY_AND_VISIBILITY + [
91*6777b538SAndroid Build Coastguard Worker                                 "data",
92*6777b538SAndroid Build Coastguard Worker                                 "executable",
93*6777b538SAndroid Build Coastguard Worker                                 "executable_args",
94*6777b538SAndroid Build Coastguard Worker                                 "generator_script",
95*6777b538SAndroid Build Coastguard Worker                                 "wrapper_script",
96*6777b538SAndroid Build Coastguard Worker                               ])
97*6777b538SAndroid Build Coastguard Worker  }
98*6777b538SAndroid Build Coastguard Worker}
99