# Fuchsia Integrator Development Kit (IDK) This archive contains the Fuchsia Integrator Development Kit (IDK), which is a small set of Fuchsia-specific libraries and tools required to start building and running programs for Fuchsia. The Fuchsia IDK is not suitable for immediate consumption. It does not contain any reference to toolchains or build systems, and in fact does not require any specific instance of these. While this might be viewed as a drawback, this is actually a feature, an integral part of a layered approach to building a fully-functional SDK. Even though it is not tied to a particular build system, the IDK contains metadata that may be used to produce support for a large variety of build systems, thereby producing various SDK distributions. Having the IDK cleanly separated from these various distributions allows for very flexible release schemes and iteration cycles. Most developers who wish to build something for Fuchsia should not need to deal directly with the IDK. They will instead consume a transformed version of it, for instance within the development environment and ecosystem supporting a given language runtime. Maintainers of development environments who wish to add support for Fuchsia are the main audience for the IDK. See [the section below](#ingestion) for a description of how to process this SDK. As such, the Fuchsia IDK is the representation of the Fuchsia platform developers' contract with other developers who work with Fuchsia. While that contract is absolutely necessary, as this IDK contains the very bits that are unique to Fuchsia, it is not sufficient and will be complemented by other "contracts". The Fuchsia IDK is mirroring the Fuchsia platform in that respect: highly composable and extensible, with a clear separation of concerns. ## Structure From this point on, the root of the IDK archive will be referred to as `//`. ### Metadata Metadata is present throughout this IDK in the form of JSON files. Every element in this IDK has its own metadata file: for example, a FIDL library `//fidl/fuchsia.foobar` has its metadata encoded in `//fidl/fuchsia.foobar/meta.json`. Every metadata file follows a JSON schema available under `//meta/schemas`: for example, a FIDL library's metadata file conforms to `//meta/schemas/fidl_library.json`. Schemas act as the documentation for the metadata and may be used to facilitate the IDK ingestion process. ### Documentation General documentation is available under [`//docs`](docs/README.md). Some individual IDK elements will also provide documentation directly under the path where they are hosted in the SDK. ### Target prebuilts Target prebuilts are hosted under `//arch/`. This includes a full-fledged sysroot for each available architecture. ### Source libraries The IDK contains sources for a large number of FIDL libraries (under `//fidl`) as well as a few C/C++ libraries (under `//pkg`). ### Host tools Multiple host-side tools can be found under `//tools`. This includes tools for building programs, deploying to a device, debugging, etc... Some information about how to use these tools can be found under `//docs`. ### Images `//device` contains metadata describing device configurations matching a given version of the IDK. This metadata contains pointers to images that can be flashed onto said devices. ## Ingestion This section describes the process of consuming the IDK and turning it into a SDK that is specific to a development environment so it can be used directly by developers. The main entry point for the ingestion process is a file at `//meta/manifest.json`. As with every metadata file in the SDK, the manifest follows a JSON schema which is included under `//meta/schemas/manifest.json`. This file contains a list of all the elements included in this IDK, represented by the path to their respective metadata file. Each element file is guaranteed to contain a top-level `type` attribute, which may be used to apply different treatments to different element types, e.g. generating a build file for a FIDL library vs. just moving a host tool to a convenient location in the final development environment. The existence of the various metadata files as well as the exhaustiveness of their contents should make it so that the ingestion process may be fully automated. JSON schemas may even be used to generate code representing the metadata containers and let the ingestion program handle idiomatic data structures instead of raw JSON representations. The metadata schemas will evolve over time. In order to allow consumers of that metadata to adjust to schema changes, the main metadata file contains a property named `schema_version` which is an opaque version identifier for these schemas. This version identifier will be modified every time the metadata schemas evolve in a way that requires the attention of a developer. IDK consumers may record the version identifier of the metadata they used to last ingest an IDK and compare that version identifier to next SDK's version identifier in order to detect when developer action may be required.