blob: f97a78814ea3ac8b73fc1b338ec372187b12d2a8 [file] [log] [blame] [view]
# Starboard ABI
The Starboard ABI was introduced to provide a single, consistent method for
specifying the Starboard API version and the ABI. This specification ensures
that any two binaries, built with the same Starboard ABI and with arbitrary
toolchains, are compatible.
## Background
The Starboard ABI is the set of features, such as the Starboard API version or
the sizes of data types, that collectively describes the relationship between
the Starboard API and ABI of a binary. In the past, each of these features were
inconsistently and ambiguously defined in a variety of files. This led to
confusion, and made it difficult to track down the feature values for a
platform. To simplify how Starboard is configured for a target platform, all of
these features, and their concrete values, are now listed for each distinct
target architecture in Starboard ABI files. These files provide a consistent,
consolidated view of the values for each of these features, decoupling
platform-specific details from architecture.
## Goals
The overall goal of the Starboard ABI is to provide a way to implement and
verify binary compatibility on a target platform, and this goal can be broken
down into the following more concise motivations:
* Separate platform and architecture into distinct concepts.
* Establish a consistent set of values for the various features of each target
architecture.
* Consolidate this set of features and their values in a consistent,
predictable location.
* Provide the ability to validate the values of each feature in produced
binaries.
## Using Starboard ABI Files
With the Starboard ABI being the source of truth for all things architecture
related, each platform must now include a Starboard ABI file in its build (see
[//starboard/sabi](https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/starboard/sabi)
for examples). Starboard ABI files are JSON, and should all contain identical
keys with the values being appropriate for the architecture. Each platform must
override the new
[GetPathToSabiJsonFile](https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/starboard/build/platform_configuration.py##339)
method in its platform configuration to return the path to the desired Starboard
ABI file (e.g.
[//starboard/linux/shared/gyp\_configuration.py](https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/starboard/linux/shared/gyp_configuration.py)).
By default, an empty and invalid Starboard ABI file is provided.
Additionally, all platforms must include the
[sabi.gypi](https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/starboard/sabi/sabi.gypi)
in their build configuration. This file will consume the specified Starboard ABI
file, resulting in the creation of a set of GYP variables and preprocessor
macros. The preprocessor macros are passed directly to the compiler and replace
the macros you might be familiar with, such as `SB_HAS_32_BIT_LONG`.
The newly defined GYP variables need to be transformed into toolchain specific
flags; these flags are what actually makes the build result in a binary for the
desired architecture. These flags will, in most cases, be identical to the flags
already being used for building.
The process outlined above is shown in the diagram below.
![Starboard ABI Overview](resources/starboard_abi_overview.png)
### Post-Starboard ABI File Cleanup
A number of GYP variables and preprocessor macros should no longer be defined
directly, and instead the Starboard ABI file will be used to define them. These
definitions need to be removed.
From `configuration_public.h`:
* `SB_IS_ARCH_*`
* `SB_IS_BIG_ENDIAN`
* `SB_IS_32_BIT`
* `SB_IS_64_BIT`
* `SB_HAS_32_BIT_LONG`
* `SB_HAS_64_BIT_LONG`
* `SB_HAS_32_BIT_POINTERS`
* `SB_HAS_64_BIT_POINTERS`
From `gyp_configuration.gypi`:
* `target_arch`
## FAQ
### What Starboard ABI files are provided?
The Cobalt team provides, and maintains, Starboard ABI files for the following
architectures:
* x86\_32
* x86\_64
* ARM v7 (32-bit)
* ARM v8 (64-bit)
If you find that no valid Starboard ABI file exists for your architecture, or
that you need to change any values of a provided Starboard ABI file, please
reach out to the Cobalt team to advise.
### How can I verify that my build is configured correctly?
Similar to the process prior to Starboard ABI files, there are multiple levels
of verification that occur:
1. When configuring your build, the Starboard ABI file that was specified will
have its values sanity checked against a provided
[schema](https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/starboard/sabi/sabi.schema.json).
1. When building, a number of static assertions will assert correctness of a
number of features generated from the Starboard ABI file against the
features of the binary.
1. The NPLB test suite has been expanded to include [additional
tests](https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/starboard/nplb/sabi/)
capable of verifying the remaining features of the binary.
Finally, binaries produced by the Cobalt team for your architecture, including
NPLB, will be made available to ensure end-to-end correctness of the produced
binaries.