xref: /aosp_15_r20/external/pigweed/pw_bloat/bloat.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni")
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/evaluate_path_expressions.gni")
18*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/python_action.gni")
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Workerdeclare_args() {
21*61c4878aSAndroid Build Coastguard Worker  # Path to the Bloaty configuration file that defines the memory layout and
22*61c4878aSAndroid Build Coastguard Worker  # capacities for the target binaries.
23*61c4878aSAndroid Build Coastguard Worker  pw_bloat_BLOATY_CONFIG = ""
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker  # List of toolchains to use in pw_toolchain_size_diff templates.
26*61c4878aSAndroid Build Coastguard Worker  #
27*61c4878aSAndroid Build Coastguard Worker  # Each entry is a scope containing the following variables:
28*61c4878aSAndroid Build Coastguard Worker  #
29*61c4878aSAndroid Build Coastguard Worker  #   name: Human-readable toolchain name.
30*61c4878aSAndroid Build Coastguard Worker  #   target: GN target that defines the toolchain.
31*61c4878aSAndroid Build Coastguard Worker  #   linker_script: Optional path to a linker script file to build for the
32*61c4878aSAndroid Build Coastguard Worker  #     toolchain's target.
33*61c4878aSAndroid Build Coastguard Worker  #   bloaty_config: Optional Bloaty confirugation file defining the memory
34*61c4878aSAndroid Build Coastguard Worker  #     layout of the binaries as specified in the linker script.
35*61c4878aSAndroid Build Coastguard Worker  #
36*61c4878aSAndroid Build Coastguard Worker  # If this list is empty, pw_toolchain_size_diff targets become no-ops.
37*61c4878aSAndroid Build Coastguard Worker  pw_bloat_TOOLCHAINS = []
38*61c4878aSAndroid Build Coastguard Worker
39*61c4878aSAndroid Build Coastguard Worker  # Controls whether to display size reports in the build output.
40*61c4878aSAndroid Build Coastguard Worker  pw_bloat_SHOW_SIZE_REPORTS = false
41*61c4878aSAndroid Build Coastguard Worker}
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker# Creates a size report for a single binary.
44*61c4878aSAndroid Build Coastguard Worker#
45*61c4878aSAndroid Build Coastguard Worker# Args:
46*61c4878aSAndroid Build Coastguard Worker#   target: Build target for executable. Required.
47*61c4878aSAndroid Build Coastguard Worker#   data_sources: List of datasources from bloaty config file
48*61c4878aSAndroid Build Coastguard Worker#     or built-in datasources. Order of sources determines hierarchical
49*61c4878aSAndroid Build Coastguard Worker#     output. Optional.
50*61c4878aSAndroid Build Coastguard Worker#     github.com/google/bloaty/blob/a1bbc93f5f6f969242046dffd9deb379f6735020/doc/using.md
51*61c4878aSAndroid Build Coastguard Worker#   source_filter: Regex to filter data source names in Bloaty. Optional.
52*61c4878aSAndroid Build Coastguard Worker#   json_key_prefix: Prefix for the key names in json size report. Defaults to
53*61c4878aSAndroid Build Coastguard Worker#     target name. Optional.
54*61c4878aSAndroid Build Coastguard Worker#   full_json_summary: If true, json report includes size breakdown per source
55*61c4878aSAndroid Build Coastguard Worker#     hierarchy. Otherwise, defaults to only include the top-level data source
56*61c4878aSAndroid Build Coastguard Worker#     type in size report. Optional.
57*61c4878aSAndroid Build Coastguard Worker#   ignore_unused_labels: If true, json report won't include labels that have
58*61c4878aSAndroid Build Coastguard Worker#     size equal to zero. Optional.
59*61c4878aSAndroid Build Coastguard Worker#
60*61c4878aSAndroid Build Coastguard Worker# Example:
61*61c4878aSAndroid Build Coastguard Worker#   pw_size_report("foo_bloat") {
62*61c4878aSAndroid Build Coastguard Worker#      target = ":foo_static"
63*61c4878aSAndroid Build Coastguard Worker#      datasources = "symbols,segment_names"
64*61c4878aSAndroid Build Coastguard Worker#      source_filter = "foo"
65*61c4878aSAndroid Build Coastguard Worker#      json_key_prefix = "foo"
66*61c4878aSAndroid Build Coastguard Worker#      full_json_summary = true
67*61c4878aSAndroid Build Coastguard Worker#      ignore_unused_labels = true
68*61c4878aSAndroid Build Coastguard Worker#   }
69*61c4878aSAndroid Build Coastguard Worker#
70*61c4878aSAndroid Build Coastguard Workertemplate("pw_size_report") {
71*61c4878aSAndroid Build Coastguard Worker  if (pw_bloat_BLOATY_CONFIG != "") {
72*61c4878aSAndroid Build Coastguard Worker    assert(defined(invoker.target),
73*61c4878aSAndroid Build Coastguard Worker           "Size report must defined a 'target' variable")
74*61c4878aSAndroid Build Coastguard Worker    _all_target_dependencies = [ invoker.target ]
75*61c4878aSAndroid Build Coastguard Worker    _binary_args = []
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.source_filter)) {
78*61c4878aSAndroid Build Coastguard Worker      curr_source_filter = invoker.source_filter
79*61c4878aSAndroid Build Coastguard Worker    } else {
80*61c4878aSAndroid Build Coastguard Worker      curr_source_filter = ""
81*61c4878aSAndroid Build Coastguard Worker    }
82*61c4878aSAndroid Build Coastguard Worker
83*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.data_sources)) {
84*61c4878aSAndroid Build Coastguard Worker      curr_data_sources = string_split(invoker.data_sources, ",")
85*61c4878aSAndroid Build Coastguard Worker    } else {
86*61c4878aSAndroid Build Coastguard Worker      curr_data_sources = ""
87*61c4878aSAndroid Build Coastguard Worker    }
88*61c4878aSAndroid Build Coastguard Worker    _binary_args = [
89*61c4878aSAndroid Build Coastguard Worker      {
90*61c4878aSAndroid Build Coastguard Worker        bloaty_config = rebase_path(pw_bloat_BLOATY_CONFIG, root_build_dir)
91*61c4878aSAndroid Build Coastguard Worker        out_dir = rebase_path(target_gen_dir, root_build_dir)
92*61c4878aSAndroid Build Coastguard Worker        target = "<TARGET_FILE(${invoker.target})>"
93*61c4878aSAndroid Build Coastguard Worker        source_filter = curr_source_filter
94*61c4878aSAndroid Build Coastguard Worker        data_sources = curr_data_sources
95*61c4878aSAndroid Build Coastguard Worker      },
96*61c4878aSAndroid Build Coastguard Worker    ]
97*61c4878aSAndroid Build Coastguard Worker
98*61c4878aSAndroid Build Coastguard Worker    _file_name = "${target_name}_single_binary.json"
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard Worker    _args_src = "$target_gen_dir/${_file_name}.in"
101*61c4878aSAndroid Build Coastguard Worker    _args_path = "$target_gen_dir/${_file_name}"
102*61c4878aSAndroid Build Coastguard Worker
103*61c4878aSAndroid Build Coastguard Worker    write_file(_args_src,
104*61c4878aSAndroid Build Coastguard Worker               {
105*61c4878aSAndroid Build Coastguard Worker                 binaries = _binary_args
106*61c4878aSAndroid Build Coastguard Worker                 target_name = target_name
107*61c4878aSAndroid Build Coastguard Worker                 out_dir = rebase_path(target_gen_dir, root_build_dir)
108*61c4878aSAndroid Build Coastguard Worker                 root = rebase_path("//", root_build_dir)
109*61c4878aSAndroid Build Coastguard Worker                 toolchain = current_toolchain
110*61c4878aSAndroid Build Coastguard Worker                 default_toolchain = default_toolchain
111*61c4878aSAndroid Build Coastguard Worker                 cwd = rebase_path(".", root_build_dir)
112*61c4878aSAndroid Build Coastguard Worker               },
113*61c4878aSAndroid Build Coastguard Worker               "json")
114*61c4878aSAndroid Build Coastguard Worker
115*61c4878aSAndroid Build Coastguard Worker    pw_evaluate_path_expressions("${target_name}.evaluate") {
116*61c4878aSAndroid Build Coastguard Worker      files = [
117*61c4878aSAndroid Build Coastguard Worker        {
118*61c4878aSAndroid Build Coastguard Worker          source = _args_src
119*61c4878aSAndroid Build Coastguard Worker          dest = _args_path
120*61c4878aSAndroid Build Coastguard Worker        },
121*61c4878aSAndroid Build Coastguard Worker      ]
122*61c4878aSAndroid Build Coastguard Worker    }
123*61c4878aSAndroid Build Coastguard Worker
124*61c4878aSAndroid Build Coastguard Worker    _bloat_script_args = [
125*61c4878aSAndroid Build Coastguard Worker      "--gn-arg-path",
126*61c4878aSAndroid Build Coastguard Worker      rebase_path(_args_path, root_build_dir),
127*61c4878aSAndroid Build Coastguard Worker      "--single-report",
128*61c4878aSAndroid Build Coastguard Worker    ]
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.json_key_prefix)) {
131*61c4878aSAndroid Build Coastguard Worker      _bloat_script_args += [
132*61c4878aSAndroid Build Coastguard Worker        "--json-key-prefix",
133*61c4878aSAndroid Build Coastguard Worker        invoker.json_key_prefix,
134*61c4878aSAndroid Build Coastguard Worker      ]
135*61c4878aSAndroid Build Coastguard Worker    }
136*61c4878aSAndroid Build Coastguard Worker
137*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.full_json_summary)) {
138*61c4878aSAndroid Build Coastguard Worker      if (invoker.full_json_summary) {
139*61c4878aSAndroid Build Coastguard Worker        _bloat_script_args += [ "--full-json-summary" ]
140*61c4878aSAndroid Build Coastguard Worker      }
141*61c4878aSAndroid Build Coastguard Worker    }
142*61c4878aSAndroid Build Coastguard Worker
143*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.ignore_unused_labels)) {
144*61c4878aSAndroid Build Coastguard Worker      if (invoker.ignore_unused_labels) {
145*61c4878aSAndroid Build Coastguard Worker        _bloat_script_args += [ "--ignore-unused-labels" ]
146*61c4878aSAndroid Build Coastguard Worker      }
147*61c4878aSAndroid Build Coastguard Worker    }
148*61c4878aSAndroid Build Coastguard Worker
149*61c4878aSAndroid Build Coastguard Worker    _doc_rst_output = "$target_gen_dir/${target_name}"
150*61c4878aSAndroid Build Coastguard Worker    _binary_sizes_output = "$target_gen_dir/${target_name}.binary_sizes.json"
151*61c4878aSAndroid Build Coastguard Worker
152*61c4878aSAndroid Build Coastguard Worker    if (host_os == "win") {
153*61c4878aSAndroid Build Coastguard Worker      # Bloaty is not yet packaged for Windows systems; display a message
154*61c4878aSAndroid Build Coastguard Worker      # indicating this.
155*61c4878aSAndroid Build Coastguard Worker      not_needed("*")
156*61c4878aSAndroid Build Coastguard Worker      not_needed(invoker, "*")
157*61c4878aSAndroid Build Coastguard Worker
158*61c4878aSAndroid Build Coastguard Worker      pw_python_action(target_name) {
159*61c4878aSAndroid Build Coastguard Worker        metadata = {
160*61c4878aSAndroid Build Coastguard Worker          pw_doc_sources = rebase_path([ _doc_rst_output ], root_build_dir)
161*61c4878aSAndroid Build Coastguard Worker        }
162*61c4878aSAndroid Build Coastguard Worker        script = "$dir_pw_bloat/py/pw_bloat/no_bloaty.py"
163*61c4878aSAndroid Build Coastguard Worker        python_deps = [ "$dir_pw_bloat/py" ]
164*61c4878aSAndroid Build Coastguard Worker        args = [ rebase_path(_doc_rst_output, root_build_dir) ]
165*61c4878aSAndroid Build Coastguard Worker        outputs = [ _doc_rst_output ]
166*61c4878aSAndroid Build Coastguard Worker      }
167*61c4878aSAndroid Build Coastguard Worker
168*61c4878aSAndroid Build Coastguard Worker      group(target_name + "_UNUSED_DEPS") {
169*61c4878aSAndroid Build Coastguard Worker        deps = _all_target_dependencies
170*61c4878aSAndroid Build Coastguard Worker      }
171*61c4878aSAndroid Build Coastguard Worker    } else {
172*61c4878aSAndroid Build Coastguard Worker      # Create an action which runs the size report script on the provided
173*61c4878aSAndroid Build Coastguard Worker      # targets.
174*61c4878aSAndroid Build Coastguard Worker      pw_python_action(target_name) {
175*61c4878aSAndroid Build Coastguard Worker        metadata = {
176*61c4878aSAndroid Build Coastguard Worker          pw_doc_sources = rebase_path([ _doc_rst_output ], root_build_dir)
177*61c4878aSAndroid Build Coastguard Worker        }
178*61c4878aSAndroid Build Coastguard Worker        script = "$dir_pw_bloat/py/pw_bloat/bloat.py"
179*61c4878aSAndroid Build Coastguard Worker        python_deps = [ "$dir_pw_bloat/py" ]
180*61c4878aSAndroid Build Coastguard Worker        inputs = [
181*61c4878aSAndroid Build Coastguard Worker          pw_bloat_BLOATY_CONFIG,
182*61c4878aSAndroid Build Coastguard Worker          _args_path,
183*61c4878aSAndroid Build Coastguard Worker        ]
184*61c4878aSAndroid Build Coastguard Worker        outputs = [
185*61c4878aSAndroid Build Coastguard Worker          "${_doc_rst_output}.txt",
186*61c4878aSAndroid Build Coastguard Worker          _binary_sizes_output,
187*61c4878aSAndroid Build Coastguard Worker          _doc_rst_output,
188*61c4878aSAndroid Build Coastguard Worker        ]
189*61c4878aSAndroid Build Coastguard Worker        deps = _all_target_dependencies + [ ":${target_name}.evaluate" ]
190*61c4878aSAndroid Build Coastguard Worker        args = _bloat_script_args
191*61c4878aSAndroid Build Coastguard Worker
192*61c4878aSAndroid Build Coastguard Worker        # Print size reports to stdout when they are generated, if requested.
193*61c4878aSAndroid Build Coastguard Worker        capture_output = !pw_bloat_SHOW_SIZE_REPORTS
194*61c4878aSAndroid Build Coastguard Worker      }
195*61c4878aSAndroid Build Coastguard Worker    }
196*61c4878aSAndroid Build Coastguard Worker  } else {
197*61c4878aSAndroid Build Coastguard Worker    not_needed(invoker, "*")
198*61c4878aSAndroid Build Coastguard Worker    group(target_name) {
199*61c4878aSAndroid Build Coastguard Worker    }
200*61c4878aSAndroid Build Coastguard Worker  }
201*61c4878aSAndroid Build Coastguard Worker}
202*61c4878aSAndroid Build Coastguard Worker
203*61c4878aSAndroid Build Coastguard Worker# Aggregates JSON size report data from several pw_size_report targets into a
204*61c4878aSAndroid Build Coastguard Worker# single output file.
205*61c4878aSAndroid Build Coastguard Worker#
206*61c4878aSAndroid Build Coastguard Worker# Args:
207*61c4878aSAndroid Build Coastguard Worker#   deps: List of pw_size_report targets whose data to collect.
208*61c4878aSAndroid Build Coastguard Worker#   output: Path to the output JSON file.
209*61c4878aSAndroid Build Coastguard Worker#
210*61c4878aSAndroid Build Coastguard Worker# Example:
211*61c4878aSAndroid Build Coastguard Worker#   pw_size_report_aggregation("image_sizes") {
212*61c4878aSAndroid Build Coastguard Worker#      deps = [
213*61c4878aSAndroid Build Coastguard Worker#        ":app_image_size_report",
214*61c4878aSAndroid Build Coastguard Worker#        ":bootloader_image_size_report",
215*61c4878aSAndroid Build Coastguard Worker#      ]
216*61c4878aSAndroid Build Coastguard Worker#      output = "$root_gen_dir/artifacts/image_sizes.json"
217*61c4878aSAndroid Build Coastguard Worker#   }
218*61c4878aSAndroid Build Coastguard Worker#
219*61c4878aSAndroid Build Coastguard Workertemplate("pw_size_report_aggregation") {
220*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.deps) && invoker.deps != [],
221*61c4878aSAndroid Build Coastguard Worker         "pw_size_report_aggregation requires size report dependencies")
222*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.output),
223*61c4878aSAndroid Build Coastguard Worker         "pw_size_report_aggregation requires an output file path")
224*61c4878aSAndroid Build Coastguard Worker
225*61c4878aSAndroid Build Coastguard Worker  _input_json_files = []
226*61c4878aSAndroid Build Coastguard Worker
227*61c4878aSAndroid Build Coastguard Worker  foreach(_dep, invoker.deps) {
228*61c4878aSAndroid Build Coastguard Worker    _gen_dir = get_label_info(_dep, "target_gen_dir")
229*61c4878aSAndroid Build Coastguard Worker    _dep_name = get_label_info(_dep, "name")
230*61c4878aSAndroid Build Coastguard Worker    _input_json_files +=
231*61c4878aSAndroid Build Coastguard Worker        [ rebase_path("$_gen_dir/${_dep_name}.binary_sizes.json",
232*61c4878aSAndroid Build Coastguard Worker                      root_build_dir) ]
233*61c4878aSAndroid Build Coastguard Worker  }
234*61c4878aSAndroid Build Coastguard Worker
235*61c4878aSAndroid Build Coastguard Worker  pw_python_action(target_name) {
236*61c4878aSAndroid Build Coastguard Worker    script = "$dir_pw_bloat/py/pw_bloat/binary_size_aggregator.py"
237*61c4878aSAndroid Build Coastguard Worker    python_deps = [ "$dir_pw_bloat/py" ]
238*61c4878aSAndroid Build Coastguard Worker    args = [
239*61c4878aSAndroid Build Coastguard Worker             "--output",
240*61c4878aSAndroid Build Coastguard Worker             rebase_path(invoker.output, root_build_dir),
241*61c4878aSAndroid Build Coastguard Worker           ] + _input_json_files
242*61c4878aSAndroid Build Coastguard Worker    outputs = [ invoker.output ]
243*61c4878aSAndroid Build Coastguard Worker    deps = invoker.deps
244*61c4878aSAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "visibility" ])
245*61c4878aSAndroid Build Coastguard Worker  }
246*61c4878aSAndroid Build Coastguard Worker}
247*61c4878aSAndroid Build Coastguard Worker
248*61c4878aSAndroid Build Coastguard Worker# Creates a target which runs a size report diff on a set of executables.
249*61c4878aSAndroid Build Coastguard Worker#
250*61c4878aSAndroid Build Coastguard Worker# Args:
251*61c4878aSAndroid Build Coastguard Worker#   base: The default base executable target to run the diff against. May be
252*61c4878aSAndroid Build Coastguard Worker#     omitted if all binaries provide their own base.
253*61c4878aSAndroid Build Coastguard Worker#   source_filter: Optional global regex to filter data source names in Bloaty.
254*61c4878aSAndroid Build Coastguard Worker#   data_sources: List of datasources from bloaty config file
255*61c4878aSAndroid Build Coastguard Worker#     or built-in datasources. Order of sources determines hierarchical
256*61c4878aSAndroid Build Coastguard Worker#     output. Optional.
257*61c4878aSAndroid Build Coastguard Worker#     github.com/google/bloaty/blob/a1bbc93f5f6f969242046dffd9deb379f6735020/doc/using.md
258*61c4878aSAndroid Build Coastguard Worker#   binaries: List of executables to compare in the diff.
259*61c4878aSAndroid Build Coastguard Worker#     Each binary in the list is a scope containing up to three variables:
260*61c4878aSAndroid Build Coastguard Worker#       label: Descriptive name for the executable. Required.
261*61c4878aSAndroid Build Coastguard Worker#       target: Build target for the executable. Required.
262*61c4878aSAndroid Build Coastguard Worker#       base: Optional base diff target. Overrides global base argument.
263*61c4878aSAndroid Build Coastguard Worker#       source_filter: Optional regex to filter data source names.
264*61c4878aSAndroid Build Coastguard Worker#         Overrides global source_filter argument.
265*61c4878aSAndroid Build Coastguard Worker#       data_sources: Optional List of datasources from bloaty config file
266*61c4878aSAndroid Build Coastguard Worker#         Overrides global data_sources argument.
267*61c4878aSAndroid Build Coastguard Worker#
268*61c4878aSAndroid Build Coastguard Worker#
269*61c4878aSAndroid Build Coastguard Worker# Example:
270*61c4878aSAndroid Build Coastguard Worker#   pw_size_diff("foo_bloat") {
271*61c4878aSAndroid Build Coastguard Worker#     base = ":foo_base"
272*61c4878aSAndroid Build Coastguard Worker#     data_sources = "segment,symbols"
273*61c4878aSAndroid Build Coastguard Worker#     binaries = [
274*61c4878aSAndroid Build Coastguard Worker#       {
275*61c4878aSAndroid Build Coastguard Worker#         target = ":foo_static"
276*61c4878aSAndroid Build Coastguard Worker#         label = "Static"
277*61c4878aSAndroid Build Coastguard Worker#       },
278*61c4878aSAndroid Build Coastguard Worker#       {
279*61c4878aSAndroid Build Coastguard Worker#         target = ":foo_dynamic"
280*61c4878aSAndroid Build Coastguard Worker#         label = "Dynamic"
281*61c4878aSAndroid Build Coastguard Worker#         data_sources = "segment_names"
282*61c4878aSAndroid Build Coastguard Worker#       },
283*61c4878aSAndroid Build Coastguard Worker#     ]
284*61c4878aSAndroid Build Coastguard Worker#   }
285*61c4878aSAndroid Build Coastguard Worker#
286*61c4878aSAndroid Build Coastguard Workertemplate("pw_size_diff") {
287*61c4878aSAndroid Build Coastguard Worker  if (pw_bloat_BLOATY_CONFIG != "") {
288*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.base)) {
289*61c4878aSAndroid Build Coastguard Worker      _global_base = invoker.base
290*61c4878aSAndroid Build Coastguard Worker      _all_target_dependencies = [ _global_base ]
291*61c4878aSAndroid Build Coastguard Worker    } else {
292*61c4878aSAndroid Build Coastguard Worker      _all_target_dependencies = []
293*61c4878aSAndroid Build Coastguard Worker    }
294*61c4878aSAndroid Build Coastguard Worker
295*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.source_filter)) {
296*61c4878aSAndroid Build Coastguard Worker      _global_source_filter = invoker.source_filter
297*61c4878aSAndroid Build Coastguard Worker    }
298*61c4878aSAndroid Build Coastguard Worker
299*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.data_sources)) {
300*61c4878aSAndroid Build Coastguard Worker      _global_data_sources = string_split(invoker.data_sources, ",")
301*61c4878aSAndroid Build Coastguard Worker    }
302*61c4878aSAndroid Build Coastguard Worker
303*61c4878aSAndroid Build Coastguard Worker    # TODO(brandonvu): Remove once all downstream projects are updated
304*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.title)) {
305*61c4878aSAndroid Build Coastguard Worker      not_needed(invoker, [ "title" ])
306*61c4878aSAndroid Build Coastguard Worker    }
307*61c4878aSAndroid Build Coastguard Worker
308*61c4878aSAndroid Build Coastguard Worker    # This template creates an action which invokes a Python script to run a
309*61c4878aSAndroid Build Coastguard Worker    # size report on each of the provided targets. Each of the targets is listed
310*61c4878aSAndroid Build Coastguard Worker    # as a dependency of the action so that the report gets updated when
311*61c4878aSAndroid Build Coastguard Worker    # anything is changed. Most of the code below builds the command-line
312*61c4878aSAndroid Build Coastguard Worker    # arguments to pass each of the targets into the script.
313*61c4878aSAndroid Build Coastguard Worker
314*61c4878aSAndroid Build Coastguard Worker    # Process each of the binaries, creating an object and storing all the
315*61c4878aSAndroid Build Coastguard Worker    # needed variables into a json. Json is parsed in bloat.py
316*61c4878aSAndroid Build Coastguard Worker    _binaries_args = []
317*61c4878aSAndroid Build Coastguard Worker    _bloaty_configs = []
318*61c4878aSAndroid Build Coastguard Worker
319*61c4878aSAndroid Build Coastguard Worker    foreach(binary, invoker.binaries) {
320*61c4878aSAndroid Build Coastguard Worker      assert(defined(binary.label) && defined(binary.target),
321*61c4878aSAndroid Build Coastguard Worker             "Size report binaries must define 'label' and 'target' variables")
322*61c4878aSAndroid Build Coastguard Worker      _all_target_dependencies += [ binary.target ]
323*61c4878aSAndroid Build Coastguard Worker
324*61c4878aSAndroid Build Coastguard Worker      # If the binary defines its own base, use that instead of the global base.
325*61c4878aSAndroid Build Coastguard Worker      if (defined(binary.base)) {
326*61c4878aSAndroid Build Coastguard Worker        _binary_base = binary.base
327*61c4878aSAndroid Build Coastguard Worker        _all_target_dependencies += [ _binary_base ]
328*61c4878aSAndroid Build Coastguard Worker      } else if (defined(_global_base)) {
329*61c4878aSAndroid Build Coastguard Worker        _binary_base = _global_base
330*61c4878aSAndroid Build Coastguard Worker      } else {
331*61c4878aSAndroid Build Coastguard Worker        assert(false, "pw_size_diff requires a 'base' file")
332*61c4878aSAndroid Build Coastguard Worker      }
333*61c4878aSAndroid Build Coastguard Worker
334*61c4878aSAndroid Build Coastguard Worker      if (defined(binary.source_filter)) {
335*61c4878aSAndroid Build Coastguard Worker        _binary_source_filter = binary.source_filter
336*61c4878aSAndroid Build Coastguard Worker      } else if (defined(_global_source_filter)) {
337*61c4878aSAndroid Build Coastguard Worker        _binary_source_filter = _global_source_filter
338*61c4878aSAndroid Build Coastguard Worker      } else {
339*61c4878aSAndroid Build Coastguard Worker        _binary_source_filter = ""
340*61c4878aSAndroid Build Coastguard Worker      }
341*61c4878aSAndroid Build Coastguard Worker
342*61c4878aSAndroid Build Coastguard Worker      _binary_data_sources = []
343*61c4878aSAndroid Build Coastguard Worker      if (defined(binary.data_sources)) {
344*61c4878aSAndroid Build Coastguard Worker        _binary_data_sources = string_split(binary.data_sources, ",")
345*61c4878aSAndroid Build Coastguard Worker      } else if (defined(_global_data_sources)) {
346*61c4878aSAndroid Build Coastguard Worker        _binary_data_sources = _global_data_sources
347*61c4878aSAndroid Build Coastguard Worker      } else {
348*61c4878aSAndroid Build Coastguard Worker        _binary_data_sources = ""
349*61c4878aSAndroid Build Coastguard Worker      }
350*61c4878aSAndroid Build Coastguard Worker
351*61c4878aSAndroid Build Coastguard Worker      # Allow each binary to override the global bloaty config.
352*61c4878aSAndroid Build Coastguard Worker      if (defined(binary.bloaty_config)) {
353*61c4878aSAndroid Build Coastguard Worker        _binary_bloaty_config = binary.bloaty_config
354*61c4878aSAndroid Build Coastguard Worker        _bloaty_configs += [ binary.bloaty_config ]
355*61c4878aSAndroid Build Coastguard Worker      } else {
356*61c4878aSAndroid Build Coastguard Worker        _binary_bloaty_config = pw_bloat_BLOATY_CONFIG
357*61c4878aSAndroid Build Coastguard Worker        _bloaty_configs += [ pw_bloat_BLOATY_CONFIG ]
358*61c4878aSAndroid Build Coastguard Worker      }
359*61c4878aSAndroid Build Coastguard Worker
360*61c4878aSAndroid Build Coastguard Worker      _binaries_args += [
361*61c4878aSAndroid Build Coastguard Worker        {
362*61c4878aSAndroid Build Coastguard Worker          bloaty_config = rebase_path(_binary_bloaty_config, root_build_dir)
363*61c4878aSAndroid Build Coastguard Worker          target = "<TARGET_FILE(${binary.target})>"
364*61c4878aSAndroid Build Coastguard Worker          base = "<TARGET_FILE($_binary_base)>"
365*61c4878aSAndroid Build Coastguard Worker          source_filter = _binary_source_filter
366*61c4878aSAndroid Build Coastguard Worker          label = binary.label
367*61c4878aSAndroid Build Coastguard Worker          data_sources = _binary_data_sources
368*61c4878aSAndroid Build Coastguard Worker        },
369*61c4878aSAndroid Build Coastguard Worker      ]
370*61c4878aSAndroid Build Coastguard Worker    }
371*61c4878aSAndroid Build Coastguard Worker
372*61c4878aSAndroid Build Coastguard Worker    _file_name = "${target_name}_binaries.json"
373*61c4878aSAndroid Build Coastguard Worker    _diff_source = "$target_gen_dir/${_file_name}.in"
374*61c4878aSAndroid Build Coastguard Worker    _diff_path = "$target_gen_dir/${_file_name}"
375*61c4878aSAndroid Build Coastguard Worker    write_file(_diff_source,
376*61c4878aSAndroid Build Coastguard Worker               {
377*61c4878aSAndroid Build Coastguard Worker                 binaries = _binaries_args
378*61c4878aSAndroid Build Coastguard Worker                 target_name = target_name
379*61c4878aSAndroid Build Coastguard Worker                 out_dir = rebase_path(target_gen_dir, root_build_dir)
380*61c4878aSAndroid Build Coastguard Worker                 root = rebase_path("//", root_build_dir)
381*61c4878aSAndroid Build Coastguard Worker                 toolchain = current_toolchain
382*61c4878aSAndroid Build Coastguard Worker                 default_toolchain = default_toolchain
383*61c4878aSAndroid Build Coastguard Worker                 cwd = rebase_path(".", root_build_dir)
384*61c4878aSAndroid Build Coastguard Worker               },
385*61c4878aSAndroid Build Coastguard Worker               "json")
386*61c4878aSAndroid Build Coastguard Worker
387*61c4878aSAndroid Build Coastguard Worker    pw_evaluate_path_expressions("${target_name}.evaluate") {
388*61c4878aSAndroid Build Coastguard Worker      files = [
389*61c4878aSAndroid Build Coastguard Worker        {
390*61c4878aSAndroid Build Coastguard Worker          source = _diff_source
391*61c4878aSAndroid Build Coastguard Worker          dest = _diff_path
392*61c4878aSAndroid Build Coastguard Worker        },
393*61c4878aSAndroid Build Coastguard Worker      ]
394*61c4878aSAndroid Build Coastguard Worker    }
395*61c4878aSAndroid Build Coastguard Worker
396*61c4878aSAndroid Build Coastguard Worker    _bloat_script_args = [
397*61c4878aSAndroid Build Coastguard Worker      "--gn-arg-path",
398*61c4878aSAndroid Build Coastguard Worker      rebase_path(_diff_path, root_build_dir),
399*61c4878aSAndroid Build Coastguard Worker    ]
400*61c4878aSAndroid Build Coastguard Worker
401*61c4878aSAndroid Build Coastguard Worker    # TODO(brandonvu): Remove once all downstream projects are updated
402*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.full_report)) {
403*61c4878aSAndroid Build Coastguard Worker      not_needed(invoker, [ "full_report" ])
404*61c4878aSAndroid Build Coastguard Worker    }
405*61c4878aSAndroid Build Coastguard Worker
406*61c4878aSAndroid Build Coastguard Worker    _doc_rst_output = "$target_gen_dir/${target_name}"
407*61c4878aSAndroid Build Coastguard Worker
408*61c4878aSAndroid Build Coastguard Worker    if (host_os == "win") {
409*61c4878aSAndroid Build Coastguard Worker      # Bloaty is not yet packaged for Windows systems; display a message
410*61c4878aSAndroid Build Coastguard Worker      # indicating this.
411*61c4878aSAndroid Build Coastguard Worker      not_needed("*")
412*61c4878aSAndroid Build Coastguard Worker      not_needed(invoker, "*")
413*61c4878aSAndroid Build Coastguard Worker
414*61c4878aSAndroid Build Coastguard Worker      pw_python_action(target_name) {
415*61c4878aSAndroid Build Coastguard Worker        metadata = {
416*61c4878aSAndroid Build Coastguard Worker          pw_doc_sources = rebase_path([ _doc_rst_output ], root_build_dir)
417*61c4878aSAndroid Build Coastguard Worker        }
418*61c4878aSAndroid Build Coastguard Worker        script = "$dir_pw_bloat/py/pw_bloat/no_bloaty.py"
419*61c4878aSAndroid Build Coastguard Worker        python_deps = [ "$dir_pw_bloat/py" ]
420*61c4878aSAndroid Build Coastguard Worker        args = [ rebase_path(_doc_rst_output, root_build_dir) ]
421*61c4878aSAndroid Build Coastguard Worker        outputs = [ _doc_rst_output ]
422*61c4878aSAndroid Build Coastguard Worker      }
423*61c4878aSAndroid Build Coastguard Worker
424*61c4878aSAndroid Build Coastguard Worker      group(target_name + "_UNUSED_DEPS") {
425*61c4878aSAndroid Build Coastguard Worker        deps = _all_target_dependencies
426*61c4878aSAndroid Build Coastguard Worker      }
427*61c4878aSAndroid Build Coastguard Worker    } else {
428*61c4878aSAndroid Build Coastguard Worker      # Create an action which runs the size report script on the provided
429*61c4878aSAndroid Build Coastguard Worker      # targets.
430*61c4878aSAndroid Build Coastguard Worker      pw_python_action(target_name) {
431*61c4878aSAndroid Build Coastguard Worker        metadata = {
432*61c4878aSAndroid Build Coastguard Worker          pw_doc_sources = rebase_path([ _doc_rst_output ], root_build_dir)
433*61c4878aSAndroid Build Coastguard Worker        }
434*61c4878aSAndroid Build Coastguard Worker        script = "$dir_pw_bloat/py/pw_bloat/bloat.py"
435*61c4878aSAndroid Build Coastguard Worker        python_deps = [ "$dir_pw_bloat/py" ]
436*61c4878aSAndroid Build Coastguard Worker        inputs = _bloaty_configs + [ _diff_path ]
437*61c4878aSAndroid Build Coastguard Worker        outputs = [
438*61c4878aSAndroid Build Coastguard Worker          "${_doc_rst_output}.txt",
439*61c4878aSAndroid Build Coastguard Worker          _doc_rst_output,
440*61c4878aSAndroid Build Coastguard Worker        ]
441*61c4878aSAndroid Build Coastguard Worker        deps = _all_target_dependencies + [ ":${target_name}.evaluate" ]
442*61c4878aSAndroid Build Coastguard Worker        args = _bloat_script_args
443*61c4878aSAndroid Build Coastguard Worker
444*61c4878aSAndroid Build Coastguard Worker        # Print size reports to stdout when they are generated, if requested.
445*61c4878aSAndroid Build Coastguard Worker        capture_output = !pw_bloat_SHOW_SIZE_REPORTS
446*61c4878aSAndroid Build Coastguard Worker      }
447*61c4878aSAndroid Build Coastguard Worker    }
448*61c4878aSAndroid Build Coastguard Worker  } else {
449*61c4878aSAndroid Build Coastguard Worker    not_needed(invoker, "*")
450*61c4878aSAndroid Build Coastguard Worker    group(target_name) {
451*61c4878aSAndroid Build Coastguard Worker    }
452*61c4878aSAndroid Build Coastguard Worker  }
453*61c4878aSAndroid Build Coastguard Worker}
454*61c4878aSAndroid Build Coastguard Worker
455*61c4878aSAndroid Build Coastguard Worker# Creates a report card comparing the sizes of the same binary compiled with
456*61c4878aSAndroid Build Coastguard Worker# different toolchains. The toolchains to use are listed in the build variable
457*61c4878aSAndroid Build Coastguard Worker# pw_bloat_TOOLCHAINS.
458*61c4878aSAndroid Build Coastguard Worker#
459*61c4878aSAndroid Build Coastguard Worker# Args:
460*61c4878aSAndroid Build Coastguard Worker#   base_executable: Scope containing a list of variables defining an executable
461*61c4878aSAndroid Build Coastguard Worker#     target for the size report base.
462*61c4878aSAndroid Build Coastguard Worker#   diff_executable: Scope containing a list of variables defining an executable
463*61c4878aSAndroid Build Coastguard Worker#     target for the size report comparison.
464*61c4878aSAndroid Build Coastguard Worker#
465*61c4878aSAndroid Build Coastguard Worker# Outputs:
466*61c4878aSAndroid Build Coastguard Worker#   $target_gen_dir/$target_name.txt
467*61c4878aSAndroid Build Coastguard Worker#   $target_gen_dir/$target_name.rst
468*61c4878aSAndroid Build Coastguard Worker#
469*61c4878aSAndroid Build Coastguard Worker# Example:
470*61c4878aSAndroid Build Coastguard Worker#
471*61c4878aSAndroid Build Coastguard Worker#   pw_toolchain_size_diff("my_size_report") {
472*61c4878aSAndroid Build Coastguard Worker#     base_executable = {
473*61c4878aSAndroid Build Coastguard Worker#       sources = [ "base.cc" ]
474*61c4878aSAndroid Build Coastguard Worker#     }
475*61c4878aSAndroid Build Coastguard Worker#
476*61c4878aSAndroid Build Coastguard Worker#     diff_executable = {
477*61c4878aSAndroid Build Coastguard Worker#       sources = [ "base_with_libfoo.cc" ]
478*61c4878aSAndroid Build Coastguard Worker#       deps = [ ":libfoo" ]
479*61c4878aSAndroid Build Coastguard Worker#     }
480*61c4878aSAndroid Build Coastguard Worker#   }
481*61c4878aSAndroid Build Coastguard Worker#
482*61c4878aSAndroid Build Coastguard Workertemplate("pw_toolchain_size_diff") {
483*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.base_executable),
484*61c4878aSAndroid Build Coastguard Worker         "pw_toolchain_size_diff requires a base_executable")
485*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.diff_executable),
486*61c4878aSAndroid Build Coastguard Worker         "pw_toolchain_size_diff requires a diff_executable")
487*61c4878aSAndroid Build Coastguard Worker
488*61c4878aSAndroid Build Coastguard Worker  _size_report_binaries = []
489*61c4878aSAndroid Build Coastguard Worker
490*61c4878aSAndroid Build Coastguard Worker  # Multiple build targets are created for each toolchain, which all need unique
491*61c4878aSAndroid Build Coastguard Worker  # target names, so throw a counter in there.
492*61c4878aSAndroid Build Coastguard Worker  i = 0
493*61c4878aSAndroid Build Coastguard Worker
494*61c4878aSAndroid Build Coastguard Worker  # Create a base and diff executable for each toolchain, adding the toolchain's
495*61c4878aSAndroid Build Coastguard Worker  # linker script to the link flags for the executable, and add them all to a
496*61c4878aSAndroid Build Coastguard Worker  # list of binaries for the pw_size_diff template.
497*61c4878aSAndroid Build Coastguard Worker  foreach(_toolchain, pw_bloat_TOOLCHAINS) {
498*61c4878aSAndroid Build Coastguard Worker    _prefix = "_${target_name}_${i}_pw_size"
499*61c4878aSAndroid Build Coastguard Worker
500*61c4878aSAndroid Build Coastguard Worker    # Create a config which adds the toolchain's linker script as a linker flag
501*61c4878aSAndroid Build Coastguard Worker    # if the toolchain provides one.
502*61c4878aSAndroid Build Coastguard Worker    _linker_script_target_name = "${_prefix}_linker_script"
503*61c4878aSAndroid Build Coastguard Worker    config(_linker_script_target_name) {
504*61c4878aSAndroid Build Coastguard Worker      if (defined(_toolchain.linker_script)) {
505*61c4878aSAndroid Build Coastguard Worker        ldflags =
506*61c4878aSAndroid Build Coastguard Worker            [ "-T" + rebase_path(_toolchain.linker_script, root_build_dir) ]
507*61c4878aSAndroid Build Coastguard Worker        inputs = [ _toolchain.linker_script ]
508*61c4878aSAndroid Build Coastguard Worker      } else {
509*61c4878aSAndroid Build Coastguard Worker        ldflags = []
510*61c4878aSAndroid Build Coastguard Worker      }
511*61c4878aSAndroid Build Coastguard Worker    }
512*61c4878aSAndroid Build Coastguard Worker
513*61c4878aSAndroid Build Coastguard Worker    # Create a group which forces the linker script config its dependents.
514*61c4878aSAndroid Build Coastguard Worker    _linker_group_target_name = "${_prefix}_linker_group"
515*61c4878aSAndroid Build Coastguard Worker    group(_linker_group_target_name) {
516*61c4878aSAndroid Build Coastguard Worker      public_configs = [ ":$_linker_script_target_name" ]
517*61c4878aSAndroid Build Coastguard Worker    }
518*61c4878aSAndroid Build Coastguard Worker
519*61c4878aSAndroid Build Coastguard Worker    # Define the size report base executable with the toolchain's linker script.
520*61c4878aSAndroid Build Coastguard Worker    _base_target_name = "${_prefix}_base"
521*61c4878aSAndroid Build Coastguard Worker    executable(_base_target_name) {
522*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(invoker.base_executable, "*")
523*61c4878aSAndroid Build Coastguard Worker      if (!defined(deps)) {
524*61c4878aSAndroid Build Coastguard Worker        deps = []
525*61c4878aSAndroid Build Coastguard Worker      }
526*61c4878aSAndroid Build Coastguard Worker      deps += [ ":$_linker_group_target_name" ]
527*61c4878aSAndroid Build Coastguard Worker    }
528*61c4878aSAndroid Build Coastguard Worker
529*61c4878aSAndroid Build Coastguard Worker    # Define the size report diff executable with the toolchain's linker script.
530*61c4878aSAndroid Build Coastguard Worker    _diff_target_name = "${_prefix}_diff"
531*61c4878aSAndroid Build Coastguard Worker    executable(_diff_target_name) {
532*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(invoker.diff_executable, "*")
533*61c4878aSAndroid Build Coastguard Worker      if (!defined(deps)) {
534*61c4878aSAndroid Build Coastguard Worker        deps = []
535*61c4878aSAndroid Build Coastguard Worker      }
536*61c4878aSAndroid Build Coastguard Worker      deps += [ ":$_linker_group_target_name" ]
537*61c4878aSAndroid Build Coastguard Worker    }
538*61c4878aSAndroid Build Coastguard Worker
539*61c4878aSAndroid Build Coastguard Worker    # Force compilation with the toolchain.
540*61c4878aSAndroid Build Coastguard Worker    _base_label = get_label_info(":$_base_target_name", "label_no_toolchain")
541*61c4878aSAndroid Build Coastguard Worker    _base_with_toolchain = "$_base_label(${_toolchain.target})"
542*61c4878aSAndroid Build Coastguard Worker    _diff_label = get_label_info(":$_diff_target_name", "label_no_toolchain")
543*61c4878aSAndroid Build Coastguard Worker    _diff_with_toolchain = "$_diff_label(${_toolchain.target})"
544*61c4878aSAndroid Build Coastguard Worker
545*61c4878aSAndroid Build Coastguard Worker    # Append a pw_size_diff binary scope to the list comparing the toolchain's
546*61c4878aSAndroid Build Coastguard Worker    # diff and base executables.
547*61c4878aSAndroid Build Coastguard Worker    _size_report_binaries += [
548*61c4878aSAndroid Build Coastguard Worker      {
549*61c4878aSAndroid Build Coastguard Worker        base = _base_with_toolchain
550*61c4878aSAndroid Build Coastguard Worker        target = _diff_with_toolchain
551*61c4878aSAndroid Build Coastguard Worker        label = _toolchain.name
552*61c4878aSAndroid Build Coastguard Worker
553*61c4878aSAndroid Build Coastguard Worker        if (defined(_toolchain.bloaty_config)) {
554*61c4878aSAndroid Build Coastguard Worker          bloaty_config = _toolchain.bloaty_config
555*61c4878aSAndroid Build Coastguard Worker        }
556*61c4878aSAndroid Build Coastguard Worker      },
557*61c4878aSAndroid Build Coastguard Worker    ]
558*61c4878aSAndroid Build Coastguard Worker
559*61c4878aSAndroid Build Coastguard Worker    i += 1
560*61c4878aSAndroid Build Coastguard Worker  }
561*61c4878aSAndroid Build Coastguard Worker
562*61c4878aSAndroid Build Coastguard Worker  # TODO(frolv): Have a way of indicating that a toolchain should build docs.
563*61c4878aSAndroid Build Coastguard Worker  if (current_toolchain == default_toolchain && _size_report_binaries != []) {
564*61c4878aSAndroid Build Coastguard Worker    # Create the size report which runs on the binaries.
565*61c4878aSAndroid Build Coastguard Worker    pw_size_diff(target_name) {
566*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "title" ])
567*61c4878aSAndroid Build Coastguard Worker      binaries = _size_report_binaries
568*61c4878aSAndroid Build Coastguard Worker    }
569*61c4878aSAndroid Build Coastguard Worker  } else {
570*61c4878aSAndroid Build Coastguard Worker    # If no toolchains are listed in pw_bloat_TOOLCHAINS, prevent GN from
571*61c4878aSAndroid Build Coastguard Worker    # complaining about unused variables and run a script that outputs a ReST
572*61c4878aSAndroid Build Coastguard Worker    # warning to the size report file.
573*61c4878aSAndroid Build Coastguard Worker    not_needed("*")
574*61c4878aSAndroid Build Coastguard Worker    not_needed(invoker, "*")
575*61c4878aSAndroid Build Coastguard Worker
576*61c4878aSAndroid Build Coastguard Worker    _doc_rst_output = "$target_gen_dir/$target_name"
577*61c4878aSAndroid Build Coastguard Worker    pw_python_action(target_name) {
578*61c4878aSAndroid Build Coastguard Worker      metadata = {
579*61c4878aSAndroid Build Coastguard Worker        pw_doc_sources = rebase_path([ _doc_rst_output ], root_build_dir)
580*61c4878aSAndroid Build Coastguard Worker      }
581*61c4878aSAndroid Build Coastguard Worker      script = "$dir_pw_bloat/py/pw_bloat/no_toolchains.py"
582*61c4878aSAndroid Build Coastguard Worker      python_deps = [ "$dir_pw_bloat/py" ]
583*61c4878aSAndroid Build Coastguard Worker      args = [ rebase_path(_doc_rst_output, root_build_dir) ]
584*61c4878aSAndroid Build Coastguard Worker      outputs = [ _doc_rst_output ]
585*61c4878aSAndroid Build Coastguard Worker    }
586*61c4878aSAndroid Build Coastguard Worker  }
587*61c4878aSAndroid Build Coastguard Worker}
588*61c4878aSAndroid Build Coastguard Worker
589*61c4878aSAndroid Build Coastguard Worker# A base_executable for the pw_toolchain_size_diff template which contains a
590*61c4878aSAndroid Build Coastguard Worker# main() function that loads the bloat_this_binary library and does nothing
591*61c4878aSAndroid Build Coastguard Worker# else.
592*61c4878aSAndroid Build Coastguard Workerpw_bloat_empty_base = {
593*61c4878aSAndroid Build Coastguard Worker  deps = [
594*61c4878aSAndroid Build Coastguard Worker    "$dir_pw_bloat:base_main",
595*61c4878aSAndroid Build Coastguard Worker    "$dir_pw_bloat:bloat_this_binary",
596*61c4878aSAndroid Build Coastguard Worker  ]
597*61c4878aSAndroid Build Coastguard Worker}
598