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