1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker# Compile a protocol buffer. 6*6777b538SAndroid Build Coastguard Worker# 7*6777b538SAndroid Build Coastguard Worker# Protobuf parameters: 8*6777b538SAndroid Build Coastguard Worker# 9*6777b538SAndroid Build Coastguard Worker# proto_in_dir (optional) 10*6777b538SAndroid Build Coastguard Worker# Specifies the path relative to the current BUILD.gn file where 11*6777b538SAndroid Build Coastguard Worker# proto files are located and the directory structure of 12*6777b538SAndroid Build Coastguard Worker# this proto library starts. 13*6777b538SAndroid Build Coastguard Worker# 14*6777b538SAndroid Build Coastguard Worker# This option can be calculated automatically but it will raise an 15*6777b538SAndroid Build Coastguard Worker# assertion error if any nested directories are found. 16*6777b538SAndroid Build Coastguard Worker# 17*6777b538SAndroid Build Coastguard Worker# proto_out_dir (optional) 18*6777b538SAndroid Build Coastguard Worker# Specifies the path suffix that output files are generated under. 19*6777b538SAndroid Build Coastguard Worker# This path will be appended to |root_gen_dir|, but for python stubs 20*6777b538SAndroid Build Coastguard Worker# it will be appended to |root_build_dir|/pyproto. 21*6777b538SAndroid Build Coastguard Worker# 22*6777b538SAndroid Build Coastguard Worker# generate_python (optional, default true) 23*6777b538SAndroid Build Coastguard Worker# Generate Python protobuf stubs. 24*6777b538SAndroid Build Coastguard Worker# 25*6777b538SAndroid Build Coastguard Worker# generate_cc (optional, default true) 26*6777b538SAndroid Build Coastguard Worker# Generate C++ protobuf stubs. 27*6777b538SAndroid Build Coastguard Worker# 28*6777b538SAndroid Build Coastguard Worker# generate_javascript (optional, default false) 29*6777b538SAndroid Build Coastguard Worker# Generate Javascript protobuf stubs. 30*6777b538SAndroid Build Coastguard Worker# 31*6777b538SAndroid Build Coastguard Worker# generate_library (optional, default true) 32*6777b538SAndroid Build Coastguard Worker# Generate a "static_library" target for linking with the generated code. 33*6777b538SAndroid Build Coastguard Worker# 34*6777b538SAndroid Build Coastguard Worker# generate_py_runtime (optional, default false) 35*6777b538SAndroid Build Coastguard Worker# Generates a "_py_runtime"-suffixed target for test targets that need the 36*6777b538SAndroid Build Coastguard Worker# Python stubs available at runtime. 37*6777b538SAndroid Build Coastguard Worker# 38*6777b538SAndroid Build Coastguard Worker# cc_generator_options (optional) 39*6777b538SAndroid Build Coastguard Worker# List of extra flags passed to the protocol compiler. If you need to 40*6777b538SAndroid Build Coastguard Worker# add an EXPORT macro to a protobuf's C++ header, set the 41*6777b538SAndroid Build Coastguard Worker# 'cc_generator_options' variable with the value: 42*6777b538SAndroid Build Coastguard Worker# 'dllexport_decl=FOO_EXPORT:' (note trailing colon). 43*6777b538SAndroid Build Coastguard Worker# 44*6777b538SAndroid Build Coastguard Worker# It is likely you also need to #include a file for the above EXPORT 45*6777b538SAndroid Build Coastguard Worker# macro to work (see cc_include) and set 46*6777b538SAndroid Build Coastguard Worker# component_build_force_source_set = true. 47*6777b538SAndroid Build Coastguard Worker# 48*6777b538SAndroid Build Coastguard Worker# cc_include (optional) 49*6777b538SAndroid Build Coastguard Worker# String listing an extra include that should be passed. 50*6777b538SAndroid Build Coastguard Worker# Example: cc_include = "foo/bar.h" 51*6777b538SAndroid Build Coastguard Worker# 52*6777b538SAndroid Build Coastguard Worker# generator_plugin_label (optional) 53*6777b538SAndroid Build Coastguard Worker# GN label for plugin executable which generates custom cc stubs. 54*6777b538SAndroid Build Coastguard Worker# Don't specify a toolchain, host toolchain is assumed. 55*6777b538SAndroid Build Coastguard Worker# 56*6777b538SAndroid Build Coastguard Worker# generator_plugin_script (optional) 57*6777b538SAndroid Build Coastguard Worker# Path to plugin script. Mutually exclusive with |generator_plugin_label|. 58*6777b538SAndroid Build Coastguard Worker# 59*6777b538SAndroid Build Coastguard Worker# generator_plugin_script_deps (optional) 60*6777b538SAndroid Build Coastguard Worker# List of additional files required for generator plugin script. 61*6777b538SAndroid Build Coastguard Worker# 62*6777b538SAndroid Build Coastguard Worker# generator_plugin_suffix[es] (required if using a plugin) 63*6777b538SAndroid Build Coastguard Worker# Suffix (before extension) for generated .cc and .h files 64*6777b538SAndroid Build Coastguard Worker# or list of suffixes for all files (with extensions). 65*6777b538SAndroid Build Coastguard Worker# 66*6777b538SAndroid Build Coastguard Worker# generator_plugin_options (optional) 67*6777b538SAndroid Build Coastguard Worker# Extra flags passed to the plugin. See cc_generator_options. 68*6777b538SAndroid Build Coastguard Worker# 69*6777b538SAndroid Build Coastguard Worker# deps (optional) 70*6777b538SAndroid Build Coastguard Worker# DEPRECATED: use proto_deps or link_deps instead (crbug.com/938011). 71*6777b538SAndroid Build Coastguard Worker# Additional dependencies. 72*6777b538SAndroid Build Coastguard Worker# 73*6777b538SAndroid Build Coastguard Worker# link_deps (optional) 74*6777b538SAndroid Build Coastguard Worker# Additional dependencies linked to library. 75*6777b538SAndroid Build Coastguard Worker# 76*6777b538SAndroid Build Coastguard Worker# proto_deps (optional) 77*6777b538SAndroid Build Coastguard Worker# Additional dependencies required before running protoc. 78*6777b538SAndroid Build Coastguard Worker# e.g. proto file generating action. 79*6777b538SAndroid Build Coastguard Worker# 80*6777b538SAndroid Build Coastguard Worker# proto_data_sources (optional) 81*6777b538SAndroid Build Coastguard Worker# Additional proto sources that will only be used for references 82*6777b538SAndroid Build Coastguard Worker# and will not be compiled. 83*6777b538SAndroid Build Coastguard Worker# This should be used in conjunction with import_dirs. 84*6777b538SAndroid Build Coastguard Worker# 85*6777b538SAndroid Build Coastguard Worker# use_protobuf_full (optional) 86*6777b538SAndroid Build Coastguard Worker# If adding protobuf library would be required, adds protobuf_full to deps 87*6777b538SAndroid Build Coastguard Worker# instead of protobuf_lite. 88*6777b538SAndroid Build Coastguard Worker# 89*6777b538SAndroid Build Coastguard Worker# import_dirs (optional) 90*6777b538SAndroid Build Coastguard Worker# A list of extra import directories to be passed to protoc compiler. 91*6777b538SAndroid Build Coastguard Worker# WARNING: This circumvents proto checkdeps, and should only be used when 92*6777b538SAndroid Build Coastguard Worker# needed, typically when proto files cannot cleanly import through 93*6777b538SAndroid Build Coastguard Worker# absolute paths, such as for third_party or generated .proto files. 94*6777b538SAndroid Build Coastguard Worker# http://crbug.com/691451 tracks fixing this. 95*6777b538SAndroid Build Coastguard Worker# 96*6777b538SAndroid Build Coastguard Worker# Parameters for compiling the generated code: 97*6777b538SAndroid Build Coastguard Worker# 98*6777b538SAndroid Build Coastguard Worker# force_source_set (Default=false) 99*6777b538SAndroid Build Coastguard Worker# When set true the generated code will be compiled as a source set. 100*6777b538SAndroid Build Coastguard Worker# This can be useful if you need to export the generated symbols from a 101*6777b538SAndroid Build Coastguard Worker# shared library. You should use this carefully, as you probably only 102*6777b538SAndroid Build Coastguard Worker# want this if your dependencies are *always* shared libraries. Most 103*6777b538SAndroid Build Coastguard Worker# of the time, you probably want `component_build_force_source_set` 104*6777b538SAndroid Build Coastguard Worker# instead (see the next option). 105*6777b538SAndroid Build Coastguard Worker# component_build_force_source_set (Default=false) 106*6777b538SAndroid Build Coastguard Worker# When set true the generated code will be compiled as a source set in 107*6777b538SAndroid Build Coastguard Worker# the component build. This does not affect static builds. If you are 108*6777b538SAndroid Build Coastguard Worker# exporting symbols from a component, this is required to prevent those 109*6777b538SAndroid Build Coastguard Worker# symbols from being stripped. If you're not using dllexports in 110*6777b538SAndroid Build Coastguard Worker# cc_generator_options, it's usually best to leave this false. 111*6777b538SAndroid Build Coastguard Worker# 112*6777b538SAndroid Build Coastguard Worker# defines (optional) 113*6777b538SAndroid Build Coastguard Worker# Defines to supply to the source set that compiles the generated source 114*6777b538SAndroid Build Coastguard Worker# code. 115*6777b538SAndroid Build Coastguard Worker# 116*6777b538SAndroid Build Coastguard Worker# extra_configs (optional) 117*6777b538SAndroid Build Coastguard Worker# A list of config labels that will be appended to the configs applying 118*6777b538SAndroid Build Coastguard Worker# to the source set. 119*6777b538SAndroid Build Coastguard Worker# 120*6777b538SAndroid Build Coastguard Worker# remove_configs (optional) 121*6777b538SAndroid Build Coastguard Worker# A list of config labels that will be removed from the configs apllying 122*6777b538SAndroid Build Coastguard Worker# to the source set. 123*6777b538SAndroid Build Coastguard Worker# 124*6777b538SAndroid Build Coastguard Worker# propagate_imports_configs (optional) 125*6777b538SAndroid Build Coastguard Worker# A boolean value (defaults to true) that specifies whether the config 126*6777b538SAndroid Build Coastguard Worker# generated for the library's import directories will be propagated to 127*6777b538SAndroid Build Coastguard Worker# dependents as one of the library target's public_configs. See 128*6777b538SAndroid Build Coastguard Worker# crbug.com/1043279#c11 and crbug.com/gn/142 for why this option exists. 129*6777b538SAndroid Build Coastguard Worker# WARNING: If set to false, the embedder target is responsible for 130*6777b538SAndroid Build Coastguard Worker# propagating a suitable config, so that any dependent headers can resolve 131*6777b538SAndroid Build Coastguard Worker# includes generated by proto imports. 132*6777b538SAndroid Build Coastguard Worker# 133*6777b538SAndroid Build Coastguard Worker# Example: 134*6777b538SAndroid Build Coastguard Worker# proto_library("mylib") { 135*6777b538SAndroid Build Coastguard Worker# sources = [ 136*6777b538SAndroid Build Coastguard Worker# "foo.proto", 137*6777b538SAndroid Build Coastguard Worker# ] 138*6777b538SAndroid Build Coastguard Worker# } 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Workerimport("//build/config/cronet/config.gni") 141*6777b538SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni") 142*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/kythe.gni") 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Workerdeclare_args() { 145*6777b538SAndroid Build Coastguard Worker # Allows subprojects to omit javascript dependencies (e.g.) closure_compiler 146*6777b538SAndroid Build Coastguard Worker # and google-closure-library. 147*6777b538SAndroid Build Coastguard Worker enable_js_protobuf = !is_cronet_build 148*6777b538SAndroid Build Coastguard Worker} 149*6777b538SAndroid Build Coastguard Worker 150*6777b538SAndroid Build Coastguard Workerif (enable_js_protobuf) { 151*6777b538SAndroid Build Coastguard Worker import("//third_party/closure_compiler/compile_js.gni") 152*6777b538SAndroid Build Coastguard Worker} 153*6777b538SAndroid Build Coastguard Worker 154*6777b538SAndroid Build Coastguard Workerif (host_os == "win") { 155*6777b538SAndroid Build Coastguard Worker _host_executable_suffix = ".exe" 156*6777b538SAndroid Build Coastguard Worker} else { 157*6777b538SAndroid Build Coastguard Worker _host_executable_suffix = "" 158*6777b538SAndroid Build Coastguard Worker} 159*6777b538SAndroid Build Coastguard Worker 160*6777b538SAndroid Build Coastguard Worker_protoc_label = "//third_party/protobuf:protoc($host_toolchain)" 161*6777b538SAndroid Build Coastguard Worker_protoc_path = get_label_info(_protoc_label, "root_out_dir") + "/protoc" + 162*6777b538SAndroid Build Coastguard Worker _host_executable_suffix 163*6777b538SAndroid Build Coastguard Worker_protoc_gen_js_label = 164*6777b538SAndroid Build Coastguard Worker "//third_party/protobuf-javascript:protoc-gen-js($host_toolchain)" 165*6777b538SAndroid Build Coastguard Worker_protoc_gen_js_path = get_label_info(_protoc_gen_js_label, "root_out_dir") + 166*6777b538SAndroid Build Coastguard Worker "/protoc-gen-js" + _host_executable_suffix 167*6777b538SAndroid Build Coastguard Worker 168*6777b538SAndroid Build Coastguard Workertemplate("proto_library") { 169*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.sources), "Need sources for proto_library") 170*6777b538SAndroid Build Coastguard Worker proto_sources = invoker.sources 171*6777b538SAndroid Build Coastguard Worker 172*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generate_cc)) { 173*6777b538SAndroid Build Coastguard Worker generate_cc = invoker.generate_cc 174*6777b538SAndroid Build Coastguard Worker } else { 175*6777b538SAndroid Build Coastguard Worker generate_cc = true 176*6777b538SAndroid Build Coastguard Worker } 177*6777b538SAndroid Build Coastguard Worker 178*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generate_python)) { 179*6777b538SAndroid Build Coastguard Worker generate_python = invoker.generate_python 180*6777b538SAndroid Build Coastguard Worker } else { 181*6777b538SAndroid Build Coastguard Worker generate_python = true 182*6777b538SAndroid Build Coastguard Worker } 183*6777b538SAndroid Build Coastguard Worker 184*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generate_javascript)) { 185*6777b538SAndroid Build Coastguard Worker generate_javascript = invoker.generate_javascript 186*6777b538SAndroid Build Coastguard Worker } else { 187*6777b538SAndroid Build Coastguard Worker generate_javascript = false 188*6777b538SAndroid Build Coastguard Worker } 189*6777b538SAndroid Build Coastguard Worker 190*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generate_descriptor)) { 191*6777b538SAndroid Build Coastguard Worker generate_descriptor = invoker.generate_descriptor 192*6777b538SAndroid Build Coastguard Worker } else { 193*6777b538SAndroid Build Coastguard Worker generate_descriptor = "" 194*6777b538SAndroid Build Coastguard Worker } 195*6777b538SAndroid Build Coastguard Worker 196*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generate_py_runtime)) { 197*6777b538SAndroid Build Coastguard Worker generate_py_runtime = invoker.generate_py_runtime 198*6777b538SAndroid Build Coastguard Worker } else { 199*6777b538SAndroid Build Coastguard Worker generate_py_runtime = false 200*6777b538SAndroid Build Coastguard Worker } 201*6777b538SAndroid Build Coastguard Worker if (generate_py_runtime) { 202*6777b538SAndroid Build Coastguard Worker generate_python = true 203*6777b538SAndroid Build Coastguard Worker } 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker # exclude_imports is only used for generating the descriptor. Therefore, the 206*6777b538SAndroid Build Coastguard Worker # check needs to be here to avoid complaints from GN about the unused 207*6777b538SAndroid Build Coastguard Worker # variable. 208*6777b538SAndroid Build Coastguard Worker if (generate_descriptor != "") { 209*6777b538SAndroid Build Coastguard Worker if (defined(invoker.exclude_imports)) { 210*6777b538SAndroid Build Coastguard Worker exclude_imports = invoker.exclude_imports 211*6777b538SAndroid Build Coastguard Worker } else { 212*6777b538SAndroid Build Coastguard Worker exclude_imports = false 213*6777b538SAndroid Build Coastguard Worker } 214*6777b538SAndroid Build Coastguard Worker } 215*6777b538SAndroid Build Coastguard Worker 216*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generator_plugin_label)) { 217*6777b538SAndroid Build Coastguard Worker # Straightforward way to get the name of executable doesn't work because 218*6777b538SAndroid Build Coastguard Worker # |root_out_dir| and |root_build_dir| may differ in cross-compilation and 219*6777b538SAndroid Build Coastguard Worker # also Windows executables have .exe at the end. 220*6777b538SAndroid Build Coastguard Worker 221*6777b538SAndroid Build Coastguard Worker plugin_host_label = invoker.generator_plugin_label + "($host_toolchain)" 222*6777b538SAndroid Build Coastguard Worker plugin_path = 223*6777b538SAndroid Build Coastguard Worker get_label_info(plugin_host_label, "root_out_dir") + "/" + 224*6777b538SAndroid Build Coastguard Worker get_label_info(plugin_host_label, "name") + _host_executable_suffix 225*6777b538SAndroid Build Coastguard Worker generate_with_plugin = true 226*6777b538SAndroid Build Coastguard Worker } else if (defined(invoker.generator_plugin_script)) { 227*6777b538SAndroid Build Coastguard Worker plugin_path = invoker.generator_plugin_script 228*6777b538SAndroid Build Coastguard Worker generate_with_plugin = true 229*6777b538SAndroid Build Coastguard Worker } else { 230*6777b538SAndroid Build Coastguard Worker generate_with_plugin = false 231*6777b538SAndroid Build Coastguard Worker } 232*6777b538SAndroid Build Coastguard Worker 233*6777b538SAndroid Build Coastguard Worker if (generate_with_plugin) { 234*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generator_plugin_suffix)) { 235*6777b538SAndroid Build Coastguard Worker generator_plugin_suffixes = [ 236*6777b538SAndroid Build Coastguard Worker "${invoker.generator_plugin_suffix}.h", 237*6777b538SAndroid Build Coastguard Worker "${invoker.generator_plugin_suffix}.cc", 238*6777b538SAndroid Build Coastguard Worker ] 239*6777b538SAndroid Build Coastguard Worker } else { 240*6777b538SAndroid Build Coastguard Worker generator_plugin_suffixes = invoker.generator_plugin_suffixes 241*6777b538SAndroid Build Coastguard Worker } 242*6777b538SAndroid Build Coastguard Worker } 243*6777b538SAndroid Build Coastguard Worker 244*6777b538SAndroid Build Coastguard Worker if (defined(invoker.proto_in_dir)) { 245*6777b538SAndroid Build Coastguard Worker proto_in_dir = invoker.proto_in_dir 246*6777b538SAndroid Build Coastguard Worker has_nested_dirs = false 247*6777b538SAndroid Build Coastguard Worker foreach(proto_source, proto_sources) { 248*6777b538SAndroid Build Coastguard Worker if (get_path_info(proto_source, "dir") != proto_in_dir) { 249*6777b538SAndroid Build Coastguard Worker has_nested_dirs = true 250*6777b538SAndroid Build Coastguard Worker } 251*6777b538SAndroid Build Coastguard Worker } 252*6777b538SAndroid Build Coastguard Worker } else { 253*6777b538SAndroid Build Coastguard Worker proto_in_dir = get_path_info(proto_sources[0], "dir") 254*6777b538SAndroid Build Coastguard Worker has_nested_dirs = false 255*6777b538SAndroid Build Coastguard Worker 256*6777b538SAndroid Build Coastguard Worker # Sanity check, |proto_in_dir| should be defined to allow sub-directories. 257*6777b538SAndroid Build Coastguard Worker foreach(proto_source, proto_sources) { 258*6777b538SAndroid Build Coastguard Worker assert(get_path_info(proto_source, "dir") == proto_in_dir, 259*6777b538SAndroid Build Coastguard Worker "Please define |proto_in_dir| to allow nested directories.") 260*6777b538SAndroid Build Coastguard Worker } 261*6777b538SAndroid Build Coastguard Worker } 262*6777b538SAndroid Build Coastguard Worker 263*6777b538SAndroid Build Coastguard Worker # Avoid absolute path because of the assumption that |proto_in_dir| is 264*6777b538SAndroid Build Coastguard Worker # relative to the directory of current BUILD.gn file. 265*6777b538SAndroid Build Coastguard Worker proto_in_dir = rebase_path(proto_in_dir, ".") 266*6777b538SAndroid Build Coastguard Worker 267*6777b538SAndroid Build Coastguard Worker if (defined(invoker.proto_out_dir)) { 268*6777b538SAndroid Build Coastguard Worker proto_out_dir = invoker.proto_out_dir 269*6777b538SAndroid Build Coastguard Worker } else { 270*6777b538SAndroid Build Coastguard Worker # Absolute path to the directory of current BUILD.gn file excluding "//". 271*6777b538SAndroid Build Coastguard Worker proto_out_dir = rebase_path(".", "//") 272*6777b538SAndroid Build Coastguard Worker if (proto_in_dir != ".") { 273*6777b538SAndroid Build Coastguard Worker proto_out_dir += "/$proto_in_dir" 274*6777b538SAndroid Build Coastguard Worker } 275*6777b538SAndroid Build Coastguard Worker } 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker # We need both absolute path to use in GN statements and a relative one 278*6777b538SAndroid Build Coastguard Worker # to pass to external script. 279*6777b538SAndroid Build Coastguard Worker if (generate_cc || generate_with_plugin) { 280*6777b538SAndroid Build Coastguard Worker cc_out_dir = "$root_gen_dir/" + proto_out_dir 281*6777b538SAndroid Build Coastguard Worker rel_cc_out_dir = rebase_path(cc_out_dir, root_build_dir) 282*6777b538SAndroid Build Coastguard Worker } 283*6777b538SAndroid Build Coastguard Worker if (generate_python) { 284*6777b538SAndroid Build Coastguard Worker py_out_dir = "$root_out_dir/pyproto/" + proto_out_dir 285*6777b538SAndroid Build Coastguard Worker rel_py_out_dir = rebase_path(py_out_dir, root_build_dir) 286*6777b538SAndroid Build Coastguard Worker } 287*6777b538SAndroid Build Coastguard Worker if (generate_javascript) { 288*6777b538SAndroid Build Coastguard Worker js_out_dir = "$root_out_dir/jsproto/" + proto_out_dir 289*6777b538SAndroid Build Coastguard Worker rel_js_out_dir = rebase_path(js_out_dir, root_build_dir) 290*6777b538SAndroid Build Coastguard Worker } 291*6777b538SAndroid Build Coastguard Worker if (generate_descriptor != "") { 292*6777b538SAndroid Build Coastguard Worker descriptor_out = 293*6777b538SAndroid Build Coastguard Worker "$root_gen_dir/" + proto_out_dir + "/" + generate_descriptor 294*6777b538SAndroid Build Coastguard Worker rel_descriptor_out = rebase_path(descriptor_out, root_build_dir) 295*6777b538SAndroid Build Coastguard Worker } 296*6777b538SAndroid Build Coastguard Worker 297*6777b538SAndroid Build Coastguard Worker protos = rebase_path(invoker.sources, proto_in_dir) 298*6777b538SAndroid Build Coastguard Worker protogens = [] 299*6777b538SAndroid Build Coastguard Worker protogens_py = [] 300*6777b538SAndroid Build Coastguard Worker protogens_cc = [] 301*6777b538SAndroid Build Coastguard Worker protogens_js = [] 302*6777b538SAndroid Build Coastguard Worker 303*6777b538SAndroid Build Coastguard Worker # Whether source code bindings should be generated. 304*6777b538SAndroid Build Coastguard Worker generate_sources = generate_cc || generate_python || generate_with_plugin || 305*6777b538SAndroid Build Coastguard Worker generate_javascript 306*6777b538SAndroid Build Coastguard Worker 307*6777b538SAndroid Build Coastguard Worker # Whether library should be generated. 308*6777b538SAndroid Build Coastguard Worker # Library is not needed when proto_library is used to generate binary descriptor, in which case 309*6777b538SAndroid Build Coastguard Worker # corresponding library target should be omitted entirely. 310*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generate_library)) { 311*6777b538SAndroid Build Coastguard Worker generate_library = invoker.generate_library 312*6777b538SAndroid Build Coastguard Worker } else { 313*6777b538SAndroid Build Coastguard Worker generate_library = generate_sources 314*6777b538SAndroid Build Coastguard Worker } 315*6777b538SAndroid Build Coastguard Worker 316*6777b538SAndroid Build Coastguard Worker # List output files. 317*6777b538SAndroid Build Coastguard Worker if (generate_sources) { 318*6777b538SAndroid Build Coastguard Worker foreach(proto, protos) { 319*6777b538SAndroid Build Coastguard Worker proto_dir = get_path_info(proto, "dir") 320*6777b538SAndroid Build Coastguard Worker proto_name = get_path_info(proto, "name") 321*6777b538SAndroid Build Coastguard Worker proto_path = proto_dir + "/" + proto_name 322*6777b538SAndroid Build Coastguard Worker 323*6777b538SAndroid Build Coastguard Worker if (generate_cc) { 324*6777b538SAndroid Build Coastguard Worker protogens_cc += [ 325*6777b538SAndroid Build Coastguard Worker "$cc_out_dir/$proto_path.pb.h", 326*6777b538SAndroid Build Coastguard Worker "$cc_out_dir/$proto_path.pb.cc", 327*6777b538SAndroid Build Coastguard Worker ] 328*6777b538SAndroid Build Coastguard Worker } 329*6777b538SAndroid Build Coastguard Worker if (generate_python) { 330*6777b538SAndroid Build Coastguard Worker protogens_py += [ "$py_out_dir/${proto_path}_pb2.py" ] 331*6777b538SAndroid Build Coastguard Worker } 332*6777b538SAndroid Build Coastguard Worker if (generate_with_plugin) { 333*6777b538SAndroid Build Coastguard Worker foreach(suffix, generator_plugin_suffixes) { 334*6777b538SAndroid Build Coastguard Worker protogens_cc += [ "$cc_out_dir/${proto_path}${suffix}" ] 335*6777b538SAndroid Build Coastguard Worker } 336*6777b538SAndroid Build Coastguard Worker } 337*6777b538SAndroid Build Coastguard Worker if (generate_javascript) { 338*6777b538SAndroid Build Coastguard Worker protogens_js += [ "$js_out_dir/${proto_path}.js" ] 339*6777b538SAndroid Build Coastguard Worker } 340*6777b538SAndroid Build Coastguard Worker } 341*6777b538SAndroid Build Coastguard Worker } 342*6777b538SAndroid Build Coastguard Worker 343*6777b538SAndroid Build Coastguard Worker # If descriptor needs to be generated, it should be added to list of outputs once. 344*6777b538SAndroid Build Coastguard Worker if (generate_descriptor != "") { 345*6777b538SAndroid Build Coastguard Worker protogens += [ descriptor_out ] 346*6777b538SAndroid Build Coastguard Worker } 347*6777b538SAndroid Build Coastguard Worker 348*6777b538SAndroid Build Coastguard Worker action_name = "${target_name}_gen" 349*6777b538SAndroid Build Coastguard Worker source_set_name = target_name 350*6777b538SAndroid Build Coastguard Worker javascript_name = "${target_name}_js" 351*6777b538SAndroid Build Coastguard Worker py_runtime_name = "${target_name}_py_runtime" 352*6777b538SAndroid Build Coastguard Worker 353*6777b538SAndroid Build Coastguard Worker # Generate protobuf stubs. 354*6777b538SAndroid Build Coastguard Worker action(action_name) { 355*6777b538SAndroid Build Coastguard Worker visibility = [ 356*6777b538SAndroid Build Coastguard Worker ":$javascript_name", 357*6777b538SAndroid Build Coastguard Worker ":$py_runtime_name", 358*6777b538SAndroid Build Coastguard Worker ":$source_set_name", 359*6777b538SAndroid Build Coastguard Worker ] 360*6777b538SAndroid Build Coastguard Worker script = "//tools/protoc_wrapper/protoc_wrapper.py" 361*6777b538SAndroid Build Coastguard Worker args = protos 362*6777b538SAndroid Build Coastguard Worker 363*6777b538SAndroid Build Coastguard Worker sources = proto_sources 364*6777b538SAndroid Build Coastguard Worker outputs = 365*6777b538SAndroid Build Coastguard Worker get_path_info(protogens + protogens_cc + protogens_js + protogens_py, 366*6777b538SAndroid Build Coastguard Worker "abspath") 367*6777b538SAndroid Build Coastguard Worker 368*6777b538SAndroid Build Coastguard Worker if (defined(invoker.testonly)) { 369*6777b538SAndroid Build Coastguard Worker testonly = invoker.testonly 370*6777b538SAndroid Build Coastguard Worker } 371*6777b538SAndroid Build Coastguard Worker 372*6777b538SAndroid Build Coastguard Worker args += [ 373*6777b538SAndroid Build Coastguard Worker # Wrapper should never pick a system protoc. 374*6777b538SAndroid Build Coastguard Worker # Path should be rebased because |root_build_dir| for current toolchain 375*6777b538SAndroid Build Coastguard Worker # may be different from |root_out_dir| of protoc built on host toolchain. 376*6777b538SAndroid Build Coastguard Worker "--protoc", 377*6777b538SAndroid Build Coastguard Worker "./" + rebase_path(_protoc_path, root_build_dir), 378*6777b538SAndroid Build Coastguard Worker "--proto-in-dir", 379*6777b538SAndroid Build Coastguard Worker rebase_path(proto_in_dir, root_build_dir), 380*6777b538SAndroid Build Coastguard Worker ] 381*6777b538SAndroid Build Coastguard Worker 382*6777b538SAndroid Build Coastguard Worker if (generate_cc) { 383*6777b538SAndroid Build Coastguard Worker args += [ 384*6777b538SAndroid Build Coastguard Worker "--cc-out-dir", 385*6777b538SAndroid Build Coastguard Worker rel_cc_out_dir, 386*6777b538SAndroid Build Coastguard Worker ] 387*6777b538SAndroid Build Coastguard Worker if (enable_kythe_annotations) { 388*6777b538SAndroid Build Coastguard Worker args += [ "--enable-kythe-annotation" ] 389*6777b538SAndroid Build Coastguard Worker } 390*6777b538SAndroid Build Coastguard Worker if (defined(invoker.cc_generator_options)) { 391*6777b538SAndroid Build Coastguard Worker args += [ 392*6777b538SAndroid Build Coastguard Worker "--cc-options", 393*6777b538SAndroid Build Coastguard Worker invoker.cc_generator_options, 394*6777b538SAndroid Build Coastguard Worker ] 395*6777b538SAndroid Build Coastguard Worker } 396*6777b538SAndroid Build Coastguard Worker if (defined(invoker.cc_include)) { 397*6777b538SAndroid Build Coastguard Worker args += [ 398*6777b538SAndroid Build Coastguard Worker "--include", 399*6777b538SAndroid Build Coastguard Worker invoker.cc_include, 400*6777b538SAndroid Build Coastguard Worker ] 401*6777b538SAndroid Build Coastguard Worker } 402*6777b538SAndroid Build Coastguard Worker } 403*6777b538SAndroid Build Coastguard Worker 404*6777b538SAndroid Build Coastguard Worker if (generate_python) { 405*6777b538SAndroid Build Coastguard Worker args += [ 406*6777b538SAndroid Build Coastguard Worker "--py-out-dir", 407*6777b538SAndroid Build Coastguard Worker rel_py_out_dir, 408*6777b538SAndroid Build Coastguard Worker ] 409*6777b538SAndroid Build Coastguard Worker } 410*6777b538SAndroid Build Coastguard Worker 411*6777b538SAndroid Build Coastguard Worker if (generate_javascript) { 412*6777b538SAndroid Build Coastguard Worker args += [ 413*6777b538SAndroid Build Coastguard Worker "--js-out-dir", 414*6777b538SAndroid Build Coastguard Worker rel_js_out_dir, 415*6777b538SAndroid Build Coastguard Worker "--protoc-gen-js", 416*6777b538SAndroid Build Coastguard Worker "./" + rebase_path(_protoc_gen_js_path, root_build_dir), 417*6777b538SAndroid Build Coastguard Worker ] 418*6777b538SAndroid Build Coastguard Worker } 419*6777b538SAndroid Build Coastguard Worker 420*6777b538SAndroid Build Coastguard Worker if (generate_with_plugin) { 421*6777b538SAndroid Build Coastguard Worker args += [ 422*6777b538SAndroid Build Coastguard Worker "--plugin", 423*6777b538SAndroid Build Coastguard Worker rebase_path(plugin_path, root_build_dir), 424*6777b538SAndroid Build Coastguard Worker "--plugin-out-dir", 425*6777b538SAndroid Build Coastguard Worker rel_cc_out_dir, 426*6777b538SAndroid Build Coastguard Worker ] 427*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generator_plugin_options)) { 428*6777b538SAndroid Build Coastguard Worker args += [ 429*6777b538SAndroid Build Coastguard Worker "--plugin-options", 430*6777b538SAndroid Build Coastguard Worker invoker.generator_plugin_options, 431*6777b538SAndroid Build Coastguard Worker ] 432*6777b538SAndroid Build Coastguard Worker } 433*6777b538SAndroid Build Coastguard Worker } 434*6777b538SAndroid Build Coastguard Worker 435*6777b538SAndroid Build Coastguard Worker if (generate_descriptor != "") { 436*6777b538SAndroid Build Coastguard Worker depfile = 437*6777b538SAndroid Build Coastguard Worker "$root_gen_dir/" + proto_out_dir + "/" + generate_descriptor + ".d" 438*6777b538SAndroid Build Coastguard Worker rel_depfile = rebase_path(depfile, root_build_dir) 439*6777b538SAndroid Build Coastguard Worker 440*6777b538SAndroid Build Coastguard Worker if (exclude_imports) { 441*6777b538SAndroid Build Coastguard Worker args += [ "--exclude-imports" ] 442*6777b538SAndroid Build Coastguard Worker } 443*6777b538SAndroid Build Coastguard Worker 444*6777b538SAndroid Build Coastguard Worker args += [ 445*6777b538SAndroid Build Coastguard Worker "--descriptor-set-out", 446*6777b538SAndroid Build Coastguard Worker rel_descriptor_out, 447*6777b538SAndroid Build Coastguard Worker "--descriptor-set-dependency-file", 448*6777b538SAndroid Build Coastguard Worker rel_depfile, 449*6777b538SAndroid Build Coastguard Worker ] 450*6777b538SAndroid Build Coastguard Worker } 451*6777b538SAndroid Build Coastguard Worker inputs = [] 452*6777b538SAndroid Build Coastguard Worker if (defined(invoker.proto_data_sources)) { 453*6777b538SAndroid Build Coastguard Worker inputs += invoker.proto_data_sources 454*6777b538SAndroid Build Coastguard Worker } 455*6777b538SAndroid Build Coastguard Worker 456*6777b538SAndroid Build Coastguard Worker if (defined(invoker.import_dirs)) { 457*6777b538SAndroid Build Coastguard Worker foreach(path, invoker.import_dirs) { 458*6777b538SAndroid Build Coastguard Worker args += [ "--import-dir=" + rebase_path(path, root_build_dir) ] 459*6777b538SAndroid Build Coastguard Worker } 460*6777b538SAndroid Build Coastguard Worker } 461*6777b538SAndroid Build Coastguard Worker 462*6777b538SAndroid Build Coastguard Worker # System protoc is not used so it's necessary to build a chromium one. 463*6777b538SAndroid Build Coastguard Worker inputs += [ _protoc_path ] 464*6777b538SAndroid Build Coastguard Worker deps = [ _protoc_label ] 465*6777b538SAndroid Build Coastguard Worker 466*6777b538SAndroid Build Coastguard Worker if (enable_js_protobuf) { 467*6777b538SAndroid Build Coastguard Worker inputs += [ _protoc_gen_js_path ] 468*6777b538SAndroid Build Coastguard Worker deps += [ _protoc_gen_js_label ] 469*6777b538SAndroid Build Coastguard Worker } 470*6777b538SAndroid Build Coastguard Worker 471*6777b538SAndroid Build Coastguard Worker if (generate_with_plugin) { 472*6777b538SAndroid Build Coastguard Worker inputs += [ plugin_path ] 473*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generator_plugin_script_deps)) { 474*6777b538SAndroid Build Coastguard Worker # Additional scripts for plugin. 475*6777b538SAndroid Build Coastguard Worker inputs += invoker.generator_plugin_script_deps 476*6777b538SAndroid Build Coastguard Worker } 477*6777b538SAndroid Build Coastguard Worker if (defined(plugin_host_label)) { 478*6777b538SAndroid Build Coastguard Worker # Action depends on native generator plugin but for host toolchain only. 479*6777b538SAndroid Build Coastguard Worker deps += [ plugin_host_label ] 480*6777b538SAndroid Build Coastguard Worker } 481*6777b538SAndroid Build Coastguard Worker } 482*6777b538SAndroid Build Coastguard Worker 483*6777b538SAndroid Build Coastguard Worker # The deps may have steps that have to run before running protoc. 484*6777b538SAndroid Build Coastguard Worker if (defined(invoker.proto_deps)) { 485*6777b538SAndroid Build Coastguard Worker deps += invoker.proto_deps 486*6777b538SAndroid Build Coastguard Worker } 487*6777b538SAndroid Build Coastguard Worker if (defined(invoker.deps)) { 488*6777b538SAndroid Build Coastguard Worker deps += invoker.deps 489*6777b538SAndroid Build Coastguard Worker } 490*6777b538SAndroid Build Coastguard Worker } 491*6777b538SAndroid Build Coastguard Worker 492*6777b538SAndroid Build Coastguard Worker if (!generate_library) { 493*6777b538SAndroid Build Coastguard Worker # If only descriptor is required, just generate a group wrapper for action output. 494*6777b538SAndroid Build Coastguard Worker link_target_type = "group" 495*6777b538SAndroid Build Coastguard Worker } else if ((defined(invoker.force_source_set) && invoker.force_source_set) || 496*6777b538SAndroid Build Coastguard Worker (defined(invoker.component_build_force_source_set) && 497*6777b538SAndroid Build Coastguard Worker invoker.component_build_force_source_set && is_component_build)) { 498*6777b538SAndroid Build Coastguard Worker # Option to disable building a library in component build. 499*6777b538SAndroid Build Coastguard Worker link_target_type = "source_set" 500*6777b538SAndroid Build Coastguard Worker } else { 501*6777b538SAndroid Build Coastguard Worker link_target_type = "static_library" 502*6777b538SAndroid Build Coastguard Worker } 503*6777b538SAndroid Build Coastguard Worker 504*6777b538SAndroid Build Coastguard Worker # Generated files may include other generated headers. These includes always 505*6777b538SAndroid Build Coastguard Worker # use relative paths starting at |cc_out_dir|. 506*6777b538SAndroid Build Coastguard Worker # However there is no necessity to add an additional directory, if all protos 507*6777b538SAndroid Build Coastguard Worker # are located in the same directory which is in the search path by default. 508*6777b538SAndroid Build Coastguard Worker config_name = "${target_name}_config" 509*6777b538SAndroid Build Coastguard Worker config(config_name) { 510*6777b538SAndroid Build Coastguard Worker include_dirs = [] 511*6777b538SAndroid Build Coastguard Worker if (has_nested_dirs && generate_cc) { 512*6777b538SAndroid Build Coastguard Worker include_dirs += [ cc_out_dir ] 513*6777b538SAndroid Build Coastguard Worker } 514*6777b538SAndroid Build Coastguard Worker if (defined(invoker.import_dirs)) { 515*6777b538SAndroid Build Coastguard Worker foreach(path, invoker.import_dirs) { 516*6777b538SAndroid Build Coastguard Worker include_dirs += [ "$root_gen_dir/" + rebase_path(path, "//") ] 517*6777b538SAndroid Build Coastguard Worker } 518*6777b538SAndroid Build Coastguard Worker } 519*6777b538SAndroid Build Coastguard Worker } 520*6777b538SAndroid Build Coastguard Worker 521*6777b538SAndroid Build Coastguard Worker # Build generated javascript stubs. 522*6777b538SAndroid Build Coastguard Worker if (generate_javascript) { 523*6777b538SAndroid Build Coastguard Worker js_library(javascript_name) { 524*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 525*6777b538SAndroid Build Coastguard Worker [ 526*6777b538SAndroid Build Coastguard Worker "testonly", 527*6777b538SAndroid Build Coastguard Worker "visibility", 528*6777b538SAndroid Build Coastguard Worker ]) 529*6777b538SAndroid Build Coastguard Worker 530*6777b538SAndroid Build Coastguard Worker sources = protogens_js 531*6777b538SAndroid Build Coastguard Worker 532*6777b538SAndroid Build Coastguard Worker deps = [ "//third_party/protobuf:js_proto" ] 533*6777b538SAndroid Build Coastguard Worker 534*6777b538SAndroid Build Coastguard Worker extra_deps = [ ":$action_name" ] 535*6777b538SAndroid Build Coastguard Worker } 536*6777b538SAndroid Build Coastguard Worker } 537*6777b538SAndroid Build Coastguard Worker 538*6777b538SAndroid Build Coastguard Worker # Build generated protobuf stubs as libary or source set. 539*6777b538SAndroid Build Coastguard Worker target(link_target_type, target_name) { 540*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 541*6777b538SAndroid Build Coastguard Worker [ 542*6777b538SAndroid Build Coastguard Worker "defines", 543*6777b538SAndroid Build Coastguard Worker "testonly", 544*6777b538SAndroid Build Coastguard Worker "visibility", 545*6777b538SAndroid Build Coastguard Worker ]) 546*6777b538SAndroid Build Coastguard Worker 547*6777b538SAndroid Build Coastguard Worker if (generate_library) { 548*6777b538SAndroid Build Coastguard Worker sources = get_path_info(protogens_cc, "abspath") 549*6777b538SAndroid Build Coastguard Worker 550*6777b538SAndroid Build Coastguard Worker if (defined(invoker.remove_configs)) { 551*6777b538SAndroid Build Coastguard Worker configs -= invoker.remove_configs 552*6777b538SAndroid Build Coastguard Worker } 553*6777b538SAndroid Build Coastguard Worker 554*6777b538SAndroid Build Coastguard Worker if (defined(invoker.extra_configs)) { 555*6777b538SAndroid Build Coastguard Worker configs += invoker.extra_configs 556*6777b538SAndroid Build Coastguard Worker } 557*6777b538SAndroid Build Coastguard Worker 558*6777b538SAndroid Build Coastguard Worker # Remove Sanitizer and coverage instrumentation for a performance boost when 559*6777b538SAndroid Build Coastguard Worker # fuzzing, since the only fuzzers that use protobuf are libprotobuf-mutator 560*6777b538SAndroid Build Coastguard Worker # based fuzzers, and they don't actually target protobuf code. 561*6777b538SAndroid Build Coastguard Worker configs -= not_fuzzed_remove_configs 562*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/sanitizers:not_fuzzed" ] 563*6777b538SAndroid Build Coastguard Worker } 564*6777b538SAndroid Build Coastguard Worker 565*6777b538SAndroid Build Coastguard Worker public_configs = [ 566*6777b538SAndroid Build Coastguard Worker "//third_party/protobuf:using_proto", 567*6777b538SAndroid Build Coastguard Worker "//third_party/protobuf:allow_deprecated_proto_fields", 568*6777b538SAndroid Build Coastguard Worker ] 569*6777b538SAndroid Build Coastguard Worker public_deps = [] 570*6777b538SAndroid Build Coastguard Worker 571*6777b538SAndroid Build Coastguard Worker if (generate_cc || generate_with_plugin) { 572*6777b538SAndroid Build Coastguard Worker # Not necessary if all protos are located in the same directory. 573*6777b538SAndroid Build Coastguard Worker if (has_nested_dirs || defined(invoker.import_dirs)) { 574*6777b538SAndroid Build Coastguard Worker # By default, propagate the config for |include_dirs| to dependent 575*6777b538SAndroid Build Coastguard Worker # targets, so that public imports can be resolved to corresponding 576*6777b538SAndroid Build Coastguard Worker # header files. In some cases, the embedder target handles include 577*6777b538SAndroid Build Coastguard Worker # directory propagation itself, e.g. via a common config. 578*6777b538SAndroid Build Coastguard Worker propagate_imports_configs = 579*6777b538SAndroid Build Coastguard Worker !defined(invoker.propagate_imports_configs) || 580*6777b538SAndroid Build Coastguard Worker invoker.propagate_imports_configs 581*6777b538SAndroid Build Coastguard Worker if (propagate_imports_configs) { 582*6777b538SAndroid Build Coastguard Worker public_configs += [ ":$config_name" ] 583*6777b538SAndroid Build Coastguard Worker } else { 584*6777b538SAndroid Build Coastguard Worker # Embedder handles include directory propagation to dependents. 585*6777b538SAndroid Build Coastguard Worker configs += [ ":$config_name" ] 586*6777b538SAndroid Build Coastguard Worker } 587*6777b538SAndroid Build Coastguard Worker } 588*6777b538SAndroid Build Coastguard Worker 589*6777b538SAndroid Build Coastguard Worker # If using built-in cc generator, the resulting headers reference headers 590*6777b538SAndroid Build Coastguard Worker # within protobuf_lite. Hence, dependencies require those headers too. 591*6777b538SAndroid Build Coastguard Worker # If using generator plugin, extra deps should be resolved by the invoker. 592*6777b538SAndroid Build Coastguard Worker if (generate_cc) { 593*6777b538SAndroid Build Coastguard Worker if (defined(invoker.use_protobuf_full) && 594*6777b538SAndroid Build Coastguard Worker invoker.use_protobuf_full == true) { 595*6777b538SAndroid Build Coastguard Worker public_deps += [ "//third_party/protobuf:protobuf_full" ] 596*6777b538SAndroid Build Coastguard Worker } else { 597*6777b538SAndroid Build Coastguard Worker public_deps += [ "//third_party/protobuf:protobuf_lite" ] 598*6777b538SAndroid Build Coastguard Worker } 599*6777b538SAndroid Build Coastguard Worker 600*6777b538SAndroid Build Coastguard Worker if (is_win) { 601*6777b538SAndroid Build Coastguard Worker cflags = [ 602*6777b538SAndroid Build Coastguard Worker # disable: C4125 decimal digit terminates octal escape sequence 603*6777b538SAndroid Build Coastguard Worker # Protoc generates such sequences frequently, there's no obvious 604*6777b538SAndroid Build Coastguard Worker # superior replacement behavior. Since this code is autogenerated, 605*6777b538SAndroid Build Coastguard Worker # the warning would never catch a legitimate bug. 606*6777b538SAndroid Build Coastguard Worker "/wd4125", 607*6777b538SAndroid Build Coastguard Worker ] 608*6777b538SAndroid Build Coastguard Worker } 609*6777b538SAndroid Build Coastguard Worker } 610*6777b538SAndroid Build Coastguard Worker } 611*6777b538SAndroid Build Coastguard Worker 612*6777b538SAndroid Build Coastguard Worker public_deps += [ ":$action_name" ] 613*6777b538SAndroid Build Coastguard Worker deps = [] 614*6777b538SAndroid Build Coastguard Worker 615*6777b538SAndroid Build Coastguard Worker # This will link any libraries in the deps (the use of invoker.deps in the 616*6777b538SAndroid Build Coastguard Worker # action won't link it). 617*6777b538SAndroid Build Coastguard Worker if (defined(invoker.deps)) { 618*6777b538SAndroid Build Coastguard Worker deps += invoker.deps 619*6777b538SAndroid Build Coastguard Worker } 620*6777b538SAndroid Build Coastguard Worker if (defined(invoker.link_deps)) { 621*6777b538SAndroid Build Coastguard Worker deps += invoker.link_deps 622*6777b538SAndroid Build Coastguard Worker } 623*6777b538SAndroid Build Coastguard Worker } 624*6777b538SAndroid Build Coastguard Worker 625*6777b538SAndroid Build Coastguard Worker if (generate_py_runtime) { 626*6777b538SAndroid Build Coastguard Worker group(py_runtime_name) { 627*6777b538SAndroid Build Coastguard Worker data = protogens_py 628*6777b538SAndroid Build Coastguard Worker deps = [ 629*6777b538SAndroid Build Coastguard Worker ":$action_name", 630*6777b538SAndroid Build Coastguard Worker "//third_party/protobuf:py_proto_runtime", 631*6777b538SAndroid Build Coastguard Worker ] 632*6777b538SAndroid Build Coastguard Worker } 633*6777b538SAndroid Build Coastguard Worker } 634*6777b538SAndroid Build Coastguard Worker} 635*6777b538SAndroid Build Coastguard Worker 636*6777b538SAndroid Build Coastguard Worker# Convert a protocol buffer between text and binary formats. 637*6777b538SAndroid Build Coastguard Worker# This can be used to run protoc with the --encode or --decode options. 638*6777b538SAndroid Build Coastguard Worker# Parameters: 639*6777b538SAndroid Build Coastguard Worker# 640*6777b538SAndroid Build Coastguard Worker# sources: list of string 641*6777b538SAndroid Build Coastguard Worker# The sources to loop over and run protoc on 642*6777b538SAndroid Build Coastguard Worker# 643*6777b538SAndroid Build Coastguard Worker# inputs: list of string 644*6777b538SAndroid Build Coastguard Worker# The file dependencies for the action. This should be the list of .proto 645*6777b538SAndroid Build Coastguard Worker# files involved in the conversion operation. 646*6777b538SAndroid Build Coastguard Worker# 647*6777b538SAndroid Build Coastguard Worker# output_pattern: string 648*6777b538SAndroid Build Coastguard Worker# A path pattern with source expansion variables (like source_name_part) 649*6777b538SAndroid Build Coastguard Worker# for where the result of conversion should be placed. 650*6777b538SAndroid Build Coastguard Worker# 651*6777b538SAndroid Build Coastguard Worker# deps: (optional) list of label 652*6777b538SAndroid Build Coastguard Worker# Additional dependencies for the target. 653*6777b538SAndroid Build Coastguard Worker# 654*6777b538SAndroid Build Coastguard Worker# args: list of string 655*6777b538SAndroid Build Coastguard Worker# Arguments to pass to the protoc tool. This could include -I for include 656*6777b538SAndroid Build Coastguard Worker# paths, as well as the name of the proto file. 657*6777b538SAndroid Build Coastguard Worker# 658*6777b538SAndroid Build Coastguard Worker# 659*6777b538SAndroid Build Coastguard Worker# Example to convert a .textproto to a .binarybp: 660*6777b538SAndroid Build Coastguard Worker# protoc_convert("convert_foo") { 661*6777b538SAndroid Build Coastguard Worker# sources = [ 662*6777b538SAndroid Build Coastguard Worker# "test/data/example1.textproto", 663*6777b538SAndroid Build Coastguard Worker# "test/data/example2.textproto", 664*6777b538SAndroid Build Coastguard Worker# ] 665*6777b538SAndroid Build Coastguard Worker# inputs = [ 666*6777b538SAndroid Build Coastguard Worker# "//component/core/foo.proto", 667*6777b538SAndroid Build Coastguard Worker# ] 668*6777b538SAndroid Build Coastguard Worker# output_pattern = "$target_gen_dir/foo_data/{{source_name_part}}.binarypb" 669*6777b538SAndroid Build Coastguard Worker# args = [ 670*6777b538SAndroid Build Coastguard Worker# "--encode=foo.FooMessage", 671*6777b538SAndroid Build Coastguard Worker# "-I", 672*6777b538SAndroid Build Coastguard Worker# rebase_path("//"), 673*6777b538SAndroid Build Coastguard Worker# "component/core/foo.proto", 674*6777b538SAndroid Build Coastguard Worker# ] 675*6777b538SAndroid Build Coastguard Worker# } 676*6777b538SAndroid Build Coastguard Workertemplate("protoc_convert") { 677*6777b538SAndroid Build Coastguard Worker action_foreach(target_name) { 678*6777b538SAndroid Build Coastguard Worker script = "//tools/protoc_wrapper/protoc_convert.py" 679*6777b538SAndroid Build Coastguard Worker 680*6777b538SAndroid Build Coastguard Worker sources = invoker.sources 681*6777b538SAndroid Build Coastguard Worker 682*6777b538SAndroid Build Coastguard Worker inputs = invoker.inputs 683*6777b538SAndroid Build Coastguard Worker 684*6777b538SAndroid Build Coastguard Worker deps = [ _protoc_label ] 685*6777b538SAndroid Build Coastguard Worker if (defined(invoker.deps)) { 686*6777b538SAndroid Build Coastguard Worker deps += invoker.deps 687*6777b538SAndroid Build Coastguard Worker } 688*6777b538SAndroid Build Coastguard Worker 689*6777b538SAndroid Build Coastguard Worker if (defined(invoker.testonly)) { 690*6777b538SAndroid Build Coastguard Worker testonly = invoker.testonly 691*6777b538SAndroid Build Coastguard Worker } 692*6777b538SAndroid Build Coastguard Worker 693*6777b538SAndroid Build Coastguard Worker outputs = [ invoker.output_pattern ] 694*6777b538SAndroid Build Coastguard Worker 695*6777b538SAndroid Build Coastguard Worker args = [ 696*6777b538SAndroid Build Coastguard Worker "--protoc", 697*6777b538SAndroid Build Coastguard Worker "./" + rebase_path(_protoc_path, root_build_dir), 698*6777b538SAndroid Build Coastguard Worker "--infile", 699*6777b538SAndroid Build Coastguard Worker "{{source}}", 700*6777b538SAndroid Build Coastguard Worker "--outfile", 701*6777b538SAndroid Build Coastguard Worker rebase_path(invoker.output_pattern), 702*6777b538SAndroid Build Coastguard Worker ] + invoker.args 703*6777b538SAndroid Build Coastguard Worker } 704*6777b538SAndroid Build Coastguard Worker} 705