Abseil provides a file (
options.h) for static configuration of
certain implementation details. Such static configurations are not often
necessary but may be useful for providers of binaries/libraries which wish to
ensure that their built-upon copies of Abseil are exactly the same.
Abseil promises no ABI stability, even from one day to the next. Two different source revisions of Abseil cannot be safely used in the same program. If two libraries in your program depend on Abseil, they must be built against the exact same version of Abseil, or things will break through violation of the One Definition Rule: loudly if you’re lucky, or subtly if not. This “diamond dependency problem” is a common problem with all library code, and is why we recommend building all code in your project from source.
However, while we discourage relying on compiled representations of libraries, we recognize this isn’t always possible for providers of binaries or compiled libraries (such as package managers). This options mechanism is provided to allow those providers to ensure that copies of Abseil use the same implementation.
Two copies of Abseil configured with different options are incompatible, in exactly the same way that two different source snapshots of Abseil are incompatible. Abseil options must be set consistently across an entire program. They cannot be changed on a per-library basis.
These options are dangerous if used incorrectly, and can only be safely used in some contexts.
We have placed Abseil options in a common file,
absl/base/options.h. The options file documents and enforces
the feature selections used to build the Abseil library. Setting these flags on
the command like (via a
-D compiler flag, for instance) won’t work: you must
options.h file directly, and distribute the patched
so that users are forced to compile their program with the same set of options
that were used to build the pre-compiled library.
A good rule of thumb is that it is safe to edit the options file only if you maintain the source of truth of Abseil for your build. Some examples of this:
patches=feature of the
http_archive()rule to override the options consistently. (See the Bazel docs for more information.)
Because of the increased testing burden this imposes, we plan to keep the set of options we support small. If you change any options, we recommend that you run the Abseil unit tests, to ensure your settings work with your toolchain. The default options we ship with reflect how we use Abseil internally. This is the configuration that is “battle tested” in Google’s C++ codebase.