1*3f982cf4SFabien Sanglard# Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard# found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglardtemplate("proto_library") { 6*3f982cf4SFabien Sanglard assert(defined(invoker.sources), "Need sources for proto_library") 7*3f982cf4SFabien Sanglard proto_sources = invoker.sources 8*3f982cf4SFabien Sanglard 9*3f982cf4SFabien Sanglard proto_in_dir = rebase_path(get_path_info(proto_sources[0], "dir"), ".") 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard if (defined(invoker.proto_out_dir)) { 12*3f982cf4SFabien Sanglard proto_out_dir = rebase_path(invoker.proto_out_dir, "//") 13*3f982cf4SFabien Sanglard } else { 14*3f982cf4SFabien Sanglard # Absolute path to the directory of current BUILD.gn file excluding "//". 15*3f982cf4SFabien Sanglard proto_out_dir = rebase_path(".", "//") 16*3f982cf4SFabien Sanglard if (proto_in_dir != ".") { 17*3f982cf4SFabien Sanglard proto_out_dir += "/$proto_in_dir" 18*3f982cf4SFabien Sanglard } 19*3f982cf4SFabien Sanglard } 20*3f982cf4SFabien Sanglard cc_out_dir = "$root_gen_dir/" + proto_out_dir 21*3f982cf4SFabien Sanglard rel_cc_out_dir = rebase_path(cc_out_dir, root_build_dir) 22*3f982cf4SFabien Sanglard 23*3f982cf4SFabien Sanglard protos = rebase_path(invoker.sources, proto_in_dir) 24*3f982cf4SFabien Sanglard protogens_cc = [] 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard # List output files. 27*3f982cf4SFabien Sanglard foreach(proto, protos) { 28*3f982cf4SFabien Sanglard proto_dir = get_path_info(proto, "dir") 29*3f982cf4SFabien Sanglard proto_name = get_path_info(proto, "name") 30*3f982cf4SFabien Sanglard proto_path = proto_dir + "/" + proto_name 31*3f982cf4SFabien Sanglard 32*3f982cf4SFabien Sanglard protogens_cc += [ 33*3f982cf4SFabien Sanglard "$cc_out_dir/$proto_path.pb.h", 34*3f982cf4SFabien Sanglard "$cc_out_dir/$proto_path.pb.cc", 35*3f982cf4SFabien Sanglard ] 36*3f982cf4SFabien Sanglard } 37*3f982cf4SFabien Sanglard 38*3f982cf4SFabien Sanglard action_name = "${target_name}_gen" 39*3f982cf4SFabien Sanglard source_set_name = "$target_name" 40*3f982cf4SFabien Sanglard action(action_name) { 41*3f982cf4SFabien Sanglard visibility = [ ":$source_set_name" ] 42*3f982cf4SFabien Sanglard script = "//third_party/protobuf/protoc_wrapper.py" 43*3f982cf4SFabien Sanglard sources = proto_sources 44*3f982cf4SFabien Sanglard outputs = get_path_info(protogens_cc, "abspath") 45*3f982cf4SFabien Sanglard args = protos 46*3f982cf4SFabien Sanglard 47*3f982cf4SFabien Sanglard protoc_label = "//third_party/protobuf:protoc($host_toolchain)" 48*3f982cf4SFabien Sanglard protoc_path = get_label_info(protoc_label, "root_out_dir") + "/protoc" 49*3f982cf4SFabien Sanglard args += [ 50*3f982cf4SFabien Sanglard # Wrapper should never pick a system protoc. 51*3f982cf4SFabien Sanglard # Path should be rebased because |root_build_dir| for current toolchain 52*3f982cf4SFabien Sanglard # may be different from |root_out_dir| of protoc built on host toolchain. 53*3f982cf4SFabien Sanglard "--protoc", 54*3f982cf4SFabien Sanglard "./" + rebase_path(protoc_path, root_build_dir), 55*3f982cf4SFabien Sanglard "--proto-in-dir", 56*3f982cf4SFabien Sanglard rebase_path(proto_in_dir, root_build_dir), 57*3f982cf4SFabien Sanglard "--cc-out-dir", 58*3f982cf4SFabien Sanglard rel_cc_out_dir, 59*3f982cf4SFabien Sanglard ] 60*3f982cf4SFabien Sanglard 61*3f982cf4SFabien Sanglard if (defined(invoker.cc_generator_options)) { 62*3f982cf4SFabien Sanglard args += [ 63*3f982cf4SFabien Sanglard "--cc-options", 64*3f982cf4SFabien Sanglard invoker.cc_generator_options, 65*3f982cf4SFabien Sanglard ] 66*3f982cf4SFabien Sanglard } 67*3f982cf4SFabien Sanglard inputs = [ protoc_path ] 68*3f982cf4SFabien Sanglard deps = [ protoc_label ] 69*3f982cf4SFabien Sanglard } 70*3f982cf4SFabien Sanglard 71*3f982cf4SFabien Sanglard config_name = "${target_name}_config" 72*3f982cf4SFabien Sanglard config(config_name) { 73*3f982cf4SFabien Sanglard include_dirs = [] 74*3f982cf4SFabien Sanglard } 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard source_set(source_set_name) { 77*3f982cf4SFabien Sanglard forward_variables_from(invoker, 78*3f982cf4SFabien Sanglard [ 79*3f982cf4SFabien Sanglard "defines", 80*3f982cf4SFabien Sanglard "testonly", 81*3f982cf4SFabien Sanglard "visibility", 82*3f982cf4SFabien Sanglard ]) 83*3f982cf4SFabien Sanglard 84*3f982cf4SFabien Sanglard sources = get_path_info(protogens_cc, "abspath") 85*3f982cf4SFabien Sanglard public_configs = [ 86*3f982cf4SFabien Sanglard "//third_party/protobuf:using_proto", 87*3f982cf4SFabien Sanglard ":$config_name", 88*3f982cf4SFabien Sanglard ] 89*3f982cf4SFabien Sanglard public_deps = [ ":$action_name" ] 90*3f982cf4SFabien Sanglard if (defined(invoker.use_protobuf_full) && 91*3f982cf4SFabien Sanglard invoker.use_protobuf_full == true) { 92*3f982cf4SFabien Sanglard public_deps += [ "//third_party/protobuf:protobuf_full" ] 93*3f982cf4SFabien Sanglard } else { 94*3f982cf4SFabien Sanglard public_deps += [ "//third_party/protobuf:protobuf_lite" ] 95*3f982cf4SFabien Sanglard } 96*3f982cf4SFabien Sanglard 97*3f982cf4SFabien Sanglard deps = [] 98*3f982cf4SFabien Sanglard if (defined(invoker.deps)) { 99*3f982cf4SFabien Sanglard deps += invoker.deps 100*3f982cf4SFabien Sanglard } 101*3f982cf4SFabien Sanglard 102*3f982cf4SFabien Sanglard if (defined(invoker.removed_configs)) { 103*3f982cf4SFabien Sanglard configs -= invoker.removed_configs 104*3f982cf4SFabien Sanglard } 105*3f982cf4SFabien Sanglard if (defined(invoker.extra_configs)) { 106*3f982cf4SFabien Sanglard configs += invoker.extra_configs 107*3f982cf4SFabien Sanglard } 108*3f982cf4SFabien Sanglard } 109*3f982cf4SFabien Sanglard} 110