xref: /aosp_15_r20/external/openscreen/third_party/protobuf/proto_library.gni (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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