| 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 |