/google-cloud-cpp

C++ Client Libraries for Google Cloud Services

Primary LanguageC++Apache License 2.0Apache-2.0

Google Cloud Platform C++ Client Libraries

GCB CI status Kokoro CI status Kokoro CI status Codecov Coverage status
GCB CI status Kokoro CI status Kokoro CI status

This repository contains idiomatic C++ client libraries for the following Google Cloud Platform services.

Please check the CHANGELOG for important announcements and upcoming changes.
In particular, note that on (or about) 2022-06-01 this library will require C++ >= 14.

See each library's README.md file for more information about:

  • Where to find the documentation for the library and the service.
  • How to get started using the library.
  • How to incorporate the library into your build system.
  • The library's support status if not Generally Available (GA); unless noted in a library's README.md, these libraries are all GA and supported by Google.

Building and Installing

This is a quickstart guide for developers wanting to compile the libraries and run the examples included with the libraries.

  • Packaging maintainers or developers who prefer to install the library in a fixed directory (such as /usr/local or /opt) should consult the packaging guide.
  • Developers wanting to use the libraries as part of a larger CMake or Bazel project should consult the quickstart guides for the library or libraries they want to use.
  • Developers wanting to compile the library just to run some of the examples or tests should read the current document.
  • Contributors and developers to google-cloud-cpp should consult the guide to setup a development workstation.

Building with Bazel

This library requires Bazel >= 4.0. From the top-level directory, run the usual commands.

bazel build //...

Building with CMake

This library requires CMake >= 3.5. If you are planning to install the libraries please consult the packaging guide, these instructions will NOT produce artifacts that you can put in /usr/local, or share with your colleagues.

From the top-level directory of google-cloud-cpp run these commands:

git -C $HOME clone https://github.com/microsoft/vcpkg.git
env VCPKG_ROOT=$HOME/vcpkg $HOME/vcpkg/bootstrap-vcpkg.sh
cmake -H. -Bcmake-out/ -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build cmake-out -- -j $(nproc)

The binary artifacts, such as examples, will be placed in cmake-out/.

Quickstart

Each library (linked above) contains a directory named quickstart/ that's intended to help you get up and running in a matter of minutes. This quickstart/ directory contains a minimal "Hello World" program demonstrating how to use the library, along with minimal build files for common build systems, such as CMake and Bazel.

As an example, the following code snippet, taken from Google Cloud Storage, should give you a taste of what it's like to use one of these C++ libraries.

#include "google/cloud/storage/client.h"
#include <iostream>

int main(int argc, char* argv[]) {
  if (argc != 2) {
    std::cerr << "Missing bucket name.\n";
    std::cerr << "Usage: quickstart <bucket-name>\n";
    return 1;
  }
  std::string const bucket_name = argv[1];

  // Create aliases to make the code easier to read.
  namespace gcs = ::google::cloud::storage;

  // Create a client to communicate with Google Cloud Storage. This client
  // uses the default configuration for authentication and project id.
  auto client = gcs::Client();

  auto writer = client.WriteObject(bucket_name, "quickstart.txt");
  writer << "Hello World!";
  writer.Close();
  if (writer.metadata()) {
    std::cout << "Successfully created object: " << *writer.metadata() << "\n";
  } else {
    std::cerr << "Error creating object: " << writer.metadata().status()
              << "\n";
    return 1;
  }

  auto reader = client.ReadObject(bucket_name, "quickstart.txt");
  if (!reader) {
    std::cerr << "Error reading object: " << reader.status() << "\n";
    return 1;
  }

  std::string contents{std::istreambuf_iterator<char>{reader}, {}};
  std::cout << contents << "\n";

  return 0;
}

Support

  • This project supports Windows, macOS, Linux
  • This project supports C++11 (and higher) compilers (we test with GCC >= 6.3, Clang >= 6.0, and MSVC >= 2017)
  • This project supports Bazel (>= 4.0) and CMake (>= 3.5) builds. See the Quickstart examples
  • This project uses dependencies described in doc/packaging.md
  • This project works with or without exceptions enabled
  • This project cuts monthly releases with detailed release notes

Public API and API Breaking Changes

In general, we avoid making backwards incompatible changes to our C++ APIs (see below for the definition of "API"). Sometimes such changes yield benefits to our customers, in the form of better performance, easier-to-understand APIs, and/or more consistent APIs across services. When these benefits warrant it, we will announce these changes prominently in our CHANGELOG.md file and in the affected release's notes. Nevertheless, though we take commercially reasonable efforts to prevent this, it is possible that backwards incompatible changes go undetected and, therefore, undocumented. We apologize if this is the case and welcome feedback or bug reports to rectify the problem.

By "API" we mean the C++ API exposed by public header files in this repo. We are not talking about the gRPC or REST APIs exposed by Google Cloud servers. We are also talking only about API stability -- the ABI is subject to change without notice. You should not assume that binary artifacts (e.g. static libraries, shared objects, dynamically loaded libraries, object files) created with one version of the library are usable with newer/older versions of the library. The ABI may, and does, change on "minor revisions", and even patch releases.

