blob: 749d90ad575bf450bf314dbf11cf051f4c65d382 [file] [log] [blame] [view]
Integrator Development Kit (IDK) Standards
=============
This document describes the standards for how we develop the Fuchsia IDK within
the Platform Source Tree. Some of the information in this document might be of
interest to clients of the Fuchsia SDK, but the primary focus of the document is
how the Fuchsia project develops the SDK.
## Governance
The contents of the Fuchsia IDK are governed by the [Fuchsia API Council]. The
IDK does not contain elements (libraries, tools, images, etc) developed outside
the Fuchsia project because those libraries are not subject to the governance
of the Fuchsia API Council.
Client libraries in the IDK do not depend on libraries outside the IDK unless
the external library has been approved by the Fuchsia API Council. Typically,
the council will not approve a dependency unless the dependency has strict
evolution criteria (e.g., the standard libraries for the various supported
languages).
### Example: Google Test
The Fuchsia IDK does not include the _Google Test_ library because the
governance for the _Google Test_ library is provided by Google, not by the
Fuchsia API Council.
The Fuchsia IDK does not depend on the _Google Test_ library because the
[promises made by the governing body](https://abseil.io/about/philosophy#upgrade-support)
for the _Google Test_ library are not compatible with the model used by the
Fuchsia IDK.
## Fuchsia System Interface
The Fuchsia System Interface is defined in [Fuchsia System
Interface](/docs/concepts/packages/system.md). Generally speaking, the binary interface to the system
is only the FIDL wireformat used by programs to communicate with the system and the syscalls exposed
in `libzircon`.
## FIDL Protocol Definitions
### Binary stability
FIDL protocols are defined in `.fidl` files, which are contained in the SDK.
All the FIDL definitions that have been published in an IDK should be considered
public ABI for the system. The system might also contain additional FIDL
definitions that have not been published in an IDK. Those definitions are
subject to change without notice and programs that rely upon their ABI might not
work properly in future versions of the system.
### Source stability
FIDL definitions in the IDK might evolve in source-incompatible ways. For
example, we might rename a method in a protocol while maintaining its ordinal
and semantics (the ordinal can be maintained by adding a `Selector` attribute
that is set to the original name). Such a change preserves the ABI but breaks
source-compatibility.
We do not currently have any standards about when we should break source
compatibility.
### Naming
Public FIDL definitions are located in the source tree under
`//sdk/fidl/$LIBRARY_NAME`.
The target name should be the name of the library.
### Style
FIDL definitions in the IDK should follow the [FIDL API style rubric].
## Client Libraries
The Fuchsia IDK contains a number of "client libraries" (libraries that clients of an SDK integrating
the IDK can link into their programs). All of these client libraries are optional
and provided for the convenience ofclients, not for the convenience of the system.
The system must not rely upon programs using any specific client libraries.
Note that `libc` is a client library (not a system library).
### Stability and Packaging
Only the [Fuchsia System Interface](#fuchsia_system_interface) is ABI stable. Client libraries are
neither API nor ABI stable. Binaries and libraries must be built against the same IDK version as the
client libraries they are linked with.
All libraries a program links beyond the [Fuchsia System Interface](#fuchsia_system_interface),
including client libraries, must be included inside the program's package. Dynamic libraries should
be placed in the `lib` directory of the program's package.
Packages are the unit of software mobility, delivery, and linkage. Different packages can contain
different versions of the same library. When running a program, the system provides that program
the libraries from its own package, preventing the different libraries used by different packages
from conflicting in the same program.
### Precompiled libraries
The Fuchsia IDK does not require clients to use a specific toolchain. For this reason, precompiled
client libraries must have C linkage. For example, a precompiled client library cannot export C++
symbols because C++ does not have a standard ABI across toolchains (or even toolchain versions).
### Dependencies
A client that takes a dependency on a client library must also take a dependency
on all the dependencies of that library. For this reason, client libraries
should have minimal dependencies. For example, client libraries should avoid
dependencies on FBL, FXL, FSL, or other "base" libraries that are not in
the SDK.
Client libraries that need to perform asynchronous operations should depend on
`libasync.a` and `libasync-default.so`. However, these libraries should not
assume the client is using any specific implementation of `async_dispatcher_t*`.
For example, these libraries should not assume the `async_dispatcher_t*` is
actually implemented by `libasync-loop.a`. Libraries that require
`async_get_default_dispatcher` to be populated should state this requirement in
their documentation.
Precompiled libraries can have more extensive dependencies if those dependencies
are hidden from their client. For example, a precompiled shared library should
not export symbols from these dependencies and should not have headers that
transitively include headers from these dependencies.
### Naming
Client libraries should be named according to the language they expect their
clients to use.
For example, the C++ variant of the `$NAME` library should be located in the
source tree under `//sdk/lib/$NAME/cpp`.
The C variant should simply be under `//sdk/lib/$NAME`.
### Style
Client libraries should follow the Fuchsia style guide for the language in which
they are written.
### Logging
Client libraries should avoid logging messages. Instead, client libraries should
return errors to their clients, who can decide whether to log the error.
### Assertions
C and C++ client libraries should use `ZX_DEBUG_ASSERT` and `ZX_ASSERT`, defined
in `<zircon/assert.h>`, to assert invariants. Client libraries may also use the
`_MSG` variants to provide a message when the assertion fails.
## Recommendations for client code
### C
The Fuchsia System Interface uses symbols with the `zx_` and `fuchsia_` prefixes and
preprocessor macros with the `ZX_` and `FUCHSIA_` prefixes. To avoid collisions, these
prefixes are reserved for use by the Fuchsia IDK. Clients of the Fuchsia IDK should not
declare symbols or preprocessor macros with these prefixes.
### C++
The FIDL protocols included in the Fuchsia System Interface resides in the top-level
`fuchsia` namespace. To avoid collisions, this namespace is reserved for use by the
Fuchsia IDK. Clients of the Fuchsia IDK should not declare names in the top-level
`fuchsia` namespace.
[Fuchsia API Council]: /docs/contribute/governance/api_council.md
[FIDL API style rubric]: /docs/development/languages/fidl/guides/style.md