%YAML 1.2
--- |
  # GRPC global cmake file
  # This currently builds C and C++ code.
  # This file has been automatically generated from a template file.
  # Please look at the templates directory instead.
  # This file can be regenerated from the template by running
  # tools/buildgen/generate_projects.sh
  #
  # Copyright 2015 gRPC authors.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.

  <%
  import re

  proto_re = re.compile('(.*)\\.proto')
  lib_map = {lib.name: lib for lib in libs}

  def proto_replace_ext(filename, ext):
      m = proto_re.match(filename)
      if not m:
        return filename
      return '${_gRPC_PROTO_GENS_DIR}/' + m.group(1) + ext

  def is_absl_lib(lib_name):
      return lib_name.startswith("absl/");

  def get_absl_dep(lib_name):
      return lib_map[lib_name].cmake_target

  def lib_and_transitive_deps(lib):
    return list(sorted(set({lib} | set(lib_map[lib].transitive_deps))))

  def list_abseil_pkg_targets(lib):
    # This returns a list of abseil pkg targets which the given lib and
    # its non-abseil transitive dependencies depend on.
    # As a result, internal abseil libraries are excluded from the result.
    absl_specs = set()
    for lib_name in lib_and_transitive_deps(lib):
      if is_absl_lib(lib_name): continue
      for dep in lib_map[lib_name].deps:
        if is_absl_lib(dep):
          absl_specs.add(get_absl_dep(dep).replace("::", "_"))
    return list(sorted(absl_specs))

  def is_shared_only_lib(lib_name):
    """Returns True if only shared library should be generated."""
    # grpc_csharp_ext is loaded by C# runtime and it
    # only makes sense as a shared lib.
    return lib_name in ['grpc_csharp_ext']

  def get_deps(target_dict):
    deps = []
    if target_dict.get('baselib', False) or target_dict['name'] == 'address_sorting':
      deps.append("${_gRPC_BASELIB_LIBRARIES}")
    if target_dict.get('build', None) in ['protoc']:
      deps.append("${_gRPC_PROTOBUF_PROTOC_LIBRARIES}")
    if target_dict.language == 'c++':
      deps.append("${_gRPC_PROTOBUF_LIBRARIES}")
    if target_dict['name'] in ['grpc', 'grpc_cronet', 'grpc_unsecure']:
      deps.append("${_gRPC_ZLIB_LIBRARIES}")
      deps.append("${_gRPC_CARES_LIBRARIES}")
      deps.append("${_gRPC_ADDRESS_SORTING_LIBRARIES}")
      deps.append("${_gRPC_RE2_LIBRARIES}")
      deps.append("${_gRPC_UPB_LIBRARIES}")
    deps.append("${_gRPC_ALLTARGETS_LIBRARIES}")
    for d in target_dict.get('deps', []):
      if d == 'benchmark':
        deps.append("${_gRPC_BENCHMARK_LIBRARIES}")
      elif d == 'libssl':
        deps.append("${_gRPC_SSL_LIBRARIES}")
      elif is_absl_lib(d):
        deps.append(get_absl_dep(d))
      else:
        deps.append(d)
    return deps

  def get_platforms_condition_begin(platforms):
    if all(platform in platforms for platform in ['linux', 'mac', 'posix', 'windows']):
      return ''
    cond = ' OR '.join(['_gRPC_PLATFORM_%s' % platform.upper() for platform in platforms])
    return 'if(%s)' % cond

  def get_platforms_condition_end(platforms):
    if not get_platforms_condition_begin(platforms):
      return ''
    return 'endif()'

  def platforms_condition_block(platforms):
    def _func(text):
      lines = text.split('\n')
      cond = get_platforms_condition_begin(platforms)
      if cond:
        # Remove empty line following <%block>
        del lines[0]

        # Indent each line after
        for i, line in enumerate(lines[:-1]):
          if line:
            lines[i] = '  ' + line

        # Add the condition block
        lines.insert(0, cond)

        # Add endif() to the last line
        lines[-1] += 'endif()'
      else:
        # Remove empty line following <%block>
        del lines[0]

        # Strip leading whitespace from first line
        lines[0] = lines[0].lstrip(' ')

        # Remove empty line before </%block>
        del lines[-1]

      return '\n'.join(lines)
    return _func
  %>
  <%
  # These files are added to a set so that they are not duplicated if multiple
  # targets use them. Generating the same file multiple times with
  # add_custom_command() is not allowed in CMake.

  protobuf_gen_files = set()
  for tgt in targets:
    for src in tgt.src:
      if proto_re.match(src):
        protobuf_gen_files.add(src)
  for lib in libs:
    for src in lib.src:
      if proto_re.match(src):
        protobuf_gen_files.add(src)
  %>

  cmake_minimum_required(VERSION 3.5.1)

  set(PACKAGE_NAME          "grpc")
  set(PACKAGE_VERSION       "${settings.cpp_version}")
  set(gRPC_CORE_VERSION     "${settings.core_version}")
  set(gRPC_CORE_SOVERSION   "${settings.core_version.major}")
  set(gRPC_CPP_VERSION      "${settings.cpp_version}")
  set(gRPC_CPP_SOVERSION    "${settings.cpp_version.major}.${settings.cpp_version.minor}")
  set(gRPC_CSHARP_VERSION   "${settings.csharp_version}")
  set(gRPC_CSHARP_SOVERSION "${settings.csharp_version.major}.${settings.csharp_version.minor}")
  set(PACKAGE_STRING        "<%text>${PACKAGE_NAME} ${PACKAGE_VERSION}</%text>")
  set(PACKAGE_TARNAME       "<%text>${PACKAGE_NAME}-${PACKAGE_VERSION}</%text>")
  set(PACKAGE_BUGREPORT     "https://github.com/grpc/grpc/issues/")
  project(<%text>${PACKAGE_NAME}</%text> LANGUAGES C CXX)

  set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables")
  set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries")
  set(gRPC_INSTALL_INCLUDEDIR "include" CACHE STRING "Installation directory for headers")
  set(gRPC_INSTALL_CMAKEDIR "lib/cmake/<%text>${PACKAGE_NAME}</%text>" CACHE STRING "Installation directory for cmake config files")
  set(gRPC_INSTALL_SHAREDIR "share/grpc" CACHE STRING "Installation directory for root certificates")
  set(gRPC_BUILD_MSVC_MP_COUNT 0 CACHE STRING "The maximum number of processes for MSVC /MP option")

  # Options
  option(gRPC_BUILD_TESTS "Build tests" OFF)
  option(gRPC_BUILD_CODEGEN "Build codegen" ON)
  option(gRPC_BUILD_CSHARP_EXT "Build C# extensions" ON)
  option(gRPC_BACKWARDS_COMPATIBILITY_MODE "Build libraries that are binary compatible across a larger number of OS and libc versions" OFF)

  set(gRPC_INSTALL_default ON)
  if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
    # Disable gRPC_INSTALL by default if building as a submodule
    set(gRPC_INSTALL_default OFF)
  endif()
  set(gRPC_INSTALL <%text>${gRPC_INSTALL_default}</%text> CACHE BOOL
      "Generate installation target")

  # We can install dependencies from submodules if we're running
  # CMake v3.13 or newer.
  if(CMAKE_VERSION VERSION_LESS 3.13)
    set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE OFF)
  else()
    set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE ON)
  endif()

  # Providers for third-party dependencies (gRPC_*_PROVIDER properties):
  # "module": build the dependency using sources from git submodule (under third_party)
  # "package": use cmake's find_package functionality to locate a pre-installed dependency

  set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "Provider of zlib library")
  set_property(CACHE gRPC_ZLIB_PROVIDER PROPERTY STRINGS "module" "package")

  set(gRPC_CARES_PROVIDER "module" CACHE STRING "Provider of c-ares library")
  set_property(CACHE gRPC_CARES_PROVIDER PROPERTY STRINGS "module" "package")

  set(gRPC_RE2_PROVIDER "module" CACHE STRING "Provider of re2 library")
  set_property(CACHE gRPC_RE2_PROVIDER PROPERTY STRINGS "module" "package")

  set(gRPC_SSL_PROVIDER "module" CACHE STRING "Provider of ssl library")
  set_property(CACHE gRPC_SSL_PROVIDER PROPERTY STRINGS "module" "package")

  set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library")
  set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package")

  set(gRPC_PROTOBUF_PACKAGE_TYPE "" CACHE STRING "Algorithm for searching protobuf package")
  set_property(CACHE gRPC_PROTOBUF_PACKAGE_TYPE PROPERTY STRINGS "CONFIG" "MODULE")

  if(gRPC_BUILD_TESTS)
    set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library")
    set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package")
  else()
    set(gRPC_BENCHMARK_PROVIDER "none")
  endif()

  set(gRPC_ABSL_PROVIDER "module" CACHE STRING "Provider of absl library")
  set_property(CACHE gRPC_ABSL_PROVIDER PROPERTY STRINGS "module" "package")
  <%
    # Collect all abseil rules used by gpr, grpc, so on.
    used_abseil_rules = set()
    for lib in libs:
      if lib.get("baselib"):
        for dep in lib.transitive_deps:
          if is_absl_lib(dep):
            used_abseil_rules.add(lib_map[dep].cmake_target.replace("::", "_"))
  %>
  set(gRPC_ABSL_USED_TARGETS
  % for rule in sorted(used_abseil_rules):
    ${rule}
  % endfor
    absl_meta
  )

  set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library")

  if(UNIX)
    if(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Linux")
      set(_gRPC_PLATFORM_LINUX ON)
    elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Darwin")
      set(_gRPC_PLATFORM_MAC ON)
    elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "iOS")
      set(_gRPC_PLATFORM_IOS ON)
    elseif(<%text>${CMAKE_SYSTEM_NAME}</%text> MATCHES "Android")
      set(_gRPC_PLATFORM_ANDROID ON)
    else()
      set(_gRPC_PLATFORM_POSIX ON)
    endif()
  endif()
  if(WIN32)
    set(_gRPC_PLATFORM_WINDOWS ON)
  endif()

   # Use C99 standard
  if (NOT DEFINED CMAKE_C_STANDARD)
    set(CMAKE_C_STANDARD 99)
  endif()

  # Add c++11 flags
  if (NOT DEFINED CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 11)
  else()
    if (CMAKE_CXX_STANDARD LESS 11)
      message(FATAL_ERROR "CMAKE_CXX_STANDARD is less than 11, please specify at least SET(CMAKE_CXX_STANDARD 11)")
    endif()
  endif()
  if (NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
  endif()
  if (NOT DEFINED CMAKE_CXX_EXTENSIONS)
    set(CMAKE_CXX_EXTENSIONS OFF)
  endif()

  ## Some libraries are shared even with BUILD_SHARED_LIBRARIES=OFF
  if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
    set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
  endif()
  list(APPEND CMAKE_MODULE_PATH "<%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules")

  if(MSVC)
    include(cmake/msvc_static_runtime.cmake)
    add_definitions(-D_WIN32_WINNT=0x600 -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
    # Set /MP option
    if (gRPC_BUILD_MSVC_MP_COUNT GREATER 0)
      set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS} /MP${gRPC_BUILD_MSVC_MP_COUNT}</%text>")
    elseif (gRPC_BUILD_MSVC_MP_COUNT LESS 0)
      set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /MP")
    endif()
    # needed to compile protobuf
    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4065 /wd4506")
    # TODO(jtattermusch): revisit warnings that were silenced as part of upgrade to protobuf3.6.0
    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4200 /wd4291 /wd4244")
    # TODO(jtattermusch): revisit C4267 occurrences throughout the code
    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4267")
    # TODO(jtattermusch): needed to build boringssl with VS2017, revisit later
    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4987 /wd4774 /wd4819 /wd4996 /wd4619")
    # Silences thousands of trucation warnings
    set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS}</%text> /wd4503")
  endif()
  if (MINGW)
    add_definitions(-D_WIN32_WINNT=0x600)
  endif()
  set(CMAKE_C_FLAGS "<%text>${CMAKE_C_FLAGS} ${_gRPC_C_CXX_FLAGS}</%text>")
  set(CMAKE_CXX_FLAGS "<%text>${CMAKE_CXX_FLAGS} ${_gRPC_C_CXX_FLAGS}</%text>")

  if(gRPC_USE_PROTO_LITE)
    set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf-lite")
    add_definitions("-DGRPC_USE_PROTO_LITE")
  else()
    set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf")
  endif()

  if(gRPC_BACKWARDS_COMPATIBILITY_MODE)
    add_definitions(-DGPR_BACKWARDS_COMPATIBILITY_MODE)
    if(_gRPC_PLATFORM_MAC)
      # some C++11 constructs not supported before OS X 10.10
      set(CMAKE_OSX_DEPLOYMENT_TARGET 10.10)
    endif()
  endif()

  if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS)
    set(_gRPC_CORE_NOSTDCXX_FLAGS -fno-exceptions -fno-rtti)
  else()
    set(_gRPC_CORE_NOSTDCXX_FLAGS "")
  endif()

  if (gRPC_XDS_USER_AGENT_IS_CSHARP)
    # The value of the defines needs to contain quotes.
    # See https://github.com/grpc/grpc/blob/fbf32836a418cc84f58786700273b65cb9174e1d/src/core/ext/xds/xds_api.cc#L854
    add_definitions("-DGRPC_XDS_USER_AGENT_NAME_SUFFIX=\"csharp\"" "-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX=\"${settings.csharp_version}\"")
  endif()

  if(UNIX)
    # -pthread does more than -lpthread
    set(THREADS_PREFER_PTHREAD_FLAG ON)
    find_package(Threads)
    set(_gRPC_ALLTARGETS_LIBRARIES <%text>${CMAKE_DL_LIBS}</%text> m Threads::Threads)
    if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
      set(_gRPC_ALLTARGETS_LIBRARIES <%text>${_gRPC_ALLTARGETS_LIBRARIES}</%text> rt)
    endif()
  endif()

  # configure ccache if requested
  include(cmake/ccache.cmake)

  include(cmake/abseil-cpp.cmake)
  include(cmake/address_sorting.cmake)
  include(cmake/benchmark.cmake)
  include(cmake/cares.cmake)
  include(cmake/protobuf.cmake)
  include(cmake/re2.cmake)
  include(cmake/ssl.cmake)
  include(cmake/upb.cmake)
  include(cmake/xxhash.cmake)
  include(cmake/zlib.cmake)

  if(WIN32)
    set(_gRPC_BASELIB_LIBRARIES ws2_32 crypt32)
  endif()

  # Create directory for generated .proto files
  set(_gRPC_PROTO_GENS_DIR <%text>${CMAKE_BINARY_DIR}/gens</%text>)
  file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_GENS_DIR}</%text>)

  #  protobuf_generate_grpc_cpp
  #  --------------------------
  #
  #   Add custom commands to process ``.proto`` files to C++ using protoc and
  #   GRPC plugin::
  #
  #     protobuf_generate_grpc_cpp [<ARGN>...]
  #
  #   ``ARGN``
  #     ``.proto`` files
  #
  function(protobuf_generate_grpc_cpp)
    if(NOT ARGN)
      message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
      return()
    endif()

    set(_protobuf_include_path -I . -I <%text>${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR}</%text>)
    foreach(FIL <%text>${ARGN}</%text>)
      get_filename_component(ABS_FIL <%text>${FIL}</%text> ABSOLUTE)
      get_filename_component(FIL_WE <%text>${FIL}</%text> NAME_WE)
      file(RELATIVE_PATH REL_FIL <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text> <%text>${ABS_FIL}</%text>)
      get_filename_component(REL_DIR <%text>${REL_FIL}</%text> DIRECTORY)
      set(RELFIL_WE "<%text>${REL_DIR}/${FIL_WE}</%text>")

      #if cross-compiling, find host plugin
      if(CMAKE_CROSSCOMPILING)
        find_program(_gRPC_CPP_PLUGIN grpc_cpp_plugin)
      else()
        set(_gRPC_CPP_PLUGIN $<TARGET_FILE:grpc_cpp_plugin>)
      endif()

      add_custom_command(
        OUTPUT <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"</%text>
               <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"</%text>
               <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}_mock.grpc.pb.h"</%text>
               <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"</%text>
               <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"</%text>
        COMMAND <%text>${_gRPC_PROTOBUF_PROTOC_EXECUTABLE}</%text>
        ARGS --grpc_out=<%text>generate_mock_code=true:${_gRPC_PROTO_GENS_DIR}</%text>
             --cpp_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
             --plugin=protoc-gen-grpc=<%text>${_gRPC_CPP_PLUGIN}</%text>
             <%text>${_protobuf_include_path}</%text>
             <%text>${REL_FIL}</%text>
        DEPENDS <%text>${ABS_FIL}</%text> <%text>${_gRPC_PROTOBUF_PROTOC}</%text> <%text>${_gRPC_CPP_PLUGIN}</%text>
        WORKING_DIRECTORY <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
        COMMENT "Running gRPC C++ protocol buffer compiler on <%text>${FIL}</%text>"
        VERBATIM)
    endforeach()
  endfunction()

  # These options allow users to enable or disable the building of the various
  # protoc plugins. For example, running CMake with
  # -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF will disable building the C# plugin.
  set(_gRPC_PLUGIN_LIST)
  % for tgt in targets:
  % if tgt.build == 'protoc':
  option(gRPC_BUILD_${tgt.name.upper()} "Build ${tgt.name}" ON)
  if (gRPC_BUILD_${tgt.name.upper()})
    list(APPEND _gRPC_PLUGIN_LIST ${tgt.name})
  endif ()
  % endif
  % endfor

  add_custom_target(plugins
    DEPENDS <%text>${_gRPC_PLUGIN_LIST}</%text>
  )

  add_custom_target(tools_c
    DEPENDS
  % for tgt in targets:
  % if tgt.build == 'tool' and not tgt.language == 'c++':
    ${tgt.name}
  % endif
  % endfor
  )

  add_custom_target(tools_cxx
    DEPENDS
  % for tgt in targets:
  % if tgt.build == 'tool' and tgt.language == 'c++':
    ${tgt.name}
  % endif
  % endfor
  )

  add_custom_target(tools
    DEPENDS tools_c tools_cxx)

  % for src in sorted(protobuf_gen_files):
  protobuf_generate_grpc_cpp(
    ${src}
  )
  % endfor

  if(gRPC_BUILD_TESTS)
    add_custom_target(buildtests_c)
    % for tgt in targets:
    % if tgt.build == 'test' and not tgt.language == 'c++' and not tgt.get('external_deps', None) and not tgt.boringssl:
    <%block filter='platforms_condition_block(tgt.platforms)'>
    add_dependencies(buildtests_c ${tgt.name})
    </%block>
    % endif
    % endfor

    add_custom_target(buildtests_cxx)
    % for tgt in targets:
    % if tgt.build == 'test' and tgt.language == 'c++' and not tgt.get('external_deps', None) and not tgt.boringssl:
    <%block filter='platforms_condition_block(tgt.platforms)'>
    add_dependencies(buildtests_cxx ${tgt.name})
    </%block>
    % endif
    % endfor

    add_custom_target(buildtests
      DEPENDS buildtests_c buildtests_cxx)
  endif()
  <%
    cmake_libs = []
    for lib in libs:
      if lib.build not in ["all", "protoc", "tool", "test", "private"] or lib.boringssl: continue
      if lib.get('build_system', []) and 'cmake' not in lib.get('build_system', []): continue
      if lib.name in ['ares', 'benchmark', 're2', 'xxhash', 'z']: continue  # we build these using CMake instead
      if is_absl_lib(lib.name): continue  # we build these using CMake instead
      cmake_libs.append(lib)
  %>
  % for lib in cmake_libs:
  %   if lib.build in ["test", "private"]:
  if(gRPC_BUILD_TESTS)
  ${cc_library(lib)}
  endif()
  %   elif lib.name in ['grpc_csharp_ext']:
  if(gRPC_BUILD_CSHARP_EXT)
  ${cc_library(lib)}
  endif()
  %   else:
  ${cc_library(lib)}
  %     if not lib.build in ["tool"]:
  %       if any(proto_re.match(src) for src in lib.src):
  if(gRPC_BUILD_CODEGEN)
  %       endif
  ${cc_install(lib)}
  %       if any(proto_re.match(src) for src in lib.src):
  endif()
  %       endif
  %     endif
  %   endif
  % endfor

  % for tgt in targets:
  % if tgt.build in ["all", "protoc", "tool", "test", "private"] and not tgt.boringssl:
  % if tgt.build in ["test", "private"]:
  if(gRPC_BUILD_TESTS)
  <%block filter='platforms_condition_block(tgt.platforms)'>
  ${cc_binary(tgt)}
  </%block>
  endif()
  % elif tgt.build in ["protoc"]:
  if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_${tgt.name.upper()})
  <%block filter='platforms_condition_block(tgt.platforms)'>
  ${cc_binary(tgt)}
  ${cc_install(tgt)}
  </%block>
  endif()
  % else:
  <%block filter='platforms_condition_block(tgt.platforms)'>
  ${cc_binary(tgt)}
  % if not tgt.build in ["tool"]:
  ${cc_install(tgt)}
  % endif
  </%block>
  % endif
  % endif
  % endfor

  <%def name="cc_library(lib)">
  % if any(proto_re.match(src) for src in lib.src):
  % if lib.name == 'grpcpp_channelz':
  # grpcpp_channelz doesn't build with protobuf-lite
  # See https://github.com/grpc/grpc/issues/19473
  if(gRPC_BUILD_CODEGEN AND NOT gRPC_USE_PROTO_LITE)
  % else:
  if(gRPC_BUILD_CODEGEN)
  % endif
  % endif
  add_library(${lib.name}${' SHARED' if is_shared_only_lib(lib.name) else ''}
  % for src in lib.src:
  % if not proto_re.match(src):
    ${src}
  % else:
    ${proto_replace_ext(src, '.pb.cc')}
    ${proto_replace_ext(src, '.grpc.pb.cc')}
    ${proto_replace_ext(src, '.pb.h')}
    ${proto_replace_ext(src, '.grpc.pb.h')}
    % if src in ["src/proto/grpc/testing/compiler_test.proto", "src/proto/grpc/testing/echo.proto"]:
    ${proto_replace_ext(src, '_mock.grpc.pb.h')}
    % endif
  % endif
  % endfor
  )

  set_target_properties(${lib.name} PROPERTIES
  % if lib.language == 'c++':
    VERSION <%text>${gRPC_CPP_VERSION}</%text>
    SOVERSION <%text>${gRPC_CPP_SOVERSION}</%text>
  % elif lib.language == 'csharp':
    VERSION <%text>${gRPC_CSHARP_VERSION}</%text>
    SOVERSION <%text>${gRPC_CSHARP_SOVERSION}</%text>
  % else:
    VERSION <%text>${gRPC_CORE_VERSION}</%text>
    SOVERSION <%text>${gRPC_CORE_SOVERSION}</%text>
  % endif
  )

  if(WIN32 AND MSVC)
    set_target_properties(${lib.name} PROPERTIES COMPILE_PDB_NAME "${lib.name}"
      COMPILE_PDB_OUTPUT_DIRECTORY <%text>"${CMAKE_BINARY_DIR}</%text>"
    )
    if(gRPC_INSTALL)
      install(FILES <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>${lib.name}.pdb
        DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text> OPTIONAL
      )
    endif()
  endif()

  target_include_directories(${lib.name}
    PUBLIC <%text>$<INSTALL_INTERFACE:${gRPC_INSTALL_INCLUDEDIR}> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include></%text>
    PRIVATE
      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
      <%text>${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}</%text>
      <%text>${_gRPC_RE2_INCLUDE_DIR}</%text>
      <%text>${_gRPC_SSL_INCLUDE_DIR}</%text>
      <%text>${_gRPC_UPB_GENERATED_DIR}</%text>
      <%text>${_gRPC_UPB_GRPC_GENERATED_DIR}</%text>
      <%text>${_gRPC_UPB_INCLUDE_DIR}</%text>
      <%text>${_gRPC_XXHASH_INCLUDE_DIR}</%text>
      <%text>${_gRPC_ZLIB_INCLUDE_DIR}</%text>
  % if lib.build in ['test', 'private'] and lib.language == 'c++':
      third_party/googletest/googletest/include
      third_party/googletest/googletest
      third_party/googletest/googlemock/include
      third_party/googletest/googlemock
  % endif
  % if lib.language == 'c++':
      <%text>${_gRPC_PROTO_GENS_DIR}</%text>
  % endif
  )
  % if len(get_deps(lib)) > 0:
  target_link_libraries(${lib.name}
  % for dep in get_deps(lib):
    ${dep}
  % endfor
  )
  % endif
  % if lib.name in ["gpr"]:
  if(_gRPC_PLATFORM_ANDROID)
    target_link_libraries(gpr
      android
      log
    )
  endif()
  % endif
  % if lib.name in ["grpc", "grpc_cronet", "grpc_test_util", \
                    "grpc_test_util_unsecure", "grpc_unsecure", \
                    "grpc++_cronet"]:
  if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC)
    target_link_libraries(${lib.name} "-framework CoreFoundation")
  endif()
  %endif

  % if len(lib.get('public_headers', [])) > 0:
  foreach(_hdr
  % for hdr in lib.get('public_headers', []):
    ${hdr}
  % endfor
  )
    string(REPLACE "include/" "" _path <%text>${_hdr}</%text>)
    get_filename_component(_path <%text>${_path}</%text> PATH)
    install(FILES <%text>${_hdr}</%text>
      DESTINATION "<%text>${gRPC_INSTALL_INCLUDEDIR}/${_path}</%text>"
    )
  endforeach()
  % endif
  % if any(proto_re.match(src) for src in lib.src):
  endif()
  % endif
  </%def>

  <%def name="cc_binary(tgt)">
  add_executable(${tgt.name}
  % for src in tgt.src:
  % if not proto_re.match(src):
    ${src}
  % else:
    ${proto_replace_ext(src, '.pb.cc')}
    ${proto_replace_ext(src, '.grpc.pb.cc')}
    ${proto_replace_ext(src, '.pb.h')}
    ${proto_replace_ext(src, '.grpc.pb.h')}
  % endif
  % endfor
  % if tgt.build == 'test' and tgt.language == 'c++':
    third_party/googletest/googletest/src/gtest-all.cc
    third_party/googletest/googlemock/src/gmock-all.cc
  % endif
  )

  target_include_directories(${tgt.name}
    PRIVATE
      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/include
      <%text>${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}</%text>
      <%text>${_gRPC_RE2_INCLUDE_DIR}</%text>
      <%text>${_gRPC_SSL_INCLUDE_DIR}</%text>
      <%text>${_gRPC_UPB_GENERATED_DIR}</%text>
      <%text>${_gRPC_UPB_GRPC_GENERATED_DIR}</%text>
      <%text>${_gRPC_UPB_INCLUDE_DIR}</%text>
      <%text>${_gRPC_XXHASH_INCLUDE_DIR}</%text>
      <%text>${_gRPC_ZLIB_INCLUDE_DIR}</%text>
  % if tgt.build in ['test', 'private'] and tgt.language == 'c++':
      third_party/googletest/googletest/include
      third_party/googletest/googletest
      third_party/googletest/googlemock/include
      third_party/googletest/googlemock
  % endif
  % if tgt.language == 'c++':
      <%text>${_gRPC_PROTO_GENS_DIR}</%text>
  % endif
  )

  % if len(get_deps(tgt)) > 0:
  target_link_libraries(${tgt.name}
  % for dep in get_deps(tgt):
    ${dep}
  % endfor
  )

  % endif
  </%def>

  <%def name="cc_install(tgt)">
  % if tgt.name == 'grpcpp_channelz':
  # grpcpp_channelz doesn't build with protobuf-lite, so no install required
  # See https://github.com/grpc/grpc/issues/22826
  if(gRPC_INSTALL AND NOT gRPC_USE_PROTO_LITE)
  % else:
  if(gRPC_INSTALL)
  % endif
    install(TARGETS ${tgt.name} EXPORT gRPCTargets
      RUNTIME DESTINATION <%text>${gRPC_INSTALL_BINDIR}</%text>
      BUNDLE DESTINATION  <%text>${gRPC_INSTALL_BINDIR}</%text>
      LIBRARY DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text>
      ARCHIVE DESTINATION <%text>${gRPC_INSTALL_LIBDIR}</%text>
    )
  endif()
  </%def>

  if(gRPC_INSTALL)
    install(EXPORT gRPCTargets
      DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>
      NAMESPACE gRPC::
    )
  endif()

  include(CMakePackageConfigHelpers)

  configure_file(cmake/gRPCConfig.cmake.in
    gRPCConfig.cmake @ONLY)
  write_basic_package_version_file(<%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfigVersion.cmake
    VERSION <%text>${gRPC_CPP_VERSION}</%text>
    COMPATIBILITY AnyNewerVersion)
  install(FILES
      <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfig.cmake
      <%text>${CMAKE_CURRENT_BINARY_DIR}/</%text>gRPCConfigVersion.cmake
    DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>
  )
  install(FILES
      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules/Findc-ares.cmake
      <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/cmake/modules/Findre2.cmake
    DESTINATION <%text>${gRPC_INSTALL_CMAKEDIR}</%text>/modules
  )

  install(FILES <%text>${CMAKE_CURRENT_SOURCE_DIR}/etc/roots.pem</%text>
    DESTINATION <%text>${gRPC_INSTALL_SHAREDIR}</%text>)

  # Function to generate pkg-config files.
  function(generate_pkgconfig name description version requires
                              libs libs_private output_filename)
    set(PC_NAME "<%text>${name}</%text>")
    set(PC_DESCRIPTION "<%text>${description}</%text>")
    set(PC_VERSION "<%text>${version}</%text>")
    set(PC_REQUIRES "<%text>${requires}</%text>")
    set(PC_LIB "<%text>${libs}</%text>")
    set(PC_LIBS_PRIVATE "<%text>${libs_private}</%text>")
    set(output_filepath "<%text>${grpc_BINARY_DIR}/libs/opt/pkgconfig/${output_filename}</%text>")
    configure_file(
      "<%text>${grpc_SOURCE_DIR}/cmake/pkg-config-template.pc.in</%text>"
      "<%text>${output_filepath}</%text>"
      @ONLY)
    install(FILES "<%text>${output_filepath}</%text>"
      DESTINATION "lib/pkgconfig/")
  endfunction()

  # gpr .pc file
  generate_pkgconfig(
    "gpr"
    "gRPC platform support library"
    "<%text>${gRPC_CORE_VERSION}</%text>"
    "${" ".join(list_abseil_pkg_targets("gpr"))}"
    "${" ".join(("-l" + l) for l in ["gpr"])}"
    ""
    "gpr.pc")

  # grpc .pc file
  generate_pkgconfig(
    "gRPC"
    "high performance general RPC framework"
    "<%text>${gRPC_CORE_VERSION}</%text>"
    "${" ".join(["gpr", "openssl"] + list_abseil_pkg_targets("grpc"))}"
    "${" ".join(("-l" + l) for l in ["grpc", "address_sorting", "re2", "upb", "cares", "z"])}"
    ""
    "grpc.pc")

  # grpc_unsecure .pc file
  generate_pkgconfig(
    "gRPC unsecure"
    "high performance general RPC framework without SSL"
    "<%text>${gRPC_CORE_VERSION}</%text>"
    "${" ".join(["gpr"] + list_abseil_pkg_targets("grpc_unsecure"))}"
    "${" ".join(("-l" + l) for l in ["grpc_unsecure"])}"
    ""
    "grpc_unsecure.pc")

  # grpc++ .pc file
  generate_pkgconfig(
    "gRPC++"
    "C++ wrapper for gRPC"
    "<%text>${gRPC_CPP_VERSION}</%text>"
    "${" ".join(["grpc"] + list_abseil_pkg_targets("grpc++"))}"
    "${" ".join(("-l" + l) for l in ["grpc++"])}"
    ""
    "grpc++.pc")

  # grpc++_unsecure .pc file
  generate_pkgconfig(
    "gRPC++ unsecure"
    "C++ wrapper for gRPC without SSL"
    "<%text>${gRPC_CPP_VERSION}</%text>"
    "${" ".join(["grpc_unsecure"] + list_abseil_pkg_targets("grpc++_unsecure"))}"
    "${" ".join(("-l" + l) for l in ["grpc++_unsecure"])}"
    ""
    "grpc++_unsecure.pc")
