xref: /aosp_15_r20/external/grpc-grpc/templates/CMakeLists.txt.template (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker%YAML 1.2
2*cc02d7e2SAndroid Build Coastguard Worker--- |
3*cc02d7e2SAndroid Build Coastguard Worker  # GRPC global cmake file
4*cc02d7e2SAndroid Build Coastguard Worker  # This currently builds C and C++ code.
5*cc02d7e2SAndroid Build Coastguard Worker  # This file has been automatically generated from a template file.
6*cc02d7e2SAndroid Build Coastguard Worker  # Please look at the templates directory instead.
7*cc02d7e2SAndroid Build Coastguard Worker  # This file can be regenerated from the template by running
8*cc02d7e2SAndroid Build Coastguard Worker  # tools/buildgen/generate_projects.sh
9*cc02d7e2SAndroid Build Coastguard Worker  #
10*cc02d7e2SAndroid Build Coastguard Worker  # Copyright 2015 gRPC authors.
11*cc02d7e2SAndroid Build Coastguard Worker  #
12*cc02d7e2SAndroid Build Coastguard Worker  # Licensed under the Apache License, Version 2.0 (the "License");
13*cc02d7e2SAndroid Build Coastguard Worker  # you may not use this file except in compliance with the License.
14*cc02d7e2SAndroid Build Coastguard Worker  # You may obtain a copy of the License at
15*cc02d7e2SAndroid Build Coastguard Worker  #
16*cc02d7e2SAndroid Build Coastguard Worker  #     http://www.apache.org/licenses/LICENSE-2.0
17*cc02d7e2SAndroid Build Coastguard Worker  #
18*cc02d7e2SAndroid Build Coastguard Worker  # Unless required by applicable law or agreed to in writing, software
19*cc02d7e2SAndroid Build Coastguard Worker  # distributed under the License is distributed on an "AS IS" BASIS,
20*cc02d7e2SAndroid Build Coastguard Worker  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21*cc02d7e2SAndroid Build Coastguard Worker  # See the License for the specific language governing permissions and
22*cc02d7e2SAndroid Build Coastguard Worker  # limitations under the License.
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard Worker  <%
25*cc02d7e2SAndroid Build Coastguard Worker  import re
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Worker  proto_re = re.compile('(.*)\\.proto')
28*cc02d7e2SAndroid Build Coastguard Worker  lib_map = {lib.name: lib for lib in libs}
29*cc02d7e2SAndroid Build Coastguard Worker
30*cc02d7e2SAndroid Build Coastguard Worker  third_party_proto_prefixes = {lib.proto_prefix for lib in external_proto_libraries}
31*cc02d7e2SAndroid Build Coastguard Worker
32*cc02d7e2SAndroid Build Coastguard Worker  gpr_libs = ['gpr']
33*cc02d7e2SAndroid Build Coastguard Worker  grpc_libs = ['grpc', 'grpc_unsecure']
34*cc02d7e2SAndroid Build Coastguard Worker  grpcxx_libs = ['grpc++', 'grpc++_unsecure']
35*cc02d7e2SAndroid Build Coastguard Worker  protoc_libs = ['benchmark_helpers', 'grpc++_reflection', 'grpcpp_channelz']
36*cc02d7e2SAndroid Build Coastguard Worker
37*cc02d7e2SAndroid Build Coastguard Worker  def third_party_proto_import_path(path):
38*cc02d7e2SAndroid Build Coastguard Worker    """Removes third_party prefix to match ProtoBuf's relative import path."""
39*cc02d7e2SAndroid Build Coastguard Worker    for prefix in third_party_proto_prefixes:
40*cc02d7e2SAndroid Build Coastguard Worker      if path.startswith(prefix):
41*cc02d7e2SAndroid Build Coastguard Worker        return path[len(prefix):]
42*cc02d7e2SAndroid Build Coastguard Worker    return path
43*cc02d7e2SAndroid Build Coastguard Worker
44*cc02d7e2SAndroid Build Coastguard Worker  def proto_replace_ext(filename, ext):
45*cc02d7e2SAndroid Build Coastguard Worker    """Replace the .proto extension with given extension."""
46*cc02d7e2SAndroid Build Coastguard Worker    m = proto_re.match(filename)
47*cc02d7e2SAndroid Build Coastguard Worker    if not m:
48*cc02d7e2SAndroid Build Coastguard Worker      return filename
49*cc02d7e2SAndroid Build Coastguard Worker    return '${_gRPC_PROTO_GENS_DIR}/' + third_party_proto_import_path(m.group(1)) + ext
50*cc02d7e2SAndroid Build Coastguard Worker
51*cc02d7e2SAndroid Build Coastguard Worker  def is_absl_lib(lib_name):
52*cc02d7e2SAndroid Build Coastguard Worker    """Returns True if the library is one of the abseil libraries."""
53*cc02d7e2SAndroid Build Coastguard Worker    return lib_name.startswith("absl/")
54*cc02d7e2SAndroid Build Coastguard Worker
55*cc02d7e2SAndroid Build Coastguard Worker  def get_absl_dep(lib_name):
56*cc02d7e2SAndroid Build Coastguard Worker    """Gets the corresponding cmake target for given absl library."""
57*cc02d7e2SAndroid Build Coastguard Worker    # The "cmake_target" field originates from src/abseil-cpp/preprocessed_builds.yaml.gen.py
58*cc02d7e2SAndroid Build Coastguard Worker    return lib_map[lib_name].cmake_target
59*cc02d7e2SAndroid Build Coastguard Worker
60*cc02d7e2SAndroid Build Coastguard Worker  def get_transitive_deps(lib_name):
61*cc02d7e2SAndroid Build Coastguard Worker    """Get list of transitive deps for given library."""
62*cc02d7e2SAndroid Build Coastguard Worker    transitive_deps = []
63*cc02d7e2SAndroid Build Coastguard Worker    lib_metadata = lib_map.get(lib_name, None)
64*cc02d7e2SAndroid Build Coastguard Worker    if lib_metadata:
65*cc02d7e2SAndroid Build Coastguard Worker      transitive_deps = lib_metadata.transitive_deps
66*cc02d7e2SAndroid Build Coastguard Worker    return list(transitive_deps)
67*cc02d7e2SAndroid Build Coastguard Worker
68*cc02d7e2SAndroid Build Coastguard Worker  def list_abseil_pkg_targets(lib):
69*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): this function is odd, try to eliminate it.
70*cc02d7e2SAndroid Build Coastguard Worker    # This returns a list of abseil pkg targets which the given lib and
71*cc02d7e2SAndroid Build Coastguard Worker    # its non-abseil transitive dependencies depend on.
72*cc02d7e2SAndroid Build Coastguard Worker    # As a result, internal abseil libraries are excluded from the result.
73*cc02d7e2SAndroid Build Coastguard Worker    absl_specs = set()
74*cc02d7e2SAndroid Build Coastguard Worker    transitive_deps_and_self = [lib] + get_transitive_deps(lib)
75*cc02d7e2SAndroid Build Coastguard Worker    for lib_name in transitive_deps_and_self:
76*cc02d7e2SAndroid Build Coastguard Worker      if is_absl_lib(lib_name): continue
77*cc02d7e2SAndroid Build Coastguard Worker      lib_metadata = lib_map.get(lib_name, None)
78*cc02d7e2SAndroid Build Coastguard Worker      if lib_metadata:
79*cc02d7e2SAndroid Build Coastguard Worker        for dep in lib_metadata.deps:
80*cc02d7e2SAndroid Build Coastguard Worker          if is_absl_lib(dep):
81*cc02d7e2SAndroid Build Coastguard Worker            absl_specs.add(get_absl_dep(dep).replace("::", "_"))
82*cc02d7e2SAndroid Build Coastguard Worker    return list(sorted(absl_specs))
83*cc02d7e2SAndroid Build Coastguard Worker
84*cc02d7e2SAndroid Build Coastguard Worker  def lib_name_to_pkgconfig_requires_private_name(lib_name):
85*cc02d7e2SAndroid Build Coastguard Worker    """If library belongs to pkgconfig Requires.private section, return the name under which to include it."""
86*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): extract the metadata to a centralized location.
87*cc02d7e2SAndroid Build Coastguard Worker    deps_to_pkgconfig_requires_private = {
88*cc02d7e2SAndroid Build Coastguard Worker      "cares": "libcares",
89*cc02d7e2SAndroid Build Coastguard Worker      "libssl": "openssl",
90*cc02d7e2SAndroid Build Coastguard Worker      "re2": "re2",
91*cc02d7e2SAndroid Build Coastguard Worker      "z": "zlib",
92*cc02d7e2SAndroid Build Coastguard Worker    }
93*cc02d7e2SAndroid Build Coastguard Worker    return deps_to_pkgconfig_requires_private.get(lib_name, None)
94*cc02d7e2SAndroid Build Coastguard Worker
95*cc02d7e2SAndroid Build Coastguard Worker  def is_pkgconfig_package(lib_name):
96*cc02d7e2SAndroid Build Coastguard Worker    """Returns True if a pkgconfig package exists for a given library."""
97*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): extract the metadata to a centralized location.
98*cc02d7e2SAndroid Build Coastguard Worker    if lib_name in ["address_sorting", "utf8_range_lib"]:
99*cc02d7e2SAndroid Build Coastguard Worker      return False
100*cc02d7e2SAndroid Build Coastguard Worker    if lib_name == "upb" or lib_name.startswith("upb_"):
101*cc02d7e2SAndroid Build Coastguard Worker      # TODO(jtattermusch): Add better detection for what are the "upb" libs.
102*cc02d7e2SAndroid Build Coastguard Worker      return False
103*cc02d7e2SAndroid Build Coastguard Worker    return True
104*cc02d7e2SAndroid Build Coastguard Worker
105*cc02d7e2SAndroid Build Coastguard Worker  def get_pkgconfig_requires(lib):
106*cc02d7e2SAndroid Build Coastguard Worker    """Returns "Requires" list for generating the pkgconfig .pc file for given library."""
107*cc02d7e2SAndroid Build Coastguard Worker    requires = set()
108*cc02d7e2SAndroid Build Coastguard Worker    requires.update(list_abseil_pkg_targets(lib))
109*cc02d7e2SAndroid Build Coastguard Worker    for lib_name in get_transitive_deps(lib):
110*cc02d7e2SAndroid Build Coastguard Worker      if not is_pkgconfig_package(lib_name):
111*cc02d7e2SAndroid Build Coastguard Worker        # these deps go into Libs or Libs.Private
112*cc02d7e2SAndroid Build Coastguard Worker        continue
113*cc02d7e2SAndroid Build Coastguard Worker      if is_absl_lib(lib_name):
114*cc02d7e2SAndroid Build Coastguard Worker        # absl libs have special handling
115*cc02d7e2SAndroid Build Coastguard Worker        continue
116*cc02d7e2SAndroid Build Coastguard Worker      if lib_name_to_pkgconfig_requires_private_name(lib_name) is not None:
117*cc02d7e2SAndroid Build Coastguard Worker        # these deps go into Requires.private
118*cc02d7e2SAndroid Build Coastguard Worker        continue
119*cc02d7e2SAndroid Build Coastguard Worker      if lib_name == 'protobuf':
120*cc02d7e2SAndroid Build Coastguard Worker        # TODO(jtattermusch): add better way of excluding explicit protobuf dependency.
121*cc02d7e2SAndroid Build Coastguard Worker        continue
122*cc02d7e2SAndroid Build Coastguard Worker      if lib_name == 'opentelemetry-cpp::api':
123*cc02d7e2SAndroid Build Coastguard Worker        requires.add('opentelemetry_api')
124*cc02d7e2SAndroid Build Coastguard Worker      else:
125*cc02d7e2SAndroid Build Coastguard Worker        requires.add(lib_name)
126*cc02d7e2SAndroid Build Coastguard Worker    return list(sorted(requires))
127*cc02d7e2SAndroid Build Coastguard Worker
128*cc02d7e2SAndroid Build Coastguard Worker  def get_pkgconfig_requires_private(lib):
129*cc02d7e2SAndroid Build Coastguard Worker    """Returns the "Requires.private" list for generating the pkgconfig .pc file for given library."""
130*cc02d7e2SAndroid Build Coastguard Worker    private_requires = set()
131*cc02d7e2SAndroid Build Coastguard Worker    for lib_name in get_transitive_deps(lib):
132*cc02d7e2SAndroid Build Coastguard Worker      if is_absl_lib(lib_name):
133*cc02d7e2SAndroid Build Coastguard Worker        # absl deps to into Requires
134*cc02d7e2SAndroid Build Coastguard Worker        continue
135*cc02d7e2SAndroid Build Coastguard Worker      require_name = lib_name_to_pkgconfig_requires_private_name(lib_name)
136*cc02d7e2SAndroid Build Coastguard Worker      if require_name:
137*cc02d7e2SAndroid Build Coastguard Worker        private_requires.add(require_name)
138*cc02d7e2SAndroid Build Coastguard Worker    return list(sorted(private_requires))
139*cc02d7e2SAndroid Build Coastguard Worker
140*cc02d7e2SAndroid Build Coastguard Worker  def get_pkgconfig_libs(lib):
141*cc02d7e2SAndroid Build Coastguard Worker    """The "Libs" list for generating the pkgconfig .pc file for given library."""
142*cc02d7e2SAndroid Build Coastguard Worker    libs = set()
143*cc02d7e2SAndroid Build Coastguard Worker    # add self
144*cc02d7e2SAndroid Build Coastguard Worker    libs.add("-l" + lib)
145*cc02d7e2SAndroid Build Coastguard Worker    return list(sorted(libs))
146*cc02d7e2SAndroid Build Coastguard Worker
147*cc02d7e2SAndroid Build Coastguard Worker  def get_pkgconfig_libs_private(lib):
148*cc02d7e2SAndroid Build Coastguard Worker    """The "Libs.private" list for generating the pkgconfig .pc file for given library."""
149*cc02d7e2SAndroid Build Coastguard Worker    private_libs = []
150*cc02d7e2SAndroid Build Coastguard Worker    for lib_name in get_transitive_deps(lib):
151*cc02d7e2SAndroid Build Coastguard Worker      if is_absl_lib(lib_name):
152*cc02d7e2SAndroid Build Coastguard Worker        # absl deps to into Requires
153*cc02d7e2SAndroid Build Coastguard Worker        continue
154*cc02d7e2SAndroid Build Coastguard Worker      if is_pkgconfig_package(lib_name):
155*cc02d7e2SAndroid Build Coastguard Worker        continue
156*cc02d7e2SAndroid Build Coastguard Worker      # Transitive deps are pre-sorted in topological order.
157*cc02d7e2SAndroid Build Coastguard Worker      # We must maintain that order to prevent linkage errors.
158*cc02d7e2SAndroid Build Coastguard Worker      private_libs.append("-l" + lib_name)
159*cc02d7e2SAndroid Build Coastguard Worker    return private_libs
160*cc02d7e2SAndroid Build Coastguard Worker
161*cc02d7e2SAndroid Build Coastguard Worker  def lib_type_for_lib(lib_name):
162*cc02d7e2SAndroid Build Coastguard Worker    """Returns STATIC/SHARED to force a static or shared lib build depending on the library."""
163*cc02d7e2SAndroid Build Coastguard Worker    # grpc_csharp_ext is loaded by C# runtime and it
164*cc02d7e2SAndroid Build Coastguard Worker    # only makes sense as a shared lib.
165*cc02d7e2SAndroid Build Coastguard Worker    if lib_name in ['grpc_csharp_ext']:
166*cc02d7e2SAndroid Build Coastguard Worker      return ' SHARED'
167*cc02d7e2SAndroid Build Coastguard Worker
168*cc02d7e2SAndroid Build Coastguard Worker    # upb always compiles as a static library on Windows
169*cc02d7e2SAndroid Build Coastguard Worker    elif lib_name in ['upb','upb_collections_lib','upb_json_lib','upb_textformat_lib'] + protoc_libs:
170*cc02d7e2SAndroid Build Coastguard Worker      return ' ${_gRPC_STATIC_WIN32}'
171*cc02d7e2SAndroid Build Coastguard Worker
172*cc02d7e2SAndroid Build Coastguard Worker    else:
173*cc02d7e2SAndroid Build Coastguard Worker      return ''
174*cc02d7e2SAndroid Build Coastguard Worker
175*cc02d7e2SAndroid Build Coastguard Worker  def get_deps(target_dict):
176*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): remove special cases based on target names
177*cc02d7e2SAndroid Build Coastguard Worker    deps = []
178*cc02d7e2SAndroid Build Coastguard Worker    deps.append("${_gRPC_ALLTARGETS_LIBRARIES}")
179*cc02d7e2SAndroid Build Coastguard Worker    for d in target_dict.get('deps', []):
180*cc02d7e2SAndroid Build Coastguard Worker      if d == 'z':
181*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_ZLIB_LIBRARIES}")
182*cc02d7e2SAndroid Build Coastguard Worker      elif d == 'address_sorting':
183*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_ADDRESS_SORTING_LIBRARIES}")
184*cc02d7e2SAndroid Build Coastguard Worker      elif d == 'benchmark':
185*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_BENCHMARK_LIBRARIES}")
186*cc02d7e2SAndroid Build Coastguard Worker      elif d == 'libssl':
187*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_SSL_LIBRARIES}")
188*cc02d7e2SAndroid Build Coastguard Worker      elif d == 're2':
189*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_RE2_LIBRARIES}")
190*cc02d7e2SAndroid Build Coastguard Worker      elif d == 'cares':
191*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_CARES_LIBRARIES}")
192*cc02d7e2SAndroid Build Coastguard Worker      elif d == 'protobuf':
193*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_PROTOBUF_LIBRARIES}")
194*cc02d7e2SAndroid Build Coastguard Worker      elif d == 'protoc':
195*cc02d7e2SAndroid Build Coastguard Worker        deps.append("${_gRPC_PROTOBUF_PROTOC_LIBRARIES}")
196*cc02d7e2SAndroid Build Coastguard Worker      elif is_absl_lib(d):
197*cc02d7e2SAndroid Build Coastguard Worker        deps.append(get_absl_dep(d))
198*cc02d7e2SAndroid Build Coastguard Worker      # TODO(jtattermusch): add handling for upb libraries
199*cc02d7e2SAndroid Build Coastguard Worker      else:
200*cc02d7e2SAndroid Build Coastguard Worker        deps.append(d)
201*cc02d7e2SAndroid Build Coastguard Worker    return deps
202*cc02d7e2SAndroid Build Coastguard Worker
203*cc02d7e2SAndroid Build Coastguard Worker  def is_generate_cmake_target(lib_or_target):
204*cc02d7e2SAndroid Build Coastguard Worker    """Returns True if a cmake target should be generated for given library/target."""
205*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): extract the metadata to a centralized location.
206*cc02d7e2SAndroid Build Coastguard Worker    if lib_or_target.build not in ["all", "plugin", "plugin_test", "protoc", "tool", "test", "private"]:
207*cc02d7e2SAndroid Build Coastguard Worker      return False
208*cc02d7e2SAndroid Build Coastguard Worker    if lib_or_target.boringssl:
209*cc02d7e2SAndroid Build Coastguard Worker      # Don't generate target for boringssl libs or tests
210*cc02d7e2SAndroid Build Coastguard Worker      return False
211*cc02d7e2SAndroid Build Coastguard Worker    if lib_or_target.name in ['cares', 'benchmark', 're2', 'xxhash', 'z']:
212*cc02d7e2SAndroid Build Coastguard Worker      # we rely on these target to be created by external cmake builds.
213*cc02d7e2SAndroid Build Coastguard Worker      return False
214*cc02d7e2SAndroid Build Coastguard Worker    if is_absl_lib(lib_or_target.name):
215*cc02d7e2SAndroid Build Coastguard Worker      # we rely on absl targets to be created by an external cmake build.
216*cc02d7e2SAndroid Build Coastguard Worker      return False
217*cc02d7e2SAndroid Build Coastguard Worker    return True
218*cc02d7e2SAndroid Build Coastguard Worker
219*cc02d7e2SAndroid Build Coastguard Worker  def get_platforms_condition_begin(platforms):
220*cc02d7e2SAndroid Build Coastguard Worker    if all(platform in platforms for platform in ['linux', 'mac', 'posix', 'windows']):
221*cc02d7e2SAndroid Build Coastguard Worker      return ''
222*cc02d7e2SAndroid Build Coastguard Worker    cond = ' OR '.join(['_gRPC_PLATFORM_%s' % platform.upper() for platform in platforms])
223*cc02d7e2SAndroid Build Coastguard Worker    return 'if(%s)' % cond
224*cc02d7e2SAndroid Build Coastguard Worker
225*cc02d7e2SAndroid Build Coastguard Worker  def get_platforms_condition_end(platforms):
226*cc02d7e2SAndroid Build Coastguard Worker    if not get_platforms_condition_begin(platforms):
227*cc02d7e2SAndroid Build Coastguard Worker      return ''
228*cc02d7e2SAndroid Build Coastguard Worker    return 'endif()'
229*cc02d7e2SAndroid Build Coastguard Worker
230*cc02d7e2SAndroid Build Coastguard Worker  def platforms_condition_block(platforms):
231*cc02d7e2SAndroid Build Coastguard Worker    def _func(text):
232*cc02d7e2SAndroid Build Coastguard Worker      lines = text.split('\n')
233*cc02d7e2SAndroid Build Coastguard Worker      cond = get_platforms_condition_begin(platforms)
234*cc02d7e2SAndroid Build Coastguard Worker      if cond:
235*cc02d7e2SAndroid Build Coastguard Worker        # Remove empty line following <%block>
236*cc02d7e2SAndroid Build Coastguard Worker        del lines[0]
237*cc02d7e2SAndroid Build Coastguard Worker
238*cc02d7e2SAndroid Build Coastguard Worker        # Indent each line after
239*cc02d7e2SAndroid Build Coastguard Worker        for i, line in enumerate(lines[:-1]):
240*cc02d7e2SAndroid Build Coastguard Worker          if line:
241*cc02d7e2SAndroid Build Coastguard Worker            lines[i] = '  ' + line
242*cc02d7e2SAndroid Build Coastguard Worker
243*cc02d7e2SAndroid Build Coastguard Worker        # Add the condition block
244*cc02d7e2SAndroid Build Coastguard Worker        lines.insert(0, cond)
245*cc02d7e2SAndroid Build Coastguard Worker
246*cc02d7e2SAndroid Build Coastguard Worker        # Add endif() to the last line
247*cc02d7e2SAndroid Build Coastguard Worker        lines[-1] += 'endif()'
248*cc02d7e2SAndroid Build Coastguard Worker      else:
249*cc02d7e2SAndroid Build Coastguard Worker        # Remove empty line following <%block>
250*cc02d7e2SAndroid Build Coastguard Worker        del lines[0]
251*cc02d7e2SAndroid Build Coastguard Worker
252*cc02d7e2SAndroid Build Coastguard Worker        # Strip leading whitespace from first line
253*cc02d7e2SAndroid Build Coastguard Worker        lines[0] = lines[0].lstrip(' ')
254*cc02d7e2SAndroid Build Coastguard Worker
255*cc02d7e2SAndroid Build Coastguard Worker        # Remove empty line before </%block>
256*cc02d7e2SAndroid Build Coastguard Worker        del lines[-1]
257*cc02d7e2SAndroid Build Coastguard Worker
258*cc02d7e2SAndroid Build Coastguard Worker      return '\n'.join(lines)
259*cc02d7e2SAndroid Build Coastguard Worker    return _func
260*cc02d7e2SAndroid Build Coastguard Worker
261*cc02d7e2SAndroid Build Coastguard Worker  %>
262*cc02d7e2SAndroid Build Coastguard Worker  <%
263*cc02d7e2SAndroid Build Coastguard Worker  # These files are added to a set so that they are not duplicated if multiple
264*cc02d7e2SAndroid Build Coastguard Worker  # targets use them. Generating the same file multiple times with
265*cc02d7e2SAndroid Build Coastguard Worker  # add_custom_command() is not allowed in CMake.
266*cc02d7e2SAndroid Build Coastguard Worker
267*cc02d7e2SAndroid Build Coastguard Worker  protobuf_gen_files = set()
268*cc02d7e2SAndroid Build Coastguard Worker  for tgt in targets:
269*cc02d7e2SAndroid Build Coastguard Worker    for src in tgt.src:
270*cc02d7e2SAndroid Build Coastguard Worker      if proto_re.match(src):
271*cc02d7e2SAndroid Build Coastguard Worker        protobuf_gen_files.add(src)
272*cc02d7e2SAndroid Build Coastguard Worker  for lib in libs:
273*cc02d7e2SAndroid Build Coastguard Worker    for src in lib.src:
274*cc02d7e2SAndroid Build Coastguard Worker      if proto_re.match(src):
275*cc02d7e2SAndroid Build Coastguard Worker        protobuf_gen_files.add(src)
276*cc02d7e2SAndroid Build Coastguard Worker  %>
277*cc02d7e2SAndroid Build Coastguard Worker
278*cc02d7e2SAndroid Build Coastguard Worker  cmake_minimum_required(VERSION 3.13)
279*cc02d7e2SAndroid Build Coastguard Worker
280*cc02d7e2SAndroid Build Coastguard Worker  set(PACKAGE_NAME          "grpc")
281*cc02d7e2SAndroid Build Coastguard Worker  set(PACKAGE_VERSION       "${settings.cpp_version}")
282*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_CORE_VERSION     "${settings.core_version}")
283*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_CORE_SOVERSION   "${settings.core_version.major}")
284*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_CPP_VERSION      "${settings.cpp_version}")
285*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_CPP_SOVERSION    "${settings.cpp_version.major}.${settings.cpp_version.minor}")
286*cc02d7e2SAndroid Build Coastguard Worker  set(PACKAGE_STRING        "<%text>${PACKAGE_NAME} ${PACKAGE_VERSION}</%text>")
287*cc02d7e2SAndroid Build Coastguard Worker  set(PACKAGE_TARNAME       "<%text>${PACKAGE_NAME}-${PACKAGE_VERSION}</%text>")
288*cc02d7e2SAndroid Build Coastguard Worker  set(PACKAGE_BUGREPORT     "https://github.com/grpc/grpc/issues/")
289*cc02d7e2SAndroid Build Coastguard Worker  project(<%text>${PACKAGE_NAME}</%text> LANGUAGES C CXX)
290*cc02d7e2SAndroid Build Coastguard Worker
291*cc02d7e2SAndroid Build Coastguard Worker  if(BUILD_SHARED_LIBS AND MSVC)
292*cc02d7e2SAndroid Build Coastguard Worker    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
293*cc02d7e2SAndroid Build Coastguard Worker  endif()
294*cc02d7e2SAndroid Build Coastguard Worker
295*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables")
296*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries")
297*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_INSTALL_INCLUDEDIR "include" CACHE STRING "Installation directory for headers")
298*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_INSTALL_CMAKEDIR "lib/cmake/<%text>${PACKAGE_NAME}</%text>" CACHE STRING "Installation directory for cmake config files")
299*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_INSTALL_SHAREDIR "share/grpc" CACHE STRING "Installation directory for root certificates")
300*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_BUILD_MSVC_MP_COUNT 0 CACHE STRING "The maximum number of processes for MSVC /MP option")
301*cc02d7e2SAndroid Build Coastguard Worker
302*cc02d7e2SAndroid Build Coastguard Worker  # Options
303*cc02d7e2SAndroid Build Coastguard Worker  option(gRPC_BUILD_TESTS "Build tests" OFF)
304*cc02d7e2SAndroid Build Coastguard Worker  option(gRPC_BUILD_CODEGEN "Build codegen" ON)
305*cc02d7e2SAndroid Build Coastguard Worker  option(gRPC_DOWNLOAD_ARCHIVES "Download archives for empty 3rd party directories" ON)
306*cc02d7e2SAndroid Build Coastguard Worker
307*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_INSTALL_default ON)
308*cc02d7e2SAndroid Build Coastguard Worker  if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
309*cc02d7e2SAndroid Build Coastguard Worker    # Disable gRPC_INSTALL by default if building as a submodule
310*cc02d7e2SAndroid Build Coastguard Worker    set(gRPC_INSTALL_default OFF)
311*cc02d7e2SAndroid Build Coastguard Worker  endif()
312*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_INSTALL <%text>${gRPC_INSTALL_default}</%text> CACHE BOOL
313*cc02d7e2SAndroid Build Coastguard Worker      "Generate installation target")
314*cc02d7e2SAndroid Build Coastguard Worker
315*cc02d7e2SAndroid Build Coastguard Worker  # We can install dependencies from submodules if we're running
316*cc02d7e2SAndroid Build Coastguard Worker  # CMake v3.13 or newer.
317*cc02d7e2SAndroid Build Coastguard Worker  if(CMAKE_VERSION VERSION_LESS 3.13)
318*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE OFF)
319*cc02d7e2SAndroid Build Coastguard Worker  else()
320*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE ON)
321*cc02d7e2SAndroid Build Coastguard Worker  endif()
322*cc02d7e2SAndroid Build Coastguard Worker
323*cc02d7e2SAndroid Build Coastguard Worker  # Providers for third-party dependencies (gRPC_*_PROVIDER properties):
324*cc02d7e2SAndroid Build Coastguard Worker  # "module": build the dependency using sources from git submodule (under third_party)
325*cc02d7e2SAndroid Build Coastguard Worker  # "package": use cmake's find_package functionality to locate a pre-installed dependency
326*cc02d7e2SAndroid Build Coastguard Worker
327*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "Provider of zlib library")
328*cc02d7e2SAndroid Build Coastguard Worker  set_property(CACHE gRPC_ZLIB_PROVIDER PROPERTY STRINGS "module" "package")
329*cc02d7e2SAndroid Build Coastguard Worker
330*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_CARES_PROVIDER "module" CACHE STRING "Provider of c-ares library")
331*cc02d7e2SAndroid Build Coastguard Worker  set_property(CACHE gRPC_CARES_PROVIDER PROPERTY STRINGS "module" "package")
332*cc02d7e2SAndroid Build Coastguard Worker
333*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_RE2_PROVIDER "module" CACHE STRING "Provider of re2 library")
334*cc02d7e2SAndroid Build Coastguard Worker  set_property(CACHE gRPC_RE2_PROVIDER PROPERTY STRINGS "module" "package")
335*cc02d7e2SAndroid Build Coastguard Worker
336*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_SSL_PROVIDER "module" CACHE STRING "Provider of ssl library")
337*cc02d7e2SAndroid Build Coastguard Worker  set_property(CACHE gRPC_SSL_PROVIDER PROPERTY STRINGS "module" "package")
338*cc02d7e2SAndroid Build Coastguard Worker
339*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library")
340*cc02d7e2SAndroid Build Coastguard Worker  set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package")
341*cc02d7e2SAndroid Build Coastguard Worker
342*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_TESTS)
343*cc02d7e2SAndroid Build Coastguard Worker    set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library")
344*cc02d7e2SAndroid Build Coastguard Worker    set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package")
345*cc02d7e2SAndroid Build Coastguard Worker  else()
346*cc02d7e2SAndroid Build Coastguard Worker    set(gRPC_BENCHMARK_PROVIDER "none")
347*cc02d7e2SAndroid Build Coastguard Worker  endif()
348*cc02d7e2SAndroid Build Coastguard Worker
349*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_ABSL_PROVIDER "module" CACHE STRING "Provider of absl library")
350*cc02d7e2SAndroid Build Coastguard Worker  set_property(CACHE gRPC_ABSL_PROVIDER PROPERTY STRINGS "module" "package")
351*cc02d7e2SAndroid Build Coastguard Worker  <%
352*cc02d7e2SAndroid Build Coastguard Worker    # Collect all abseil rules used by gpr, grpc, so on.
353*cc02d7e2SAndroid Build Coastguard Worker    used_abseil_rules = set()
354*cc02d7e2SAndroid Build Coastguard Worker    for lib in libs:
355*cc02d7e2SAndroid Build Coastguard Worker      if lib.get("baselib"):
356*cc02d7e2SAndroid Build Coastguard Worker        for dep in lib.transitive_deps:
357*cc02d7e2SAndroid Build Coastguard Worker          if is_absl_lib(dep):
358*cc02d7e2SAndroid Build Coastguard Worker            used_abseil_rules.add(lib_map[dep].cmake_target.replace("::", "_"))
359*cc02d7e2SAndroid Build Coastguard Worker  %>
360*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_ABSL_USED_TARGETS
361*cc02d7e2SAndroid Build Coastguard Worker  % for rule in sorted(used_abseil_rules):
362*cc02d7e2SAndroid Build Coastguard Worker    ${rule}
363*cc02d7e2SAndroid Build Coastguard Worker  % endfor
364*cc02d7e2SAndroid Build Coastguard Worker    absl_meta
365*cc02d7e2SAndroid Build Coastguard Worker  )
366*cc02d7e2SAndroid Build Coastguard Worker
367*cc02d7e2SAndroid Build Coastguard Worker  # The OpenTelemetry plugin supports "package" build only at present.
368*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_OPENTELEMETRY_PROVIDER "package")
369*cc02d7e2SAndroid Build Coastguard Worker  #  set(gRPC_OPENTELEMETRY_PROVIDER "module" CACHE STRING "Provider of opentelemetry library")
370*cc02d7e2SAndroid Build Coastguard Worker  #  set_property(CACHE gRPC_OPENTELEMETRY_PROVIDER PROPERTY STRINGS "module" "package")
371*cc02d7e2SAndroid Build Coastguard Worker
372*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library")
373*cc02d7e2SAndroid Build Coastguard Worker
374*cc02d7e2SAndroid Build Coastguard Worker  if(UNIX)
375*cc02d7e2SAndroid Build Coastguard Worker    if(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Linux")
376*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_PLATFORM_LINUX ON)
377*cc02d7e2SAndroid Build Coastguard Worker      if(NOT CMAKE_CROSSCOMPILING AND CMAKE_SIZEOF_VOID_P EQUAL 4)
378*cc02d7e2SAndroid Build Coastguard Worker        message("+++ Enabling SSE2 for <%text>${CMAKE_SYSTEM_PROCESSOR}</%text>")
379*cc02d7e2SAndroid Build Coastguard Worker        set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> -msse2")
380*cc02d7e2SAndroid Build Coastguard Worker      endif()
381*cc02d7e2SAndroid Build Coastguard Worker    elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Darwin")
382*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_PLATFORM_MAC ON)
383*cc02d7e2SAndroid Build Coastguard Worker    elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "iOS")
384*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_PLATFORM_IOS ON)
385*cc02d7e2SAndroid Build Coastguard Worker    elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Android")
386*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_PLATFORM_ANDROID ON)
387*cc02d7e2SAndroid Build Coastguard Worker    else()
388*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_PLATFORM_POSIX ON)
389*cc02d7e2SAndroid Build Coastguard Worker    endif()
390*cc02d7e2SAndroid Build Coastguard Worker  endif()
391*cc02d7e2SAndroid Build Coastguard Worker  if(WIN32)
392*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_PLATFORM_WINDOWS ON)
393*cc02d7e2SAndroid Build Coastguard Worker  endif()
394*cc02d7e2SAndroid Build Coastguard Worker
395*cc02d7e2SAndroid Build Coastguard Worker  if (APPLE AND NOT DEFINED CMAKE_CXX_STANDARD)
396*cc02d7e2SAndroid Build Coastguard Worker    # AppleClang defaults to C++98, so we bump it to C++14.
397*cc02d7e2SAndroid Build Coastguard Worker    message("CMAKE_CXX_STANDARD was undefined, defaulting to C++14.")
398*cc02d7e2SAndroid Build Coastguard Worker    set(CMAKE_CXX_STANDARD 14)
399*cc02d7e2SAndroid Build Coastguard Worker  endif ()
400*cc02d7e2SAndroid Build Coastguard Worker
401*cc02d7e2SAndroid Build Coastguard Worker  ## Some libraries are shared even with BUILD_SHARED_LIBRARIES=OFF
402*cc02d7e2SAndroid Build Coastguard Worker  if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
403*cc02d7e2SAndroid Build Coastguard Worker    set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
404*cc02d7e2SAndroid Build Coastguard Worker  endif()
405*cc02d7e2SAndroid Build Coastguard Worker  list(APPEND CMAKE_MODULE_PATH "<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules")
406*cc02d7e2SAndroid Build Coastguard Worker
407*cc02d7e2SAndroid Build Coastguard Worker  if(MSVC)
408*cc02d7e2SAndroid Build Coastguard Worker    include(cmake/msvc_static_runtime.cmake)
409*cc02d7e2SAndroid Build Coastguard Worker    add_definitions(-D_WIN32_WINNT=0x600 -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
410*cc02d7e2SAndroid Build Coastguard Worker    # Set /MP option
411*cc02d7e2SAndroid Build Coastguard Worker    if (gRPC_BUILD_MSVC_MP_COUNT GREATER 0)
412*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS} /MP${gRPC_BUILD_MSVC_MP_COUNT}</%text>")
413*cc02d7e2SAndroid Build Coastguard Worker    elseif (gRPC_BUILD_MSVC_MP_COUNT LESS 0)
414*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /MP")
415*cc02d7e2SAndroid Build Coastguard Worker    endif()
416*cc02d7e2SAndroid Build Coastguard Worker    # needed to compile protobuf
417*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4065 /wd4506")
418*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): revisit warnings that were silenced as part of upgrade to protobuf3.6.0
419*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4200 /wd4291 /wd4244")
420*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): revisit C4267 occurrences throughout the code
421*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4267")
422*cc02d7e2SAndroid Build Coastguard Worker    # TODO(jtattermusch): needed to build boringssl with VS2017, revisit later
423*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4987 /wd4774 /wd4819 /wd4996 /wd4619")
424*cc02d7e2SAndroid Build Coastguard Worker    # Silences thousands of trucation warnings
425*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4503")
426*cc02d7e2SAndroid Build Coastguard Worker    # Tell MSVC to build grpc using utf-8
427*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /utf-8")
428*cc02d7e2SAndroid Build Coastguard Worker    # Inconsistent object sizes can cause stack corruption and should be treated as an error
429*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /we4789")
430*cc02d7e2SAndroid Build Coastguard Worker    # To decrease the size of PDB files
431*cc02d7e2SAndroid Build Coastguard Worker    set(CMAKE_EXE_LINKER_FLAGS "/opt:ref /opt:icf /pdbcompress")
432*cc02d7e2SAndroid Build Coastguard Worker  endif()
433*cc02d7e2SAndroid Build Coastguard Worker  if (MINGW)
434*cc02d7e2SAndroid Build Coastguard Worker    add_definitions(-D_WIN32_WINNT=0x600)
435*cc02d7e2SAndroid Build Coastguard Worker  endif()
436*cc02d7e2SAndroid Build Coastguard Worker  set(CMAKE_C_FLAGS "<%text>${CMAKE_C_FLAGS} ${_gRPC_C_CXX_FLAGS}</%text>")
437*cc02d7e2SAndroid Build Coastguard Worker  set(CMAKE_CXX_FLAGS "<%text>${CMAKE_CXX_FLAGS} ${_gRPC_C_CXX_FLAGS}</%text>")
438*cc02d7e2SAndroid Build Coastguard Worker
439*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_USE_PROTO_LITE)
440*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf-lite")
441*cc02d7e2SAndroid Build Coastguard Worker    add_definitions("-DGRPC_USE_PROTO_LITE")
442*cc02d7e2SAndroid Build Coastguard Worker  else()
443*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf")
444*cc02d7e2SAndroid Build Coastguard Worker  endif()
445*cc02d7e2SAndroid Build Coastguard Worker
446*cc02d7e2SAndroid Build Coastguard Worker  if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS)
447*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_CORE_NOSTDCXX_FLAGS -fno-exceptions -fno-rtti)
448*cc02d7e2SAndroid Build Coastguard Worker  else()
449*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_CORE_NOSTDCXX_FLAGS "")
450*cc02d7e2SAndroid Build Coastguard Worker  endif()
451*cc02d7e2SAndroid Build Coastguard Worker
452*cc02d7e2SAndroid Build Coastguard Worker  if(UNIX AND NOT HAIKU)
453*cc02d7e2SAndroid Build Coastguard Worker    # -pthread does more than -lpthread
454*cc02d7e2SAndroid Build Coastguard Worker    set(THREADS_PREFER_PTHREAD_FLAG ON)
455*cc02d7e2SAndroid Build Coastguard Worker    find_package(Threads)
456*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_ALLTARGETS_LIBRARIES <%text>${CMAKE_DL_LIBS}</%text> m Threads::Threads)
457*cc02d7e2SAndroid Build Coastguard Worker    if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
458*cc02d7e2SAndroid Build Coastguard Worker      find_library(LIBRT rt)
459*cc02d7e2SAndroid Build Coastguard Worker      if(LIBRT)
460*cc02d7e2SAndroid Build Coastguard Worker        set(_gRPC_ALLTARGETS_LIBRARIES <%text>${_gRPC_ALLTARGETS_LIBRARIES}</%text> rt)
461*cc02d7e2SAndroid Build Coastguard Worker      endif()
462*cc02d7e2SAndroid Build Coastguard Worker    endif()
463*cc02d7e2SAndroid Build Coastguard Worker  endif()
464*cc02d7e2SAndroid Build Coastguard Worker
465*cc02d7e2SAndroid Build Coastguard Worker  include(CheckCXXSourceCompiles)
466*cc02d7e2SAndroid Build Coastguard Worker
467*cc02d7e2SAndroid Build Coastguard Worker  if(UNIX OR APPLE)
468*cc02d7e2SAndroid Build Coastguard Worker    # Some systems require the __STDC_FORMAT_MACROS macro to be defined
469*cc02d7e2SAndroid Build Coastguard Worker    # to get the fixed-width integer type formatter macros.
470*cc02d7e2SAndroid Build Coastguard Worker    check_cxx_source_compiles("#include <inttypes.h>
471*cc02d7e2SAndroid Build Coastguard Worker    #include <cstdio>
472*cc02d7e2SAndroid Build Coastguard Worker    int main()
473*cc02d7e2SAndroid Build Coastguard Worker    {
474*cc02d7e2SAndroid Build Coastguard Worker      int64_t i64{};
475*cc02d7e2SAndroid Build Coastguard Worker      std::printf(\"%\" PRId64, i64);
476*cc02d7e2SAndroid Build Coastguard Worker    }"
477*cc02d7e2SAndroid Build Coastguard Worker    HAVE_STDC_FORMAT_MACROS)
478*cc02d7e2SAndroid Build Coastguard Worker    if(NOT HAVE_STDC_FORMAT_MACROS)
479*cc02d7e2SAndroid Build Coastguard Worker      add_definitions(-D__STDC_FORMAT_MACROS)
480*cc02d7e2SAndroid Build Coastguard Worker    endif()
481*cc02d7e2SAndroid Build Coastguard Worker  endif()
482*cc02d7e2SAndroid Build Coastguard Worker
483*cc02d7e2SAndroid Build Coastguard Worker  # configure ccache if requested
484*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/ccache.cmake)
485*cc02d7e2SAndroid Build Coastguard Worker
486*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/abseil-cpp.cmake)
487*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/address_sorting.cmake)
488*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/benchmark.cmake)
489*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/cares.cmake)
490*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/protobuf.cmake)
491*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/re2.cmake)
492*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/ssl.cmake)
493*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/upb.cmake)
494*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/xxhash.cmake)
495*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/zlib.cmake)
496*cc02d7e2SAndroid Build Coastguard Worker  include(cmake/download_archive.cmake)
497*cc02d7e2SAndroid Build Coastguard Worker
498*cc02d7e2SAndroid Build Coastguard Worker  if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
499*cc02d7e2SAndroid Build Coastguard Worker    include(cmake/systemd.cmake)
500*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_ALLTARGETS_LIBRARIES <%text>${_gRPC_ALLTARGETS_LIBRARIES}</%text> <%text>${_gRPC_SYSTEMD_LIBRARIES}</%text>)
501*cc02d7e2SAndroid Build Coastguard Worker  endif()
502*cc02d7e2SAndroid Build Coastguard Worker
503*cc02d7e2SAndroid Build Coastguard Worker  option(gRPC_BUILD_GRPCPP_OTEL_PLUGIN "Build grpcpp_otel_plugin" OFF)
504*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_GRPCPP_OTEL_PLUGIN)
505*cc02d7e2SAndroid Build Coastguard Worker    include(cmake/opentelemetry-cpp.cmake)
506*cc02d7e2SAndroid Build Coastguard Worker  endif()
507*cc02d7e2SAndroid Build Coastguard Worker
508*cc02d7e2SAndroid Build Coastguard Worker  % for external_proto_library in external_proto_libraries:
509*cc02d7e2SAndroid Build Coastguard Worker  % if len(external_proto_library.urls) > 1:
510*cc02d7e2SAndroid Build Coastguard Worker  # Setup external proto library at ${external_proto_library.destination} with ${len(external_proto_library.urls)} download URLs
511*cc02d7e2SAndroid Build Coastguard Worker  % else:
512*cc02d7e2SAndroid Build Coastguard Worker  # Setup external proto library at ${external_proto_library.destination} if it doesn't exist
513*cc02d7e2SAndroid Build Coastguard Worker  % endif
514*cc02d7e2SAndroid Build Coastguard Worker  % for download_url in external_proto_library.urls:
515*cc02d7e2SAndroid Build Coastguard Worker  if (NOT EXISTS <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/${external_proto_library.destination} AND gRPC_DOWNLOAD_ARCHIVES)
516*cc02d7e2SAndroid Build Coastguard Worker    # Download the archive via HTTP, validate the checksum, and extract to ${external_proto_library.destination}.
517*cc02d7e2SAndroid Build Coastguard Worker    download_archive(
518*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/${external_proto_library.destination}
519*cc02d7e2SAndroid Build Coastguard Worker      ${download_url}
520*cc02d7e2SAndroid Build Coastguard Worker      ${external_proto_library.hash}
521*cc02d7e2SAndroid Build Coastguard Worker      ${external_proto_library.strip_prefix}
522*cc02d7e2SAndroid Build Coastguard Worker    )
523*cc02d7e2SAndroid Build Coastguard Worker  endif()
524*cc02d7e2SAndroid Build Coastguard Worker  % endfor
525*cc02d7e2SAndroid Build Coastguard Worker  % endfor
526*cc02d7e2SAndroid Build Coastguard Worker
527*cc02d7e2SAndroid Build Coastguard Worker  if(WIN32)
528*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_ALLTARGETS_LIBRARIES <%text>${_gRPC_ALLTARGETS_LIBRARIES}</%text> ws2_32 crypt32)
529*cc02d7e2SAndroid Build Coastguard Worker    set(_gRPC_STATIC_WIN32 STATIC)
530*cc02d7e2SAndroid Build Coastguard Worker  endif()
531*cc02d7e2SAndroid Build Coastguard Worker
532*cc02d7e2SAndroid Build Coastguard Worker  if(BUILD_SHARED_LIBS AND WIN32)
533*cc02d7e2SAndroid Build Coastguard Worker
534*cc02d7e2SAndroid Build Coastguard Worker  # Currently for shared lib on Windows (i.e. a DLL) certain bits of source code
535*cc02d7e2SAndroid Build Coastguard Worker  # are generated from protobuf definitions by upbc. This source code does not include
536*cc02d7e2SAndroid Build Coastguard Worker  # annotations needed to export these functions from grpc.lib so we have to
537*cc02d7e2SAndroid Build Coastguard Worker  # re-include a small subset of these.
538*cc02d7e2SAndroid Build Coastguard Worker  #
539*cc02d7e2SAndroid Build Coastguard Worker  # This is not an ideal situation because these functions will be unavailable
540*cc02d7e2SAndroid Build Coastguard Worker  # to clients of grpc and the libraries that need this (e.g. grpc++) will
541*cc02d7e2SAndroid Build Coastguard Worker  # include redundant duplicate code. Hence, the duplication is only activated
542*cc02d7e2SAndroid Build Coastguard Worker  # for DLL builds - and should be completely removed when source files are
543*cc02d7e2SAndroid Build Coastguard Worker  # generated with the necessary __declspec annotations.
544*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_UPB_GEN_DUPL_SRC
545*cc02d7e2SAndroid Build Coastguard Worker    src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.c
546*cc02d7e2SAndroid Build Coastguard Worker    src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c
547*cc02d7e2SAndroid Build Coastguard Worker    src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.c
548*cc02d7e2SAndroid Build Coastguard Worker  )
549*cc02d7e2SAndroid Build Coastguard Worker
550*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_ADDITIONAL_DLL_SRC
551*cc02d7e2SAndroid Build Coastguard Worker    src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc
552*cc02d7e2SAndroid Build Coastguard Worker    src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc
553*cc02d7e2SAndroid Build Coastguard Worker    src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc
554*cc02d7e2SAndroid Build Coastguard Worker    src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc
555*cc02d7e2SAndroid Build Coastguard Worker  )
556*cc02d7e2SAndroid Build Coastguard Worker
557*cc02d7e2SAndroid Build Coastguard Worker  set(gRPC_ADDITIONAL_DLL_CXX_SRC
558*cc02d7e2SAndroid Build Coastguard Worker    src/cpp/common/tls_certificate_provider.cc
559*cc02d7e2SAndroid Build Coastguard Worker    src/cpp/common/tls_certificate_verifier.cc
560*cc02d7e2SAndroid Build Coastguard Worker    src/cpp/common/tls_credentials_options.cc
561*cc02d7e2SAndroid Build Coastguard Worker  )
562*cc02d7e2SAndroid Build Coastguard Worker
563*cc02d7e2SAndroid Build Coastguard Worker  endif() # BUILD_SHARED_LIBS AND WIN32
564*cc02d7e2SAndroid Build Coastguard Worker
565*cc02d7e2SAndroid Build Coastguard Worker  # Create directory for proto source files
566*cc02d7e2SAndroid Build Coastguard Worker  set(_gRPC_PROTO_SRCS_DIR <%text>${CMAKE_BINARY_DIR}/protos</%text>)
567*cc02d7e2SAndroid Build Coastguard Worker  file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_SRCS_DIR}</%text>)
568*cc02d7e2SAndroid Build Coastguard Worker  # Create directory for generated .proto files
569*cc02d7e2SAndroid Build Coastguard Worker  set(_gRPC_PROTO_GENS_DIR <%text>${CMAKE_BINARY_DIR}/gens</%text>)
570*cc02d7e2SAndroid Build Coastguard Worker  file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_GENS_DIR}</%text>)
571*cc02d7e2SAndroid Build Coastguard Worker
572*cc02d7e2SAndroid Build Coastguard Worker  #  protobuf_generate_grpc_cpp
573*cc02d7e2SAndroid Build Coastguard Worker  #  --------------------------
574*cc02d7e2SAndroid Build Coastguard Worker  #
575*cc02d7e2SAndroid Build Coastguard Worker  #   This method is no longer used by gRPC's CMake build process. However, it
576*cc02d7e2SAndroid Build Coastguard Worker  #   is used by many open source dependencies, that we might want to keep
577*cc02d7e2SAndroid Build Coastguard Worker  #   backward compatibility here.
578*cc02d7e2SAndroid Build Coastguard Worker  #
579*cc02d7e2SAndroid Build Coastguard Worker  #   Add custom commands to process ``.proto`` files to C++ using protoc and
580*cc02d7e2SAndroid Build Coastguard Worker  #   GRPC plugin::
581*cc02d7e2SAndroid Build Coastguard Worker  #
582*cc02d7e2SAndroid Build Coastguard Worker  #     protobuf_generate_grpc_cpp [<ARGN>...]
583*cc02d7e2SAndroid Build Coastguard Worker  #
584*cc02d7e2SAndroid Build Coastguard Worker  #   ``ARGN``
585*cc02d7e2SAndroid Build Coastguard Worker  #     ``.proto`` files
586*cc02d7e2SAndroid Build Coastguard Worker  #
587*cc02d7e2SAndroid Build Coastguard Worker  function(protobuf_generate_grpc_cpp)
588*cc02d7e2SAndroid Build Coastguard Worker    if(NOT ARGN)
589*cc02d7e2SAndroid Build Coastguard Worker      message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
590*cc02d7e2SAndroid Build Coastguard Worker      return()
591*cc02d7e2SAndroid Build Coastguard Worker    endif()
592*cc02d7e2SAndroid Build Coastguard Worker
593*cc02d7e2SAndroid Build Coastguard Worker    foreach(FIL <%text>${ARGN}</%text>)
594*cc02d7e2SAndroid Build Coastguard Worker      protobuf_generate_grpc_cpp_with_import_path_correction(<%text>${FIL}</%text> <%text>${FIL}</%text>)
595*cc02d7e2SAndroid Build Coastguard Worker    endforeach()
596*cc02d7e2SAndroid Build Coastguard Worker  endfunction()
597*cc02d7e2SAndroid Build Coastguard Worker
598*cc02d7e2SAndroid Build Coastguard Worker  #  protobuf_generate_grpc_cpp_with_import_path_correction
599*cc02d7e2SAndroid Build Coastguard Worker  #  --------------------------
600*cc02d7e2SAndroid Build Coastguard Worker  #
601*cc02d7e2SAndroid Build Coastguard Worker  #   Add custom commands to process ``.proto`` files to C++ using protoc and
602*cc02d7e2SAndroid Build Coastguard Worker  #   GRPC plugin::
603*cc02d7e2SAndroid Build Coastguard Worker  #
604*cc02d7e2SAndroid Build Coastguard Worker  #     protobuf_generate_grpc_cpp_with_import_path_correction <FILE_LOCATION> <IMPORT_PATH>
605*cc02d7e2SAndroid Build Coastguard Worker  #
606*cc02d7e2SAndroid Build Coastguard Worker  #   ``FILE_LOCATION``
607*cc02d7e2SAndroid Build Coastguard Worker  #     The relative path of the ``.proto`` file to the project root
608*cc02d7e2SAndroid Build Coastguard Worker  #   ``IMPORT_PATH``
609*cc02d7e2SAndroid Build Coastguard Worker  #     The proto import path that itself expected to be placed in. For
610*cc02d7e2SAndroid Build Coastguard Worker  #     example, a "bar.proto" file wants to be imported as
611*cc02d7e2SAndroid Build Coastguard Worker  #     `import "foo/bar.proto"`. Then we should place it under
612*cc02d7e2SAndroid Build Coastguard Worker  #     "<ProtoBuf_Include_Path>/foo/bar.proto" instead of
613*cc02d7e2SAndroid Build Coastguard Worker  #     "<ProtoBuf_Include_Path>/third_party/foo/bar.proto". This ensures
614*cc02d7e2SAndroid Build Coastguard Worker  #     correct symbol being generated and C++ include path being correct.
615*cc02d7e2SAndroid Build Coastguard Worker  #     More info can be found at https://github.com/grpc/grpc/pull/25272.
616*cc02d7e2SAndroid Build Coastguard Worker  #
617*cc02d7e2SAndroid Build Coastguard Worker  function(protobuf_generate_grpc_cpp_with_import_path_correction FILE_LOCATION IMPORT_PATH)
618*cc02d7e2SAndroid Build Coastguard Worker    if(NOT FILE_LOCATION)
619*cc02d7e2SAndroid Build Coastguard Worker      message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
620*cc02d7e2SAndroid Build Coastguard Worker      return()
621*cc02d7e2SAndroid Build Coastguard Worker    endif()
622*cc02d7e2SAndroid Build Coastguard Worker
623*cc02d7e2SAndroid Build Coastguard Worker    # Sets the include path for ProtoBuf files
624*cc02d7e2SAndroid Build Coastguard Worker    set(_protobuf_include_path -I . -I <%text>${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR}</%text>)
625*cc02d7e2SAndroid Build Coastguard Worker    # The absolute path of the expected place for the input proto file
626*cc02d7e2SAndroid Build Coastguard Worker    # For example, health proto has package name grpc.health.v1, it's expected to be:
627*cc02d7e2SAndroid Build Coastguard Worker    #   <%text>${_gRPC_PROTO_SRCS_DIR}/grpc/health/v1/health.proto</%text>
628*cc02d7e2SAndroid Build Coastguard Worker    get_filename_component(ABS_FIL <%text>${_gRPC_PROTO_SRCS_DIR}/${IMPORT_PATH}</%text> ABSOLUTE)
629*cc02d7e2SAndroid Build Coastguard Worker    # Get the name of the file, which used to generate output file names for
630*cc02d7e2SAndroid Build Coastguard Worker    # this command.
631*cc02d7e2SAndroid Build Coastguard Worker    # Example: "health" for "health.proto"
632*cc02d7e2SAndroid Build Coastguard Worker    get_filename_component(FIL_WE <%text>${_gRPC_PROTO_SRCS_DIR}/${IMPORT_PATH}</%text> NAME_WE)
633*cc02d7e2SAndroid Build Coastguard Worker    # Get the relative path between the expected place for the proto and the
634*cc02d7e2SAndroid Build Coastguard Worker    # working directory. In normal cases, it would be equal IMPORT_PATH, but
635*cc02d7e2SAndroid Build Coastguard Worker    # it's better to be agnostic to all the global folder locations (like the
636*cc02d7e2SAndroid Build Coastguard Worker    # centralized location <%text>${_gRPC_PROTO_SRCS_DIR})</%text>.
637*cc02d7e2SAndroid Build Coastguard Worker    # Example: grpc/health/v1/health.proto
638*cc02d7e2SAndroid Build Coastguard Worker    file(RELATIVE_PATH REL_FIL <%text>${_gRPC_PROTO_SRCS_DIR}</%text> <%text>${ABS_FIL}</%text>)
639*cc02d7e2SAndroid Build Coastguard Worker    # Get the directory of the relative path.
640*cc02d7e2SAndroid Build Coastguard Worker    # Example: grpc/health/v1
641*cc02d7e2SAndroid Build Coastguard Worker    get_filename_component(REL_DIR <%text>${REL_FIL}</%text> DIRECTORY)
642*cc02d7e2SAndroid Build Coastguard Worker    # Get the directory and name for output filenames generation.
643*cc02d7e2SAndroid Build Coastguard Worker    # Example: "grpc/health/v1/health", the file name extension is omitted.
644*cc02d7e2SAndroid Build Coastguard Worker    set(RELFIL_WE "<%text>${REL_DIR}/${FIL_WE}</%text>")
645*cc02d7e2SAndroid Build Coastguard Worker    # Copy the proto file to a centralized location, with the correct import
646*cc02d7e2SAndroid Build Coastguard Worker    # path. For example, health proto has package name grpc.health.v1, the bash
647*cc02d7e2SAndroid Build Coastguard Worker    # equivalent would be:
648*cc02d7e2SAndroid Build Coastguard Worker    #   cp src/proto/grpc/health/v1/health.proto <%text>${_gRPC_PROTO_SRCS_DIR}/grpc/health/v1</%text>
649*cc02d7e2SAndroid Build Coastguard Worker    file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_SRCS_DIR}/${REL_DIR}</%text>)
650*cc02d7e2SAndroid Build Coastguard Worker    file(COPY <%text>${CMAKE_CURRENT_SOURCE_DIR}/${FILE_LOCATION}</%text> DESTINATION <%text>${_gRPC_PROTO_SRCS_DIR}/${REL_DIR}</%text>)
651*cc02d7e2SAndroid Build Coastguard Worker
652*cc02d7e2SAndroid Build Coastguard Worker    #if cross-compiling, find host plugin
653*cc02d7e2SAndroid Build Coastguard Worker    if(CMAKE_CROSSCOMPILING)
654*cc02d7e2SAndroid Build Coastguard Worker      find_program(_gRPC_CPP_PLUGIN grpc_cpp_plugin)
655*cc02d7e2SAndroid Build Coastguard Worker    else()
656*cc02d7e2SAndroid Build Coastguard Worker      set(_gRPC_CPP_PLUGIN $<TARGET_FILE:grpc_cpp_plugin>)
657*cc02d7e2SAndroid Build Coastguard Worker    endif()
658*cc02d7e2SAndroid Build Coastguard Worker
659*cc02d7e2SAndroid Build Coastguard Worker    add_custom_command(
660*cc02d7e2SAndroid Build Coastguard Worker      OUTPUT <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"</%text>
661*cc02d7e2SAndroid Build Coastguard Worker             <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"</%text>
662*cc02d7e2SAndroid Build Coastguard Worker             <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}_mock.grpc.pb.h"</%text>
663*cc02d7e2SAndroid Build Coastguard Worker             <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"</%text>
664*cc02d7e2SAndroid Build Coastguard Worker             <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"</%text>
665*cc02d7e2SAndroid Build Coastguard Worker      COMMAND <%text>${_gRPC_PROTOBUF_PROTOC_EXECUTABLE}</%text>
666*cc02d7e2SAndroid Build Coastguard Worker      ARGS --grpc_out=<%text>generate_mock_code=true:${_gRPC_PROTO_GENS_DIR}</%text>
667*cc02d7e2SAndroid Build Coastguard Worker           --cpp_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
668*cc02d7e2SAndroid Build Coastguard Worker           --plugin=protoc-gen-grpc=<%text>${_gRPC_CPP_PLUGIN}</%text>
669*cc02d7e2SAndroid Build Coastguard Worker           <%text>${_protobuf_include_path}</%text>
670*cc02d7e2SAndroid Build Coastguard Worker           <%text>${REL_FIL}</%text>
671*cc02d7e2SAndroid Build Coastguard Worker      DEPENDS <%text>${CMAKE_CURRENT_SOURCE_DIR}/${FILE_LOCATION}</%text> <%text>${ABS_FIL}</%text> <%text>${_gRPC_PROTOBUF_PROTOC}</%text> <%text>${_gRPC_CPP_PLUGIN}</%text>
672*cc02d7e2SAndroid Build Coastguard Worker      WORKING_DIRECTORY <%text>${_gRPC_PROTO_SRCS_DIR}</%text>
673*cc02d7e2SAndroid Build Coastguard Worker      COMMENT "Running gRPC C++ protocol buffer compiler for <%text>${IMPORT_PATH}</%text>"
674*cc02d7e2SAndroid Build Coastguard Worker      VERBATIM)
675*cc02d7e2SAndroid Build Coastguard Worker  endfunction()
676*cc02d7e2SAndroid Build Coastguard Worker
677*cc02d7e2SAndroid Build Coastguard Worker  # These options allow users to enable or disable the building of the various
678*cc02d7e2SAndroid Build Coastguard Worker  # protoc plugins. For example, running CMake with
679*cc02d7e2SAndroid Build Coastguard Worker  # -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF will disable building the C# plugin.
680*cc02d7e2SAndroid Build Coastguard Worker  set(_gRPC_PLUGIN_LIST)
681*cc02d7e2SAndroid Build Coastguard Worker  % for tgt in targets:
682*cc02d7e2SAndroid Build Coastguard Worker  % if tgt.build == 'protoc':
683*cc02d7e2SAndroid Build Coastguard Worker  option(gRPC_BUILD_${tgt.name.upper()} "Build ${tgt.name}" ON)
684*cc02d7e2SAndroid Build Coastguard Worker  if (gRPC_BUILD_${tgt.name.upper()})
685*cc02d7e2SAndroid Build Coastguard Worker    list(APPEND _gRPC_PLUGIN_LIST ${tgt.name})
686*cc02d7e2SAndroid Build Coastguard Worker  endif ()
687*cc02d7e2SAndroid Build Coastguard Worker  % endif
688*cc02d7e2SAndroid Build Coastguard Worker  % endfor
689*cc02d7e2SAndroid Build Coastguard Worker
690*cc02d7e2SAndroid Build Coastguard Worker  add_custom_target(plugins
691*cc02d7e2SAndroid Build Coastguard Worker    DEPENDS <%text>${_gRPC_PLUGIN_LIST}</%text>
692*cc02d7e2SAndroid Build Coastguard Worker  )
693*cc02d7e2SAndroid Build Coastguard Worker
694*cc02d7e2SAndroid Build Coastguard Worker  add_custom_target(tools_c
695*cc02d7e2SAndroid Build Coastguard Worker    DEPENDS
696*cc02d7e2SAndroid Build Coastguard Worker  % for tgt in targets:
697*cc02d7e2SAndroid Build Coastguard Worker  % if tgt.build == 'tool' and not tgt.language == 'c++':
698*cc02d7e2SAndroid Build Coastguard Worker    ${tgt.name}
699*cc02d7e2SAndroid Build Coastguard Worker  % endif
700*cc02d7e2SAndroid Build Coastguard Worker  % endfor
701*cc02d7e2SAndroid Build Coastguard Worker  )
702*cc02d7e2SAndroid Build Coastguard Worker
703*cc02d7e2SAndroid Build Coastguard Worker  add_custom_target(tools_cxx
704*cc02d7e2SAndroid Build Coastguard Worker    DEPENDS
705*cc02d7e2SAndroid Build Coastguard Worker  % for tgt in targets:
706*cc02d7e2SAndroid Build Coastguard Worker  % if tgt.build == 'tool' and tgt.language == 'c++':
707*cc02d7e2SAndroid Build Coastguard Worker    ${tgt.name}
708*cc02d7e2SAndroid Build Coastguard Worker  % endif
709*cc02d7e2SAndroid Build Coastguard Worker  % endfor
710*cc02d7e2SAndroid Build Coastguard Worker  )
711*cc02d7e2SAndroid Build Coastguard Worker
712*cc02d7e2SAndroid Build Coastguard Worker  add_custom_target(tools
713*cc02d7e2SAndroid Build Coastguard Worker    DEPENDS tools_c tools_cxx)
714*cc02d7e2SAndroid Build Coastguard Worker
715*cc02d7e2SAndroid Build Coastguard Worker  % for src in sorted(protobuf_gen_files):
716*cc02d7e2SAndroid Build Coastguard Worker  protobuf_generate_grpc_cpp_with_import_path_correction(
717*cc02d7e2SAndroid Build Coastguard Worker    ${src} ${third_party_proto_import_path(src)}
718*cc02d7e2SAndroid Build Coastguard Worker  )
719*cc02d7e2SAndroid Build Coastguard Worker  % endfor
720*cc02d7e2SAndroid Build Coastguard Worker
721*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_TESTS)
722*cc02d7e2SAndroid Build Coastguard Worker    add_custom_target(buildtests_c)
723*cc02d7e2SAndroid Build Coastguard Worker    % for tgt in targets:
724*cc02d7e2SAndroid Build Coastguard Worker    % if is_generate_cmake_target(tgt) and tgt.build == 'test' and not tgt.language == 'c++':
725*cc02d7e2SAndroid Build Coastguard Worker    <%block filter='platforms_condition_block(tgt.platforms)'>
726*cc02d7e2SAndroid Build Coastguard Worker    add_dependencies(buildtests_c ${tgt.name})
727*cc02d7e2SAndroid Build Coastguard Worker    </%block>
728*cc02d7e2SAndroid Build Coastguard Worker    % endif
729*cc02d7e2SAndroid Build Coastguard Worker    % endfor
730*cc02d7e2SAndroid Build Coastguard Worker
731*cc02d7e2SAndroid Build Coastguard Worker    add_custom_target(buildtests_cxx)
732*cc02d7e2SAndroid Build Coastguard Worker    % for tgt in targets:
733*cc02d7e2SAndroid Build Coastguard Worker    % if is_generate_cmake_target(tgt) and tgt.build == 'test' and tgt.language == 'c++':
734*cc02d7e2SAndroid Build Coastguard Worker    <%block filter='platforms_condition_block(tgt.platforms)'>
735*cc02d7e2SAndroid Build Coastguard Worker    add_dependencies(buildtests_cxx ${tgt.name})
736*cc02d7e2SAndroid Build Coastguard Worker    </%block>
737*cc02d7e2SAndroid Build Coastguard Worker    % endif
738*cc02d7e2SAndroid Build Coastguard Worker    % endfor
739*cc02d7e2SAndroid Build Coastguard Worker
740*cc02d7e2SAndroid Build Coastguard Worker    add_custom_target(buildtests
741*cc02d7e2SAndroid Build Coastguard Worker      DEPENDS buildtests_c buildtests_cxx)
742*cc02d7e2SAndroid Build Coastguard Worker  endif()
743*cc02d7e2SAndroid Build Coastguard Worker  <%
744*cc02d7e2SAndroid Build Coastguard Worker    cmake_libs = []
745*cc02d7e2SAndroid Build Coastguard Worker    for lib in libs:
746*cc02d7e2SAndroid Build Coastguard Worker      if not is_generate_cmake_target(lib): continue
747*cc02d7e2SAndroid Build Coastguard Worker      cmake_libs.append(lib)
748*cc02d7e2SAndroid Build Coastguard Worker  %>
749*cc02d7e2SAndroid Build Coastguard Worker
750*cc02d7e2SAndroid Build Coastguard Worker  % for lib in cmake_libs:
751*cc02d7e2SAndroid Build Coastguard Worker  %   if lib.build in ["test", "private"]:
752*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_TESTS)
753*cc02d7e2SAndroid Build Coastguard Worker  ${cc_library(lib)}
754*cc02d7e2SAndroid Build Coastguard Worker  endif()
755*cc02d7e2SAndroid Build Coastguard Worker  %   else:
756*cc02d7e2SAndroid Build Coastguard Worker  %     if lib.build in ["plugin"]:
757*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_${lib.name.upper()})
758*cc02d7e2SAndroid Build Coastguard Worker  %     endif
759*cc02d7e2SAndroid Build Coastguard Worker  ${cc_library(lib)}
760*cc02d7e2SAndroid Build Coastguard Worker  %     if not lib.build in ["tool"]:
761*cc02d7e2SAndroid Build Coastguard Worker  %       if any(proto_re.match(src) for src in lib.src):
762*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_CODEGEN)
763*cc02d7e2SAndroid Build Coastguard Worker  %       endif
764*cc02d7e2SAndroid Build Coastguard Worker  ${cc_install(lib)}
765*cc02d7e2SAndroid Build Coastguard Worker  %       if any(proto_re.match(src) for src in lib.src):
766*cc02d7e2SAndroid Build Coastguard Worker  endif()
767*cc02d7e2SAndroid Build Coastguard Worker  %       endif
768*cc02d7e2SAndroid Build Coastguard Worker  %     endif
769*cc02d7e2SAndroid Build Coastguard Worker  %     if lib.build in ["plugin"]:
770*cc02d7e2SAndroid Build Coastguard Worker  endif()
771*cc02d7e2SAndroid Build Coastguard Worker  %     endif
772*cc02d7e2SAndroid Build Coastguard Worker  %   endif
773*cc02d7e2SAndroid Build Coastguard Worker  % endfor
774*cc02d7e2SAndroid Build Coastguard Worker
775*cc02d7e2SAndroid Build Coastguard Worker  % for tgt in targets:
776*cc02d7e2SAndroid Build Coastguard Worker  % if is_generate_cmake_target(tgt):
777*cc02d7e2SAndroid Build Coastguard Worker  % if tgt.build in ["test", "private"]:
778*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_TESTS)
779*cc02d7e2SAndroid Build Coastguard Worker  <%block filter='platforms_condition_block(tgt.platforms)'>
780*cc02d7e2SAndroid Build Coastguard Worker  ${cc_binary(tgt)}
781*cc02d7e2SAndroid Build Coastguard Worker  </%block>
782*cc02d7e2SAndroid Build Coastguard Worker  endif()
783*cc02d7e2SAndroid Build Coastguard Worker  % elif tgt.build in ["plugin_test"]:
784*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_TESTS AND ${tgt.plugin_option})
785*cc02d7e2SAndroid Build Coastguard Worker  <%block filter='platforms_condition_block(tgt.platforms)'>
786*cc02d7e2SAndroid Build Coastguard Worker  ${cc_binary(tgt)}
787*cc02d7e2SAndroid Build Coastguard Worker  </%block>
788*cc02d7e2SAndroid Build Coastguard Worker  endif()
789*cc02d7e2SAndroid Build Coastguard Worker  % elif tgt.build in ["protoc"]:
790*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_${tgt.name.upper()})
791*cc02d7e2SAndroid Build Coastguard Worker  <%block filter='platforms_condition_block(tgt.platforms)'>
792*cc02d7e2SAndroid Build Coastguard Worker  ${cc_binary(tgt)}
793*cc02d7e2SAndroid Build Coastguard Worker  ${cc_install(tgt)}
794*cc02d7e2SAndroid Build Coastguard Worker  </%block>
795*cc02d7e2SAndroid Build Coastguard Worker  endif()
796*cc02d7e2SAndroid Build Coastguard Worker  % else:
797*cc02d7e2SAndroid Build Coastguard Worker  <%block filter='platforms_condition_block(tgt.platforms)'>
798*cc02d7e2SAndroid Build Coastguard Worker  ${cc_binary(tgt)}
799*cc02d7e2SAndroid Build Coastguard Worker  % if not tgt.build in ["tool"]:
800*cc02d7e2SAndroid Build Coastguard Worker  ${cc_install(tgt)}
801*cc02d7e2SAndroid Build Coastguard Worker  % endif
802*cc02d7e2SAndroid Build Coastguard Worker  </%block>
803*cc02d7e2SAndroid Build Coastguard Worker  % endif
804*cc02d7e2SAndroid Build Coastguard Worker  % endif
805*cc02d7e2SAndroid Build Coastguard Worker  % endfor
806*cc02d7e2SAndroid Build Coastguard Worker
807*cc02d7e2SAndroid Build Coastguard Worker  <%def name="cc_library(lib)">
808*cc02d7e2SAndroid Build Coastguard Worker  % if any(proto_re.match(src) for src in lib.src):
809*cc02d7e2SAndroid Build Coastguard Worker  % if lib.name == 'grpcpp_channelz':  # TODO(jtattermusch): remove special case based on target name
810*cc02d7e2SAndroid Build Coastguard Worker  # grpcpp_channelz doesn't build with protobuf-lite
811*cc02d7e2SAndroid Build Coastguard Worker  # See https://github.com/grpc/grpc/issues/19473
812*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_CODEGEN AND NOT gRPC_USE_PROTO_LITE)
813*cc02d7e2SAndroid Build Coastguard Worker  % else:
814*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_BUILD_CODEGEN)
815*cc02d7e2SAndroid Build Coastguard Worker  % endif
816*cc02d7e2SAndroid Build Coastguard Worker  % endif
817*cc02d7e2SAndroid Build Coastguard Worker  add_library(${lib.name}${lib_type_for_lib(lib.name)}
818*cc02d7e2SAndroid Build Coastguard Worker  % for src in lib.src:
819*cc02d7e2SAndroid Build Coastguard Worker  % if not proto_re.match(src):
820*cc02d7e2SAndroid Build Coastguard Worker    ${src}
821*cc02d7e2SAndroid Build Coastguard Worker  % else:
822*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.pb.cc')}
823*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.grpc.pb.cc')}
824*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.pb.h')}
825*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.grpc.pb.h')}
826*cc02d7e2SAndroid Build Coastguard Worker    % if src in ["src/proto/grpc/testing/compiler_test.proto", "src/proto/grpc/testing/echo.proto"]:
827*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '_mock.grpc.pb.h')}
828*cc02d7e2SAndroid Build Coastguard Worker    % endif
829*cc02d7e2SAndroid Build Coastguard Worker  % endif
830*cc02d7e2SAndroid Build Coastguard Worker  % endfor
831*cc02d7e2SAndroid Build Coastguard Worker  % if lib.name in ['grpc++_alts', 'grpc++_unsecure', 'grpc++']:
832*cc02d7e2SAndroid Build Coastguard Worker    <%text>${gRPC_UPB_GEN_DUPL_SRC}</%text>
833*cc02d7e2SAndroid Build Coastguard Worker  % endif
834*cc02d7e2SAndroid Build Coastguard Worker  % if lib.name in ['grpc_unsecure']:
835*cc02d7e2SAndroid Build Coastguard Worker    <%text>${gRPC_ADDITIONAL_DLL_SRC}</%text>
836*cc02d7e2SAndroid Build Coastguard Worker  % endif
837*cc02d7e2SAndroid Build Coastguard Worker  % if lib.name in ['grpc++_unsecure']:
838*cc02d7e2SAndroid Build Coastguard Worker    <%text>${gRPC_ADDITIONAL_DLL_CXX_SRC}</%text>
839*cc02d7e2SAndroid Build Coastguard Worker  % endif
840*cc02d7e2SAndroid Build Coastguard Worker  )
841*cc02d7e2SAndroid Build Coastguard Worker
842*cc02d7e2SAndroid Build Coastguard Worker  target_compile_features(${lib.name} PUBLIC cxx_std_14)
843*cc02d7e2SAndroid Build Coastguard Worker
844*cc02d7e2SAndroid Build Coastguard Worker  set_target_properties(${lib.name} PROPERTIES
845*cc02d7e2SAndroid Build Coastguard Worker  % if lib.language == 'c++':
846*cc02d7e2SAndroid Build Coastguard Worker    VERSION <%text>${gRPC_CPP_VERSION}</%text>
847*cc02d7e2SAndroid Build Coastguard Worker    SOVERSION <%text>${gRPC_CPP_SOVERSION}</%text>
848*cc02d7e2SAndroid Build Coastguard Worker  % else:
849*cc02d7e2SAndroid Build Coastguard Worker    VERSION <%text>${gRPC_CORE_VERSION}</%text>
850*cc02d7e2SAndroid Build Coastguard Worker    SOVERSION <%text>${gRPC_CORE_SOVERSION}</%text>
851*cc02d7e2SAndroid Build Coastguard Worker  % endif
852*cc02d7e2SAndroid Build Coastguard Worker  )
853*cc02d7e2SAndroid Build Coastguard Worker
854*cc02d7e2SAndroid Build Coastguard Worker  if(WIN32 AND MSVC)
855*cc02d7e2SAndroid Build Coastguard Worker    set_target_properties(${lib.name} PROPERTIES COMPILE_PDB_NAME "${lib.name}"
856*cc02d7e2SAndroid Build Coastguard Worker      COMPILE_PDB_OUTPUT_DIRECTORY <%text>"${CMAKE_BINARY_DIR}</%text>"
857*cc02d7e2SAndroid Build Coastguard Worker    )<%
858*cc02d7e2SAndroid Build Coastguard Worker    dll_annotations = []
859*cc02d7e2SAndroid Build Coastguard Worker    if lib.name in gpr_libs:
860*cc02d7e2SAndroid Build Coastguard Worker      dll_annotations.append("GPR_DLL_EXPORTS")
861*cc02d7e2SAndroid Build Coastguard Worker    if lib.name in grpc_libs:
862*cc02d7e2SAndroid Build Coastguard Worker      dll_annotations.append("GRPC_DLL_EXPORTS")
863*cc02d7e2SAndroid Build Coastguard Worker    if lib.name in grpcxx_libs:
864*cc02d7e2SAndroid Build Coastguard Worker      dll_annotations.append("GRPCXX_DLL_EXPORTS")
865*cc02d7e2SAndroid Build Coastguard Worker    if set(gpr_libs) & set(lib.transitive_deps):
866*cc02d7e2SAndroid Build Coastguard Worker      dll_annotations.append("GPR_DLL_IMPORTS")
867*cc02d7e2SAndroid Build Coastguard Worker    if set(grpc_libs) & set(lib.transitive_deps):
868*cc02d7e2SAndroid Build Coastguard Worker      dll_annotations.append("GRPC_DLL_IMPORTS")
869*cc02d7e2SAndroid Build Coastguard Worker    if set(grpcxx_libs) & set(lib.transitive_deps):
870*cc02d7e2SAndroid Build Coastguard Worker      dll_annotations.append("GRPCXX_DLL_IMPORTS")
871*cc02d7e2SAndroid Build Coastguard Worker    %>
872*cc02d7e2SAndroid Build Coastguard Worker    % if dll_annotations:
873*cc02d7e2SAndroid Build Coastguard Worker    if(BUILD_SHARED_LIBS)
874*cc02d7e2SAndroid Build Coastguard Worker      target_compile_definitions(${lib.name}
875*cc02d7e2SAndroid Build Coastguard Worker      PRIVATE
876*cc02d7e2SAndroid Build Coastguard Worker    % for definition in dll_annotations:
877*cc02d7e2SAndroid Build Coastguard Worker        "${definition}"
878*cc02d7e2SAndroid Build Coastguard Worker    % endfor
879*cc02d7e2SAndroid Build Coastguard Worker      )
880*cc02d7e2SAndroid Build Coastguard Worker    endif()
881*cc02d7e2SAndroid Build Coastguard Worker    % endif
882*cc02d7e2SAndroid Build Coastguard Worker    if(gRPC_INSTALL)
883*cc02d7e2SAndroid Build Coastguard Worker      install(FILES <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>${lib.name}.pdb
884*cc02d7e2SAndroid Build Coastguard Worker        DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text> OPTIONAL
885*cc02d7e2SAndroid Build Coastguard Worker      )
886*cc02d7e2SAndroid Build Coastguard Worker    endif()
887*cc02d7e2SAndroid Build Coastguard Worker  endif()
888*cc02d7e2SAndroid Build Coastguard Worker
889*cc02d7e2SAndroid Build Coastguard Worker  target_include_directories(${lib.name}
890*cc02d7e2SAndroid Build Coastguard Worker    PUBLIC <%text>$<INSTALL_INTERFACE:${gRPC_INSTALL_INCLUDEDIR}> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include></%text>
891*cc02d7e2SAndroid Build Coastguard Worker    PRIVATE
892*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
893*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}</%text>
894*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_RE2_INCLUDE_DIR}</%text>
895*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_SSL_INCLUDE_DIR}</%text>
896*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_UPB_GENERATED_DIR}</%text>
897*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_UPB_GRPC_GENERATED_DIR}</%text>
898*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_UPB_INCLUDE_DIR}</%text>
899*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_XXHASH_INCLUDE_DIR}</%text>
900*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_ZLIB_INCLUDE_DIR}</%text>
901*cc02d7e2SAndroid Build Coastguard Worker  % if 'gtest' in lib.transitive_deps or lib.name == 'gtest':  # TODO(jtattermusch): avoid special case based on target name
902*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googletest/include
903*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googletest
904*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googlemock/include
905*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googlemock
906*cc02d7e2SAndroid Build Coastguard Worker  % endif
907*cc02d7e2SAndroid Build Coastguard Worker  % if lib.language == 'c++':
908*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_PROTO_GENS_DIR}</%text>
909*cc02d7e2SAndroid Build Coastguard Worker  % endif
910*cc02d7e2SAndroid Build Coastguard Worker  )
911*cc02d7e2SAndroid Build Coastguard Worker  % if len(get_deps(lib)) > 0:
912*cc02d7e2SAndroid Build Coastguard Worker  target_link_libraries(${lib.name}
913*cc02d7e2SAndroid Build Coastguard Worker  % for dep in get_deps(lib):
914*cc02d7e2SAndroid Build Coastguard Worker    ${dep}
915*cc02d7e2SAndroid Build Coastguard Worker  % endfor
916*cc02d7e2SAndroid Build Coastguard Worker  )
917*cc02d7e2SAndroid Build Coastguard Worker  % endif
918*cc02d7e2SAndroid Build Coastguard Worker  % if lib.name in ["gpr"]:  # TODO(jtattermusch): avoid special case based on target name
919*cc02d7e2SAndroid Build Coastguard Worker  if(_gRPC_PLATFORM_ANDROID)
920*cc02d7e2SAndroid Build Coastguard Worker    target_link_libraries(gpr
921*cc02d7e2SAndroid Build Coastguard Worker      android
922*cc02d7e2SAndroid Build Coastguard Worker      log
923*cc02d7e2SAndroid Build Coastguard Worker    )
924*cc02d7e2SAndroid Build Coastguard Worker  endif()
925*cc02d7e2SAndroid Build Coastguard Worker  % endif
926*cc02d7e2SAndroid Build Coastguard Worker  % if lib.name in ["grpc", "grpc_cronet", "grpc_test_util", \
927*cc02d7e2SAndroid Build Coastguard Worker                    "grpc_test_util_unsecure", "grpc_unsecure", \
928*cc02d7e2SAndroid Build Coastguard Worker                    "grpc++_cronet"]: # TODO(jtattermusch): remove special cases based on target names
929*cc02d7e2SAndroid Build Coastguard Worker  if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC)
930*cc02d7e2SAndroid Build Coastguard Worker    target_link_libraries(${lib.name} "-framework CoreFoundation")
931*cc02d7e2SAndroid Build Coastguard Worker  endif()
932*cc02d7e2SAndroid Build Coastguard Worker  %endif
933*cc02d7e2SAndroid Build Coastguard Worker
934*cc02d7e2SAndroid Build Coastguard Worker  % if len(lib.get('public_headers', [])) > 0:
935*cc02d7e2SAndroid Build Coastguard Worker  foreach(_hdr
936*cc02d7e2SAndroid Build Coastguard Worker  % for hdr in lib.get('public_headers', []):
937*cc02d7e2SAndroid Build Coastguard Worker    ${hdr}
938*cc02d7e2SAndroid Build Coastguard Worker  % endfor
939*cc02d7e2SAndroid Build Coastguard Worker  )
940*cc02d7e2SAndroid Build Coastguard Worker    string(REPLACE "include/" "" _path <%text>${_hdr}</%text>)
941*cc02d7e2SAndroid Build Coastguard Worker    get_filename_component(_path <%text>${_path}</%text> PATH)
942*cc02d7e2SAndroid Build Coastguard Worker    install(FILES <%text>${_hdr}</%text>
943*cc02d7e2SAndroid Build Coastguard Worker      DESTINATION "<%text>${gRPC_INSTALL_INCLUDEDIR}/${_path}</%text>"
944*cc02d7e2SAndroid Build Coastguard Worker    )
945*cc02d7e2SAndroid Build Coastguard Worker  endforeach()
946*cc02d7e2SAndroid Build Coastguard Worker  % endif
947*cc02d7e2SAndroid Build Coastguard Worker  % if any(proto_re.match(src) for src in lib.src):
948*cc02d7e2SAndroid Build Coastguard Worker  endif()
949*cc02d7e2SAndroid Build Coastguard Worker  % endif
950*cc02d7e2SAndroid Build Coastguard Worker  </%def>
951*cc02d7e2SAndroid Build Coastguard Worker
952*cc02d7e2SAndroid Build Coastguard Worker  <%def name="cc_binary(tgt)">
953*cc02d7e2SAndroid Build Coastguard Worker  add_executable(${tgt.name}
954*cc02d7e2SAndroid Build Coastguard Worker  % for src in tgt.src:
955*cc02d7e2SAndroid Build Coastguard Worker  % if not proto_re.match(src):
956*cc02d7e2SAndroid Build Coastguard Worker    ${src}
957*cc02d7e2SAndroid Build Coastguard Worker  % else:
958*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.pb.cc')}
959*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.grpc.pb.cc')}
960*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.pb.h')}
961*cc02d7e2SAndroid Build Coastguard Worker    ${proto_replace_ext(src, '.grpc.pb.h')}
962*cc02d7e2SAndroid Build Coastguard Worker  % endif
963*cc02d7e2SAndroid Build Coastguard Worker  % endfor
964*cc02d7e2SAndroid Build Coastguard Worker  )<%
965*cc02d7e2SAndroid Build Coastguard Worker  dll_annotations = []
966*cc02d7e2SAndroid Build Coastguard Worker  if set(gpr_libs) & set(tgt.transitive_deps):
967*cc02d7e2SAndroid Build Coastguard Worker    dll_annotations.append("GPR_DLL_IMPORTS")
968*cc02d7e2SAndroid Build Coastguard Worker  if set(grpc_libs) & set(tgt.transitive_deps):
969*cc02d7e2SAndroid Build Coastguard Worker    dll_annotations.append("GRPC_DLL_IMPORTS")
970*cc02d7e2SAndroid Build Coastguard Worker  if set(grpcxx_libs) & set(tgt.transitive_deps):
971*cc02d7e2SAndroid Build Coastguard Worker    dll_annotations.append("GRPCXX_DLL_IMPORTS")
972*cc02d7e2SAndroid Build Coastguard Worker  %>
973*cc02d7e2SAndroid Build Coastguard Worker  % if dll_annotations:
974*cc02d7e2SAndroid Build Coastguard Worker  if(WIN32 AND MSVC)
975*cc02d7e2SAndroid Build Coastguard Worker    if(BUILD_SHARED_LIBS)
976*cc02d7e2SAndroid Build Coastguard Worker      target_compile_definitions(${tgt.name}
977*cc02d7e2SAndroid Build Coastguard Worker      PRIVATE
978*cc02d7e2SAndroid Build Coastguard Worker    % for definition in dll_annotations:
979*cc02d7e2SAndroid Build Coastguard Worker        "${definition}"
980*cc02d7e2SAndroid Build Coastguard Worker    % endfor
981*cc02d7e2SAndroid Build Coastguard Worker      )
982*cc02d7e2SAndroid Build Coastguard Worker    endif()
983*cc02d7e2SAndroid Build Coastguard Worker  endif()
984*cc02d7e2SAndroid Build Coastguard Worker  % endif
985*cc02d7e2SAndroid Build Coastguard Worker  target_compile_features(${tgt.name} PUBLIC cxx_std_14)
986*cc02d7e2SAndroid Build Coastguard Worker  target_include_directories(${tgt.name}
987*cc02d7e2SAndroid Build Coastguard Worker    PRIVATE
988*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
989*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/include
990*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}</%text>
991*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_RE2_INCLUDE_DIR}</%text>
992*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_SSL_INCLUDE_DIR}</%text>
993*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_UPB_GENERATED_DIR}</%text>
994*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_UPB_GRPC_GENERATED_DIR}</%text>
995*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_UPB_INCLUDE_DIR}</%text>
996*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_XXHASH_INCLUDE_DIR}</%text>
997*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_ZLIB_INCLUDE_DIR}</%text>
998*cc02d7e2SAndroid Build Coastguard Worker  % if 'gtest' in tgt.transitive_deps:
999*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googletest/include
1000*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googletest
1001*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googlemock/include
1002*cc02d7e2SAndroid Build Coastguard Worker      third_party/googletest/googlemock
1003*cc02d7e2SAndroid Build Coastguard Worker  % endif
1004*cc02d7e2SAndroid Build Coastguard Worker  % if tgt.language == 'c++':
1005*cc02d7e2SAndroid Build Coastguard Worker      <%text>${_gRPC_PROTO_GENS_DIR}</%text>
1006*cc02d7e2SAndroid Build Coastguard Worker  % endif
1007*cc02d7e2SAndroid Build Coastguard Worker  )
1008*cc02d7e2SAndroid Build Coastguard Worker
1009*cc02d7e2SAndroid Build Coastguard Worker  % if len(get_deps(tgt)) > 0:
1010*cc02d7e2SAndroid Build Coastguard Worker  target_link_libraries(${tgt.name}
1011*cc02d7e2SAndroid Build Coastguard Worker  % for dep in get_deps(tgt):
1012*cc02d7e2SAndroid Build Coastguard Worker    ${dep}
1013*cc02d7e2SAndroid Build Coastguard Worker  % endfor
1014*cc02d7e2SAndroid Build Coastguard Worker  )
1015*cc02d7e2SAndroid Build Coastguard Worker
1016*cc02d7e2SAndroid Build Coastguard Worker  % endif
1017*cc02d7e2SAndroid Build Coastguard Worker  </%def>
1018*cc02d7e2SAndroid Build Coastguard Worker
1019*cc02d7e2SAndroid Build Coastguard Worker  <%def name="cc_install(tgt)">
1020*cc02d7e2SAndroid Build Coastguard Worker  % if tgt.name == 'grpcpp_channelz':
1021*cc02d7e2SAndroid Build Coastguard Worker  # grpcpp_channelz doesn't build with protobuf-lite, so no install required
1022*cc02d7e2SAndroid Build Coastguard Worker  # See https://github.com/grpc/grpc/issues/22826
1023*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_INSTALL AND NOT gRPC_USE_PROTO_LITE)
1024*cc02d7e2SAndroid Build Coastguard Worker  % else:
1025*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_INSTALL)
1026*cc02d7e2SAndroid Build Coastguard Worker  % endif
1027*cc02d7e2SAndroid Build Coastguard Worker  % if tgt.build == 'protoc' and 'grpc_plugin_support' in tgt.get('deps', []):
1028*cc02d7e2SAndroid Build Coastguard Worker    install(TARGETS ${tgt.name} EXPORT gRPCPluginTargets
1029*cc02d7e2SAndroid Build Coastguard Worker  % else:
1030*cc02d7e2SAndroid Build Coastguard Worker    install(TARGETS ${tgt.name} EXPORT gRPCTargets
1031*cc02d7e2SAndroid Build Coastguard Worker  % endif
1032*cc02d7e2SAndroid Build Coastguard Worker      RUNTIME DESTINATION <%text>${gRPC_INSTALL_BINDIR}</%text>
1033*cc02d7e2SAndroid Build Coastguard Worker      BUNDLE DESTINATION  <%text>${gRPC_INSTALL_BINDIR}</%text>
1034*cc02d7e2SAndroid Build Coastguard Worker      LIBRARY DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text>
1035*cc02d7e2SAndroid Build Coastguard Worker      ARCHIVE DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text>
1036*cc02d7e2SAndroid Build Coastguard Worker    )
1037*cc02d7e2SAndroid Build Coastguard Worker  endif()
1038*cc02d7e2SAndroid Build Coastguard Worker  </%def>
1039*cc02d7e2SAndroid Build Coastguard Worker
1040*cc02d7e2SAndroid Build Coastguard Worker  if(gRPC_INSTALL)
1041*cc02d7e2SAndroid Build Coastguard Worker    install(EXPORT gRPCTargets
1042*cc02d7e2SAndroid Build Coastguard Worker      DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>
1043*cc02d7e2SAndroid Build Coastguard Worker      NAMESPACE gRPC::
1044*cc02d7e2SAndroid Build Coastguard Worker    )
1045*cc02d7e2SAndroid Build Coastguard Worker    if(gRPC_BUILD_CODEGEN)
1046*cc02d7e2SAndroid Build Coastguard Worker      install(EXPORT gRPCPluginTargets
1047*cc02d7e2SAndroid Build Coastguard Worker        DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>
1048*cc02d7e2SAndroid Build Coastguard Worker        NAMESPACE gRPC::
1049*cc02d7e2SAndroid Build Coastguard Worker      )
1050*cc02d7e2SAndroid Build Coastguard Worker    endif()
1051*cc02d7e2SAndroid Build Coastguard Worker  endif()
1052*cc02d7e2SAndroid Build Coastguard Worker
1053*cc02d7e2SAndroid Build Coastguard Worker  include(CMakePackageConfigHelpers)
1054*cc02d7e2SAndroid Build Coastguard Worker
1055*cc02d7e2SAndroid Build Coastguard Worker  configure_file(cmake/gRPCConfig.cmake.in
1056*cc02d7e2SAndroid Build Coastguard Worker    gRPCConfig.cmake @ONLY)
1057*cc02d7e2SAndroid Build Coastguard Worker  write_basic_package_version_file(<%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfigVersion.cmake
1058*cc02d7e2SAndroid Build Coastguard Worker    VERSION <%text>${gRPC_CPP_VERSION}</%text>
1059*cc02d7e2SAndroid Build Coastguard Worker    COMPATIBILITY AnyNewerVersion)
1060*cc02d7e2SAndroid Build Coastguard Worker  install(FILES
1061*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfig.cmake
1062*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfigVersion.cmake
1063*cc02d7e2SAndroid Build Coastguard Worker    DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>
1064*cc02d7e2SAndroid Build Coastguard Worker  )
1065*cc02d7e2SAndroid Build Coastguard Worker  install(FILES
1066*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules/Findc-ares.cmake
1067*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules/Findre2.cmake
1068*cc02d7e2SAndroid Build Coastguard Worker      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules/Findsystemd.cmake
1069*cc02d7e2SAndroid Build Coastguard Worker    DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>/modules
1070*cc02d7e2SAndroid Build Coastguard Worker  )
1071*cc02d7e2SAndroid Build Coastguard Worker
1072*cc02d7e2SAndroid Build Coastguard Worker  install(FILES <%text>${CMAKE_CURRENT_SOURCE_DIR}/etc/roots.pem</%text>
1073*cc02d7e2SAndroid Build Coastguard Worker    DESTINATION <%text>${gRPC_INSTALL_SHAREDIR}</%text>)
1074*cc02d7e2SAndroid Build Coastguard Worker
1075*cc02d7e2SAndroid Build Coastguard Worker  # Function to generate pkg-config files.
1076*cc02d7e2SAndroid Build Coastguard Worker  function(generate_pkgconfig name description version requires requires_private
1077*cc02d7e2SAndroid Build Coastguard Worker                              libs libs_private output_filename)
1078*cc02d7e2SAndroid Build Coastguard Worker    set(PC_NAME "<%text>${name}</%text>")
1079*cc02d7e2SAndroid Build Coastguard Worker    set(PC_DESCRIPTION "<%text>${description}</%text>")
1080*cc02d7e2SAndroid Build Coastguard Worker    set(PC_VERSION "<%text>${version}</%text>")
1081*cc02d7e2SAndroid Build Coastguard Worker    set(PC_REQUIRES "<%text>${requires}</%text>")
1082*cc02d7e2SAndroid Build Coastguard Worker    set(PC_REQUIRES_PRIVATE "<%text>${requires_private}</%text>")
1083*cc02d7e2SAndroid Build Coastguard Worker    set(PC_LIB "<%text>${libs}</%text>")
1084*cc02d7e2SAndroid Build Coastguard Worker    set(PC_LIBS_PRIVATE "<%text>${libs_private}</%text>")
1085*cc02d7e2SAndroid Build Coastguard Worker    set(output_filepath "<%text>${grpc_BINARY_DIR}/libs/opt/pkgconfig/${output_filename}</%text>")
1086*cc02d7e2SAndroid Build Coastguard Worker    configure_file(
1087*cc02d7e2SAndroid Build Coastguard Worker      "<%text>${grpc_SOURCE_DIR}/cmake/pkg-config-template.pc.in</%text>"
1088*cc02d7e2SAndroid Build Coastguard Worker      "<%text>${output_filepath}</%text>"
1089*cc02d7e2SAndroid Build Coastguard Worker      @ONLY)
1090*cc02d7e2SAndroid Build Coastguard Worker    install(FILES "<%text>${output_filepath}</%text>"
1091*cc02d7e2SAndroid Build Coastguard Worker      DESTINATION "<%text>${gRPC_INSTALL_LIBDIR}/pkgconfig</%text>")
1092*cc02d7e2SAndroid Build Coastguard Worker  endfunction()
1093*cc02d7e2SAndroid Build Coastguard Worker
1094*cc02d7e2SAndroid Build Coastguard Worker  # gpr .pc file
1095*cc02d7e2SAndroid Build Coastguard Worker  generate_pkgconfig(
1096*cc02d7e2SAndroid Build Coastguard Worker    "gpr"
1097*cc02d7e2SAndroid Build Coastguard Worker    "gRPC platform support library"
1098*cc02d7e2SAndroid Build Coastguard Worker    "<%text>${gRPC_CORE_VERSION}</%text>"
1099*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires("gpr"))}"
1100*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires_private("gpr"))}"
1101*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs("gpr"))}"
1102*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs_private("gpr"))}"
1103*cc02d7e2SAndroid Build Coastguard Worker    "gpr.pc")
1104*cc02d7e2SAndroid Build Coastguard Worker
1105*cc02d7e2SAndroid Build Coastguard Worker  # grpc .pc file
1106*cc02d7e2SAndroid Build Coastguard Worker  generate_pkgconfig(
1107*cc02d7e2SAndroid Build Coastguard Worker    "gRPC"
1108*cc02d7e2SAndroid Build Coastguard Worker    "high performance general RPC framework"
1109*cc02d7e2SAndroid Build Coastguard Worker    "<%text>${gRPC_CORE_VERSION}</%text>"
1110*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires("grpc"))}"
1111*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires_private("grpc"))}"
1112*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs("grpc"))}"
1113*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs_private("grpc"))}"
1114*cc02d7e2SAndroid Build Coastguard Worker    "grpc.pc")
1115*cc02d7e2SAndroid Build Coastguard Worker
1116*cc02d7e2SAndroid Build Coastguard Worker  # grpc_unsecure .pc file
1117*cc02d7e2SAndroid Build Coastguard Worker  generate_pkgconfig(
1118*cc02d7e2SAndroid Build Coastguard Worker    "gRPC unsecure"
1119*cc02d7e2SAndroid Build Coastguard Worker    "high performance general RPC framework without SSL"
1120*cc02d7e2SAndroid Build Coastguard Worker    "<%text>${gRPC_CORE_VERSION}</%text>"
1121*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires("grpc_unsecure"))}"
1122*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires_private("grpc_unsecure"))}"
1123*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs("grpc_unsecure"))}"
1124*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs_private("grpc_unsecure"))}"
1125*cc02d7e2SAndroid Build Coastguard Worker    "grpc_unsecure.pc")
1126*cc02d7e2SAndroid Build Coastguard Worker
1127*cc02d7e2SAndroid Build Coastguard Worker  # grpc++ .pc file
1128*cc02d7e2SAndroid Build Coastguard Worker  generate_pkgconfig(
1129*cc02d7e2SAndroid Build Coastguard Worker    "gRPC++"
1130*cc02d7e2SAndroid Build Coastguard Worker    "C++ wrapper for gRPC"
1131*cc02d7e2SAndroid Build Coastguard Worker    "<%text>${gRPC_CPP_VERSION}</%text>"
1132*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires("grpc++"))}"
1133*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires_private("grpc++"))}"
1134*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs("grpc++"))}"
1135*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs_private("grpc++"))}"
1136*cc02d7e2SAndroid Build Coastguard Worker    "grpc++.pc")
1137*cc02d7e2SAndroid Build Coastguard Worker
1138*cc02d7e2SAndroid Build Coastguard Worker  # grpc++_unsecure .pc file
1139*cc02d7e2SAndroid Build Coastguard Worker  generate_pkgconfig(
1140*cc02d7e2SAndroid Build Coastguard Worker    "gRPC++ unsecure"
1141*cc02d7e2SAndroid Build Coastguard Worker    "C++ wrapper for gRPC without SSL"
1142*cc02d7e2SAndroid Build Coastguard Worker    "<%text>${gRPC_CPP_VERSION}</%text>"
1143*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires("grpc++_unsecure"))}"
1144*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires_private("grpc++_unsecure"))}"
1145*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs("grpc++_unsecure"))}"
1146*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs_private("grpc++_unsecure"))}"
1147*cc02d7e2SAndroid Build Coastguard Worker    "grpc++_unsecure.pc")
1148*cc02d7e2SAndroid Build Coastguard Worker
1149*cc02d7e2SAndroid Build Coastguard Worker  # grpcpp_otel_plugin .pc file
1150*cc02d7e2SAndroid Build Coastguard Worker  generate_pkgconfig(
1151*cc02d7e2SAndroid Build Coastguard Worker    "gRPC++ OpenTelemetry Plugin"
1152*cc02d7e2SAndroid Build Coastguard Worker    "OpenTelemetry Plugin for gRPC C++"
1153*cc02d7e2SAndroid Build Coastguard Worker    "<%text>${gRPC_CPP_VERSION}</%text>"
1154*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires("grpcpp_otel_plugin"))}"
1155*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_requires_private("grpcpp_otel_plugin"))}"
1156*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs("grpcpp_otel_plugin"))}"
1157*cc02d7e2SAndroid Build Coastguard Worker    "${" ".join(get_pkgconfig_libs_private("grpcpp_otel_plugin"))}"
1158*cc02d7e2SAndroid Build Coastguard Worker    "grpcpp_otel_plugin.pc")
1159