We request that our customers adhere to the following guidelines to avoid accidentally depending on parts of the library we do not consider to be part of the public API and therefore may change (including removal) without notice:

Previous versions of the library will remain available on the GitHub Releases page. In many cases, you will be able to use an older version even if a newer version has changes that you are unable (or do not have time) to adopt.

Note that this document has no bearing on the Google Cloud Platform deprecation policy described at https://cloud.google.com/terms.

C++ Symbols and Files

  • You should only include headers matching the google/cloud/${library}/*.h, google/cloud/${library}/mock/*.h or google/cloud/*.h patterns.
  • You should NOT directly include headers in any subdirectories, such as google/cloud/${library}/internal.
  • The files included from our public headers are not part of our public API. Depending on indirect includes may break your build in the future, as we may change a header "foo.h" to stop including "bar.h" if "foo.h" no longer needs the symbols in "bar.h". To avoid having your code broken, you should directly include the public headers that define all the symbols you use (this is sometimes known as include-what-you-use).
  • Any file or symbol that lives within a directory or namespace containing internal, impl, test, detail, benchmark, sample, or example, is explicitly not part of our public API.
  • Any file or symbol with Impl or impl in its name is not part of our public API.
  • Any symbol with experimental in its name is not part of the public API.
  • You should avoid naming our inline namespaces (even avoid spelling the preprocessor names like GOOGLE_CLOUD_CPP_NS) and instead rely on them being a transparent versioning mechanism that you almost certainly don't care about. If you do spell out specific inline namespace names, your code will be tightly coupled with that specific version and will likely break when upgrading to a new version of our library.

Beyond the C++ API

Applications developers interact with a C++ library through more than just the C++ symbols and headers. They also need to reference the name of the library in their build scripts. Depending on the build system they use this may be a CMake target, a Bazel rule, a pkg-config module, or just the name of some object in the file system.

As with the C++ API, we try to avoid breaking changes to these interface points. Sometimes such changes yield benefits to our customers, in the form of bug fixes, increased consistency across services, or easier to understand names. When these benefits warrant it, we will announce these changes prominently in our CHANGELOG.md file and in the affected release's notes. Nevertheless, though we take commercially reasonable efforts to prevent this, it is possible that backwards incompatible changes go undetected and, therefore, undocumented. We apologize if this is the case and welcome feedback or bug reports to rectify the problem.

Experimental Libraries

From time to time we add libraries to google-cloud-cpp to validate new designs, expose experimental (or otherwise not generally available) GCP features, or simply because a library is not yet complete. Such libraries will have experimental in their CMake target and Bazel rule names. The README file for these libraries will also document that they are experimental. Such libraries are subject to change, including removal, without notice. This includes, but it is not limited to, all their symbols, pre-processor macros, files, targets, rules, and installed artifacts.

Bazel rules

Only the rules exported at the top-level directory are intended for customer use, e.g.,//:spanner. Experimental rules have experimental in their name, e.g. //:experimental-logging. As previously stated, experimental rules are subject to change or removal without notice.

CMake targets and packages

Only CMake packages starting with the google_cloud_cpp_ prefix are intended for customer use. Only targets starting with google-cloud-cpp::, are intended for customer use. Experimental targets have experimental in their name (e.g. google-cloud-cpp::experimental-logging). As previously stated, experimental targets are subject to change or removal without notice.

pkg-config modules

Only modules starting with google_cloud_cpp_ are intended for customer use.

Unsupported use cases

We try to provide stable names for the previously described mechanisms:

  • Bazel rules,
  • CMake targets loaded via find_package(),
  • pkg-config modules

It is certainly possible to use the library using other approaches. While these may work, we may accidentally break these from time to time. Examples of such, and the recommended alternatives, include:

  • CMake's FetchContent and/or git submodules: in these approaches the google-cloud-cpp library becomes a subdirectory of a larger CMake build We do not test google-cloud-cpp in these configurations, and we find them brittle as all CMake targets become visible to the larger project. This is both prone to conflicts, and makes it impossible to enforce that some targets are only for testing or are implementation details. Applications may want to consider source package managers, such as vcpkg, or CMake super builds via ExternalProject_Add() as alternatives.

  • Using library names directly: applications should not use the library names, e.g., by using -lgoogle_cloud_cpp_bigtable in build scripts. We may need to split or merge libraries over time, making such names unstable. Applications should use CMake targets, e.g., google-cloud-cpp::bigtable, or pkg-config modules, e.g., $(pkg-config google_cloud_cpp_bigtable --libs) instead.

Documentation and Comments

The documentation (and its links) is intended for human consumption and not third party websites, or automation (such as scripts scrapping the contents). The contents and links of our documentation may change without notice.

Other Interface Points

We think this covers all interface points, if we missed something please file a [GitHub issue][github-issue].

Contact us

Contributing changes

See CONTRIBUTING.md for details on how to contribute to this project, including how to build and test your changes as well as how to properly format your code.

Licensing

Apache 2.0; see LICENSE for details.