mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-12 09:22:05 +00:00
470 lines
18 KiB
CMake
470 lines
18 KiB
CMake
# ~~~
|
|
# Copyright 2020 Google LLC
|
|
#
|
|
# 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
|
|
#
|
|
# https://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.
|
|
# ~~~
|
|
|
|
# File copied from google-cloud-cpp/external/googleapis/CMakeLists.txt with minor modifications.
|
|
|
|
if (NOT GOOGLE_CLOUD_CPP_ENABLE_GRPC)
|
|
return()
|
|
endif ()
|
|
|
|
include(GoogleapisConfig)
|
|
|
|
set(GOOGLE_CLOUD_CPP_GOOGLEAPIS_URL
|
|
"https://github.com/googleapis/googleapis/archive/${_GOOGLE_CLOUD_CPP_GOOGLEAPIS_COMMIT_SHA}.tar.gz"
|
|
"https://storage.googleapis.com/cloud-cpp-community-archive/github.com/googleapis/googleapis/archive/${_GOOGLE_CLOUD_CPP_GOOGLEAPIS_COMMIT_SHA}.tar.gz"
|
|
)
|
|
set(GOOGLE_CLOUD_CPP_GOOGLEAPIS_URL_HASH
|
|
"${_GOOGLE_CLOUD_CPP_GOOGLEAPIS_SHA256}")
|
|
if (GOOGLE_CLOUD_CPP_OVERRIDE_GOOGLEAPIS_URL)
|
|
set(GOOGLE_CLOUD_CPP_GOOGLEAPIS_URL
|
|
${GOOGLE_CLOUD_CPP_OVERRIDE_GOOGLEAPIS_URL})
|
|
endif ()
|
|
if (GOOGLE_CLOUD_CPP_OVERRIDE_GOOGLEAPIS_URL_HASH)
|
|
set(GOOGLE_CLOUD_CPP_GOOGLEAPIS_URL_HASH
|
|
"${GOOGLE_CLOUD_CPP_OVERRIDE_GOOGLEAPIS_URL_HASH}")
|
|
endif ()
|
|
|
|
set(EXTERNAL_GOOGLEAPIS_PROTO_FILES
|
|
# cmake-format: sort
|
|
"google/api/annotations.proto"
|
|
"google/api/auth.proto"
|
|
"google/api/backend.proto"
|
|
"google/api/billing.proto"
|
|
"google/api/client.proto"
|
|
"google/api/config_change.proto"
|
|
"google/api/consumer.proto"
|
|
"google/api/context.proto"
|
|
"google/api/control.proto"
|
|
"google/api/distribution.proto"
|
|
"google/api/documentation.proto"
|
|
"google/api/endpoint.proto"
|
|
"google/api/error_reason.proto"
|
|
"google/api/field_behavior.proto"
|
|
"google/api/field_info.proto"
|
|
"google/api/http.proto"
|
|
"google/api/httpbody.proto"
|
|
"google/api/label.proto"
|
|
"google/api/launch_stage.proto"
|
|
"google/api/log.proto"
|
|
"google/api/logging.proto"
|
|
"google/api/metric.proto"
|
|
"google/api/monitored_resource.proto"
|
|
"google/api/monitoring.proto"
|
|
"google/api/policy.proto"
|
|
"google/api/quota.proto"
|
|
"google/api/resource.proto"
|
|
"google/api/routing.proto"
|
|
"google/api/service.proto"
|
|
"google/api/source_info.proto"
|
|
"google/api/system_parameter.proto"
|
|
"google/api/usage.proto"
|
|
"google/api/visibility.proto"
|
|
"google/cloud/extended_operations.proto"
|
|
"google/cloud/location/locations.proto"
|
|
# orgpolicy/v**1** is used *indirectly* by google/cloud/asset, therefore it
|
|
# does not appear in protolists/asset.list. In addition, it is not compiled
|
|
# by any other library. So, added manually.
|
|
"google/cloud/orgpolicy/v1/orgpolicy.proto"
|
|
# Some gRPC based authentication is implemented by the IAM Credentials
|
|
# service.
|
|
"google/iam/credentials/v1/common.proto"
|
|
"google/iam/credentials/v1/iamcredentials.proto"
|
|
# We expose google::iam::v1::Policy in our google::cloud::IAMUpdater
|
|
"google/iam/v1/iam_policy.proto"
|
|
"google/iam/v1/options.proto"
|
|
"google/iam/v1/policy.proto"
|
|
"google/longrunning/operations.proto"
|
|
"google/rpc/code.proto"
|
|
"google/rpc/context/attribute_context.proto"
|
|
"google/rpc/error_details.proto"
|
|
"google/rpc/status.proto"
|
|
"google/type/calendar_period.proto"
|
|
"google/type/color.proto"
|
|
"google/type/date.proto"
|
|
"google/type/datetime.proto"
|
|
"google/type/dayofweek.proto"
|
|
"google/type/decimal.proto"
|
|
"google/type/expr.proto"
|
|
"google/type/fraction.proto"
|
|
"google/type/interval.proto"
|
|
"google/type/latlng.proto"
|
|
"google/type/localized_text.proto"
|
|
"google/type/money.proto"
|
|
"google/type/month.proto"
|
|
"google/type/phone_number.proto"
|
|
"google/type/postal_address.proto"
|
|
"google/type/quaternion.proto"
|
|
"google/type/timeofday.proto")
|
|
|
|
include(GoogleCloudCppCommonOptions)
|
|
|
|
# Set EXTERNAL_GOOGLEAPIS_SOURCE in the parent directory, as it is used by all
|
|
# the generated libraries. The Conan packages (https://conan.io), will need to
|
|
# patch this value. Setting the value in a single place makes such patching
|
|
# easier.
|
|
set(EXTERNAL_GOOGLEAPIS_PREFIX "${PROJECT_BINARY_DIR}/external/googleapis")
|
|
set(EXTERNAL_GOOGLEAPIS_SOURCE
|
|
"${EXTERNAL_GOOGLEAPIS_PREFIX}/src/googleapis_download"
|
|
PARENT_SCOPE)
|
|
set(EXTERNAL_GOOGLEAPIS_SOURCE
|
|
"${EXTERNAL_GOOGLEAPIS_PREFIX}/src/googleapis_download")
|
|
|
|
# Include the functions to compile proto files and maintain proto libraries.
|
|
include(CompileProtos)
|
|
|
|
set(EXTERNAL_GOOGLEAPIS_BYPRODUCTS)
|
|
foreach (proto ${EXTERNAL_GOOGLEAPIS_PROTO_FILES})
|
|
list(APPEND EXTERNAL_GOOGLEAPIS_BYPRODUCTS
|
|
"${EXTERNAL_GOOGLEAPIS_SOURCE}/${proto}")
|
|
endforeach ()
|
|
|
|
file(GLOB protolists "protolists/*.list")
|
|
foreach (file IN LISTS protolists)
|
|
google_cloud_cpp_load_protolist(protos "${file}")
|
|
foreach (proto IN LISTS protos)
|
|
list(APPEND EXTERNAL_GOOGLEAPIS_BYPRODUCTS "${proto}")
|
|
endforeach ()
|
|
endforeach ()
|
|
|
|
include(ExternalProject)
|
|
|
|
# -- The build needs protobuf files. The original build scripts download them from a remote server (see target 'googleapis_download').
|
|
# This is too unreliable in the context of ClickHouse ... we instead ship the downloaded archive with the ClickHouse source and
|
|
# extract it into the build directory directly.
|
|
|
|
# Dummy googleapis_download target. This needs to exist because lots of other targets depend on it
|
|
# We however trick it a little bit saying this target generates the ${EXTERNAL_GOOGLEAPIS_BYPRODUCTS} BYPRODUCTS when
|
|
# actually the following section is the one actually providing such BYPRODUCTS.
|
|
externalproject_add(
|
|
googleapis_download
|
|
EXCLUDE_FROM_ALL ON
|
|
PREFIX "${EXTERNAL_GOOGLEAPIS_PREFIX}"
|
|
PATCH_COMMAND ""
|
|
DOWNLOAD_COMMAND ""
|
|
CONFIGURE_COMMAND ""
|
|
BUILD_COMMAND ""
|
|
INSTALL_COMMAND ""
|
|
BUILD_BYPRODUCTS ${EXTERNAL_GOOGLEAPIS_BYPRODUCTS}
|
|
LOG_DOWNLOAD OFF)
|
|
|
|
# Command that extracts the tarball into the proper dir
|
|
# Note: The hash must match the Google Cloud Api version, otherwise funny things will happen.
|
|
# Find the right hash in "strip-prefix" in MODULE.bazel in the subrepository
|
|
message(STATUS "Extracting googleapis tarball")
|
|
set(PB_HASH "e60db19f11f94175ac682c5898cce0f77cc508ea")
|
|
set(PB_ARCHIVE "${PB_HASH}.tar.gz")
|
|
set(PB_DIR "googleapis-${PB_HASH}")
|
|
|
|
file(ARCHIVE_EXTRACT INPUT
|
|
"${ClickHouse_SOURCE_DIR}/contrib/google-cloud-cpp-cmake/googleapis/${PB_ARCHIVE}"
|
|
DESTINATION
|
|
"${EXTERNAL_GOOGLEAPIS_PREFIX}/tmp")
|
|
|
|
file(REMOVE_RECURSE "${EXTERNAL_GOOGLEAPIS_SOURCE}")
|
|
file(RENAME
|
|
"${EXTERNAL_GOOGLEAPIS_PREFIX}/tmp/${PB_DIR}"
|
|
"${EXTERNAL_GOOGLEAPIS_SOURCE}"
|
|
)
|
|
|
|
google_cloud_cpp_find_proto_include_dir(PROTO_INCLUDE_DIR)
|
|
|
|
google_cloud_cpp_add_protos_property()
|
|
|
|
function (external_googleapis_short_name var proto)
|
|
string(REPLACE "google/" "" short_name "${proto}")
|
|
string(REPLACE "/" "_" short_name "${short_name}")
|
|
string(REPLACE ".proto" "_protos" short_name "${short_name}")
|
|
set("${var}"
|
|
"${short_name}"
|
|
PARENT_SCOPE)
|
|
endfunction ()
|
|
|
|
# Create a single source proto library.
|
|
#
|
|
# * proto: the filename for the proto source.
|
|
# * (optional) ARGN: proto libraries the new library depends on.
|
|
function (external_googleapis_add_library proto)
|
|
external_googleapis_short_name(short_name "${proto}")
|
|
google_cloud_cpp_grpcpp_library(
|
|
google_cloud_cpp_${short_name} "${EXTERNAL_GOOGLEAPIS_SOURCE}/${proto}"
|
|
PROTO_PATH_DIRECTORIES "${EXTERNAL_GOOGLEAPIS_SOURCE}"
|
|
"${PROTO_INCLUDE_DIR}")
|
|
|
|
external_googleapis_set_version_and_alias("${short_name}")
|
|
|
|
set(public_deps)
|
|
foreach (dep_short_name ${ARGN})
|
|
list(APPEND public_deps "google-cloud-cpp::${dep_short_name}")
|
|
endforeach ()
|
|
list(LENGTH public_deps public_deps_length)
|
|
if (public_deps_length EQUAL 0)
|
|
target_link_libraries("google_cloud_cpp_${short_name}")
|
|
else ()
|
|
target_link_libraries("google_cloud_cpp_${short_name}"
|
|
PUBLIC ${public_deps})
|
|
endif ()
|
|
endfunction ()
|
|
|
|
function (external_googleapis_set_version_and_alias short_name)
|
|
add_dependencies("google_cloud_cpp_${short_name}" googleapis_download)
|
|
set_target_properties(
|
|
"google_cloud_cpp_${short_name}"
|
|
PROPERTIES EXPORT_NAME google-cloud-cpp::${short_name}
|
|
VERSION "${PROJECT_VERSION}"
|
|
SOVERSION ${PROJECT_VERSION_MAJOR})
|
|
add_library("google-cloud-cpp::${short_name}" ALIAS
|
|
"google_cloud_cpp_${short_name}")
|
|
endfunction ()
|
|
|
|
if (GOOGLE_CLOUD_CPP_USE_INSTALLED_COMMON)
|
|
return()
|
|
endif ()
|
|
|
|
# Avoid adding new proto libraries to this list as these libraries are always
|
|
# installed, regardless of whether or not they are needed. See #8022 for more
|
|
# details.
|
|
set(external_googleapis_installed_libraries_list
|
|
# cmake-format: sort
|
|
google_cloud_cpp_cloud_common_common_protos
|
|
google_cloud_cpp_iam_credentials_v1_common_protos
|
|
google_cloud_cpp_iam_credentials_v1_iamcredentials_protos
|
|
google_cloud_cpp_iam_v1_iam_policy_protos
|
|
google_cloud_cpp_iam_v1_options_protos
|
|
google_cloud_cpp_iam_v1_policy_protos
|
|
google_cloud_cpp_longrunning_operations_protos)
|
|
|
|
# These proto files cannot be added in the foreach() loop because they have
|
|
# dependencies.
|
|
set(PROTO_FILES_WITH_DEPENDENCIES
|
|
# cmake-format: sort
|
|
"google/api/annotations.proto"
|
|
"google/api/auth.proto"
|
|
"google/api/billing.proto"
|
|
"google/api/client.proto"
|
|
"google/api/control.proto"
|
|
"google/api/distribution.proto"
|
|
"google/api/endpoint.proto"
|
|
"google/api/log.proto"
|
|
"google/api/logging.proto"
|
|
"google/api/metric.proto"
|
|
"google/api/monitored_resource.proto"
|
|
"google/api/monitoring.proto"
|
|
"google/api/quota.proto"
|
|
"google/api/service.proto"
|
|
"google/api/usage.proto"
|
|
"google/cloud/location/locations.proto"
|
|
"google/rpc/status.proto")
|
|
|
|
# For some directories *most* (but not all) the proto files are simple enough
|
|
# that the libraries can be generated with a foreach() loop.
|
|
foreach (proto IN LISTS EXTERNAL_GOOGLEAPIS_PROTO_FILES)
|
|
if (proto MATCHES "^google/api/"
|
|
OR proto MATCHES "^google/type"
|
|
OR proto MATCHES "^google/rpc/"
|
|
OR proto MATCHES "^google/cloud/")
|
|
external_googleapis_short_name(short_name "${proto}")
|
|
list(APPEND external_googleapis_installed_libraries_list
|
|
google_cloud_cpp_${short_name})
|
|
list(FIND PROTO_FILES_WITH_DEPENDENCIES "${proto}" has_dependency)
|
|
if (has_dependency EQUAL -1)
|
|
external_googleapis_add_library("${proto}")
|
|
endif ()
|
|
endif ()
|
|
endforeach ()
|
|
|
|
# Out of order because they have dependencies.
|
|
external_googleapis_add_library("google/api/annotations.proto" api_http_protos)
|
|
external_googleapis_add_library("google/api/auth.proto" api_annotations_protos)
|
|
external_googleapis_add_library("google/api/client.proto"
|
|
api_launch_stage_protos)
|
|
external_googleapis_add_library("google/api/control.proto" api_policy_protos)
|
|
external_googleapis_add_library("google/api/metric.proto"
|
|
api_launch_stage_protos api_label_protos)
|
|
external_googleapis_add_library("google/api/billing.proto"
|
|
api_annotations_protos api_metric_protos)
|
|
external_googleapis_add_library("google/api/distribution.proto"
|
|
api_annotations_protos)
|
|
external_googleapis_add_library("google/api/endpoint.proto"
|
|
api_annotations_protos)
|
|
external_googleapis_add_library("google/api/log.proto" api_label_protos)
|
|
external_googleapis_add_library("google/api/logging.proto"
|
|
api_annotations_protos api_label_protos)
|
|
external_googleapis_add_library("google/api/monitored_resource.proto"
|
|
api_launch_stage_protos api_label_protos)
|
|
external_googleapis_add_library("google/api/monitoring.proto"
|
|
api_annotations_protos)
|
|
external_googleapis_add_library("google/api/quota.proto" api_annotations_protos)
|
|
external_googleapis_add_library("google/api/usage.proto" api_annotations_protos
|
|
api_visibility_protos)
|
|
external_googleapis_add_library(
|
|
"google/api/service.proto"
|
|
api_annotations_protos
|
|
api_auth_protos
|
|
api_backend_protos
|
|
api_billing_protos
|
|
api_client_protos
|
|
api_context_protos
|
|
api_control_protos
|
|
api_documentation_protos
|
|
api_endpoint_protos
|
|
api_http_protos
|
|
api_label_protos
|
|
api_log_protos
|
|
api_logging_protos
|
|
api_metric_protos
|
|
api_monitored_resource_protos
|
|
api_monitoring_protos
|
|
api_quota_protos
|
|
api_resource_protos
|
|
api_source_info_protos
|
|
api_system_parameter_protos
|
|
api_usage_protos)
|
|
|
|
external_googleapis_add_library("google/cloud/location/locations.proto"
|
|
api_annotations_protos api_client_protos)
|
|
|
|
external_googleapis_add_library("google/iam/v1/options.proto"
|
|
api_annotations_protos)
|
|
external_googleapis_add_library("google/iam/v1/policy.proto"
|
|
api_annotations_protos type_expr_protos)
|
|
external_googleapis_add_library("google/rpc/status.proto"
|
|
rpc_error_details_protos)
|
|
|
|
external_googleapis_add_library(
|
|
"google/longrunning/operations.proto" api_annotations_protos
|
|
api_client_protos rpc_status_protos)
|
|
|
|
external_googleapis_add_library(
|
|
"google/iam/v1/iam_policy.proto"
|
|
api_annotations_protos
|
|
api_client_protos
|
|
api_field_behavior_protos
|
|
api_resource_protos
|
|
iam_v1_options_protos
|
|
iam_v1_policy_protos)
|
|
|
|
external_googleapis_add_library("google/iam/credentials/v1/common.proto"
|
|
api_field_behavior_protos api_resource_protos)
|
|
|
|
external_googleapis_add_library(
|
|
"google/iam/credentials/v1/iamcredentials.proto" api_annotations_protos
|
|
api_client_protos iam_credentials_v1_common_protos)
|
|
|
|
google_cloud_cpp_load_protolist(cloud_common_list "${GOOGLE_CLOUD_CPP_DIR}/external/googleapis/protolists/common.list")
|
|
google_cloud_cpp_load_protodeps(cloud_common_deps "${GOOGLE_CLOUD_CPP_DIR}/external/googleapis/protodeps/common.deps")
|
|
google_cloud_cpp_grpcpp_library(
|
|
google_cloud_cpp_cloud_common_common_protos ${cloud_common_list}
|
|
PROTO_PATH_DIRECTORIES "${EXTERNAL_GOOGLEAPIS_SOURCE}"
|
|
"${PROTO_INCLUDE_DIR}")
|
|
external_googleapis_set_version_and_alias(cloud_common_common_protos)
|
|
target_link_libraries(google_cloud_cpp_cloud_common_common_protos
|
|
PUBLIC ${cloud_common_deps})
|
|
|
|
# Install the libraries and headers in the locations determined by
|
|
# GNUInstallDirs
|
|
include(GNUInstallDirs)
|
|
|
|
install(
|
|
TARGETS ${external_googleapis_installed_libraries_list}
|
|
EXPORT googleapis-targets
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
COMPONENT google_cloud_cpp_runtime
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
COMPONENT google_cloud_cpp_runtime
|
|
NAMELINK_COMPONENT google_cloud_cpp_development
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
COMPONENT google_cloud_cpp_development)
|
|
|
|
foreach (target ${external_googleapis_installed_libraries_list})
|
|
google_cloud_cpp_install_proto_library_headers("${target}")
|
|
google_cloud_cpp_install_proto_library_protos(
|
|
"${target}" "${EXTERNAL_GOOGLEAPIS_SOURCE}")
|
|
endforeach ()
|
|
|
|
# Create and install the pkg-config files.
|
|
foreach (target ${external_googleapis_installed_libraries_list})
|
|
external_googleapis_install_pc("${target}")
|
|
endforeach ()
|
|
|
|
# Create and install the googleapis pkg-config file for backwards compatibility.
|
|
set(GOOGLE_CLOUD_CPP_PC_LIBS "")
|
|
google_cloud_cpp_set_pkgconfig_paths()
|
|
set(GOOGLE_CLOUD_CPP_PC_NAME "The Google APIS C++ Proto Library")
|
|
set(GOOGLE_CLOUD_CPP_PC_DESCRIPTION
|
|
"Provides C++ APIs to access Google Cloud Platforms.")
|
|
# This list is for backwards compatibility purposes only. DO NOT add new
|
|
# libraries to it.
|
|
string(
|
|
JOIN
|
|
" "
|
|
GOOGLE_CLOUD_CPP_PC_REQUIRES
|
|
"google_cloud_cpp_bigtable_protos"
|
|
"google_cloud_cpp_cloud_bigquery_protos"
|
|
"google_cloud_cpp_iam_protos"
|
|
"google_cloud_cpp_pubsub_protos"
|
|
"google_cloud_cpp_storage_protos"
|
|
"google_cloud_cpp_logging_protos"
|
|
"google_cloud_cpp_iam_v1_iam_policy_protos"
|
|
"google_cloud_cpp_iam_v1_options_protos"
|
|
"google_cloud_cpp_iam_v1_policy_protos"
|
|
"google_cloud_cpp_longrunning_operations_protos"
|
|
"google_cloud_cpp_api_auth_protos"
|
|
"google_cloud_cpp_api_annotations_protos"
|
|
"google_cloud_cpp_api_client_protos"
|
|
"google_cloud_cpp_api_field_behavior_protos"
|
|
"google_cloud_cpp_api_http_protos"
|
|
"google_cloud_cpp_rpc_status_protos"
|
|
"google_cloud_cpp_rpc_error_details_protos"
|
|
"google_cloud_cpp_type_expr_protos"
|
|
"grpc++"
|
|
"grpc"
|
|
"openssl"
|
|
"protobuf"
|
|
"zlib"
|
|
"libcares")
|
|
set(GOOGLE_CLOUD_CPP_PC_LIBS "")
|
|
google_cloud_cpp_set_pkgconfig_paths()
|
|
configure_file("${PROJECT_SOURCE_DIR}/cmake/templates/config.pc.in"
|
|
"googleapis.pc" @ONLY)
|
|
install(
|
|
FILES "${CMAKE_CURRENT_BINARY_DIR}/googleapis.pc"
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
|
|
COMPONENT google_cloud_cpp_development)
|
|
|
|
# Create and install the CMake configuration files.
|
|
# include(CMakePackageConfigHelpers)
|
|
|
|
# configure_file("${CMAKE_CURRENT_LIST_DIR}/config.cmake.in"
|
|
# "google_cloud_cpp_googleapis-config.cmake" @ONLY)
|
|
# write_basic_package_version_file(
|
|
# "google_cloud_cpp_googleapis-config-version.cmake"
|
|
# VERSION ${PROJECT_VERSION}
|
|
# COMPATIBILITY ExactVersion)
|
|
|
|
# Export the CMake targets to make it easy to create configuration files.
|
|
# install(
|
|
# EXPORT googleapis-targets
|
|
# DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/google_cloud_cpp_googleapis"
|
|
# COMPONENT google_cloud_cpp_development)
|
|
# install(
|
|
# FILES
|
|
# "${CMAKE_CURRENT_BINARY_DIR}/google_cloud_cpp_googleapis-config.cmake"
|
|
# "${CMAKE_CURRENT_BINARY_DIR}/google_cloud_cpp_googleapis-config-version.cmake"
|
|
# "${PROJECT_SOURCE_DIR}/cmake/FindgRPC.cmake"
|
|
# "${PROJECT_SOURCE_DIR}/cmake/CompileProtos.cmake"
|
|
# DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/google_cloud_cpp_googleapis"
|
|
# COMPONENT google_cloud_cpp_development)
|