xref: /aosp_15_r20/external/cronet/build/config/fuchsia/generate_runner_scripts.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1# Copyright 2018 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import("//build/config/fuchsia/config.gni")
6import("//build/config/fuchsia/fuchsia_package_metadata.gni")
7import("//build/config/gclient_args.gni")
8import("//build/config/sysroot.gni")
9import("//build/util/generate_wrapper.gni")
10
11assert(is_fuchsia)
12
13declare_args() {
14  # Sets the Fuchsia Amber repository which will be used by default by the
15  # generated installation scripts. If not specified, then no default directory
16  # will be used.
17  default_fuchsia_out_dir = ""
18
19  # Sets the Fuchsia device node name which will be used by default by the
20  # generated runner scripts. If not specficed, then no default node name will
21  # be used.
22  default_fuchsia_device_node_name = ""
23
24  # CPU architecture of the host used to run the tests.
25  test_host_cpu = host_cpu
26
27  # Sets whether emulators need to be included in the test isolates
28  test_isolate_uses_emulator = true
29
30  # A list of additional Fuchsia boot images to include in the test isolates.
31  fuchsia_additional_boot_images = []
32
33  # This variable controls the browser included in the Telemetry based test
34  # targets.
35  fuchsia_browser_type = "web_engine_shell"
36}
37
38# Generates a wrapper script under root_build_dir/bin that performs an
39# operation, such as deployment or execution, using a package and its
40# dependencies.
41#
42# Parameters:
43#   output_name_format: The format string for the generated script's filename.
44#                       The placeholder string %package% will be substituted
45#                       with |package| (or |package_name|, if set).
46#                       Examples: "run_%package%", "install_%package%"
47#   package: The package() target to run.
48#   package_name: Specifies the name of the generated package, if its
49#       filename is different than the |package| target name. This value must
50#       match package_name in the |package| target.
51#   package_deps: An array of [package, package_name] array pairs
52#       which specify additional dependency packages to be installed
53#       prior to execution.
54#   executable: The underlying script to be called by the script.
55#   executable_args: The list of arguments to pass to |executable|.
56#                    Runtime commandline arguments can be passed to
57#                    |executable| using the placeholder %args%.
58#
59#                    In addition, the script is passed the following
60#                    executable_args:
61#                      --package - the path to a .FAR package to install.
62#                      --package_name - the name of the package to use as an
63#                                       entry point.
64#   include_fuchsia_out_dir: If true, adds |default_fuchsia_out_dir|
65#                            to executable_args (when set in GN args).
66template("fuchsia_run_script_with_packages") {
67  if (defined(invoker.package_name)) {
68    _pkg_shortname = invoker.package_name
69  } else {
70    _pkg_shortname = get_label_info(invoker.package, "name")
71  }
72
73  _generated_script_path =
74      "$root_build_dir/bin/" +
75      string_replace(invoker.output_name_format, "%package%", _pkg_shortname)
76
77  generate_wrapper(target_name) {
78    forward_variables_from(invoker,
79                           TESTONLY_AND_VISIBILITY + [
80                                 "executable",
81                                 "executable_args",
82                                 "data",
83                                 "include_fuchsia_out_dir",
84                                 "target",
85                               ])
86
87    wrapper_script = _generated_script_path
88    deps = [ invoker.package ]
89
90    if (!defined(data_deps)) {
91      data_deps = []
92    }
93    data_deps += [ "//build/config/fuchsia:deployment_resources" ]
94
95    _combined_package_list = [ invoker.package ]
96
97    if (defined(invoker.package_deps)) {
98      foreach(package_dep, invoker.package_deps) {
99        _combined_package_list += [ package_dep[0] ]
100      }
101    }
102    foreach(package_dep, _combined_package_list) {
103      data_deps += [
104        package_dep,
105        package_dep + "__archive-manifest",
106        package_dep + "__archive-metadata",
107      ]
108    }
109
110    if (defined(invoker.data_deps)) {
111      data_deps += invoker.data_deps
112    }
113
114    # Compute the list of full paths to package files, including dependencies.
115    if (defined(invoker.package_deps)) {
116      foreach(package_dep, invoker.package_deps) {
117        package_dep_target = package_dep[0]
118        deps += [ package_dep_target ]
119        data_deps += [ package_dep_target ]
120      }
121    }
122
123    # Include package information inside the wrapper script.
124    if (!defined(executable_args)) {
125      executable_args = []
126    }
127
128    if (defined(include_fuchsia_out_dir) && include_fuchsia_out_dir &&
129        default_fuchsia_out_dir != "") {
130      executable_args += [
131        "--fuchsia-out-dir",
132        default_fuchsia_out_dir,
133      ]
134    }
135  }
136
137  # Create a wrapper script rather than using a group() in order to ensure
138  # "ninja $target_name" always works.
139  if (defined(invoker.executable_wrapper)) {
140    generate_wrapper(invoker.executable_wrapper) {
141      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
142      executable = _generated_script_path
143      wrapper_script = "$root_build_dir/${invoker.executable_wrapper}"
144      deps = [
145        ":${invoker._install_target}",
146        ":${invoker._run_target}",
147      ]
148    }
149  }
150}
151
152# Generates a script which deploys a package to the TUF repo of a Fuchsia
153# build output directory.
154template("fuchsia_package_installer") {
155  if (defined(invoker.package_name)) {
156    pkg_shortname = invoker.package_name
157  } else {
158    pkg_shortname = get_label_info(invoker.package, "name")
159  }
160  fuchsia_package_metadata(pkg_shortname) {
161    forward_variables_from(invoker,
162                           TESTONLY_AND_VISIBILITY + [
163                                 "package",
164                                 "package_deps",
165                               ])
166  }
167  fuchsia_run_script_with_packages(target_name) {
168    forward_variables_from(invoker,
169                           "*",
170                           TESTONLY_AND_VISIBILITY + [ "executable_args" ])
171    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
172    executable = rebase_path("//build/fuchsia/test/deploy_to_fuchsia.py")
173    executable_args = [
174      "--out-dir",
175      "@WrappedPath(.)",
176      pkg_shortname,
177    ]
178    output_name_format = "deploy_%package%"
179    include_fuchsia_out_dir = true
180  }
181}
182
183# Generates scripts for installing and running test packages.
184# See fuchsia_run_script_with_packages() for the full list of parameters.
185template("fuchsia_test_runner") {
186  _run_target = "${target_name}__runner"
187  _install_target = "${target_name}__installer"
188
189  fuchsia_run_script_with_packages(_run_target) {
190    forward_variables_from(invoker,
191                           TESTONLY_AND_VISIBILITY + [
192                                 "data",
193                                 "data_deps",
194                                 "package",
195                                 "package_name",
196                                 "package_deps",
197                               ])
198
199    _test_runner_py = "//build/fuchsia/test/run_test.py"
200
201    executable = rebase_path(_test_runner_py)
202
203    if (defined(invoker.is_test_exe) && invoker.is_test_exe) {
204      data += [ "//.vpython3" ]
205    }
206    output_name_format = "run_%package%"
207    executable_wrapper = invoker.target_name
208
209    # Populate the arguments used by the test runner, defined at build-time.
210    executable_args = [
211      "--out-dir",
212      "@WrappedPath(.)",
213    ]
214
215    executable_args += [ package_name ]
216
217    if (defined(invoker.use_test_server) && invoker.use_test_server) {
218      executable_args += [ "--enable-test-server" ]
219    }
220
221    if (default_fuchsia_device_node_name != "") {
222      executable_args += [
223        "--target-id",
224        default_fuchsia_device_node_name,
225      ]
226    }
227
228    # Declare the files that are needed for test execution on LUCI swarming
229    # test clients, both directly (via data) or indirectly (via data_deps).
230    if (!defined(data)) {
231      data = []
232    }
233    data += [
234      _test_runner_py,
235      "$root_gen_dir/package_metadata/${invoker.package_name}.meta",
236    ]
237
238    # TODO(crbug.com/1256870): Remove this once all out-of-tree references
239    # to "package_name_override" are migrated to "package_name".
240    if (defined(invoker.package_name_override)) {
241      package_name = invoker.package_name_override
242    }
243  }
244  fuchsia_package_installer(_install_target) {
245    forward_variables_from(invoker,
246                           TESTONLY_AND_VISIBILITY + [
247                                 "package",
248                                 "package_name",
249                                 "package_deps",
250                               ])
251  }
252}
253