# Integrator Development Kit (IDK) layout

The Integrator Development Kit (IDK) archive contains the
Fuchsia-specific libraries, FIDL interfaces, and tools required to start building and running
programs for Fuchsia.

This IDK is the public definition of the Fuchsia platform. It is intentionally
independent from specific build environment and targets integration and engprod teams
integrating Fuchsia into specific developer environments.
For example, it does not contain any build system, favor any
toolchain, or provide standard non-Fuchsia libraries such as for crypto or
graphics.
Instead, it provides metadata accurately describing its various
parts, so that the IDK is processed and augmented with specific tooling
and support libraries to create the end-to-end development experience.

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 [Integrating the Core SDK](integrating.md) for a description of how to process this
IDK.

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. See [understanding metadata](understanding_metadata.md).

### Documentation

General documentation is available under `//docs` in the IDK distribution, or
 online at [fuchsia.dev/fuchsia-src/docs/development/idk](/docs/development/idk).
Some individual IDK elements will also provide documentation directly under the
path where they are hosted in the IDK.

### Target prebuilts

Target prebuilts are hosted under `//arch/<architecture>`.
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`). See [compiling C/C++](documentation/compilation.md)
for details.

### 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`.
Specifically:

* [zxdb](documentation/debugger.md)
* [ssh](documentation/ssh.md)
* [logging and symbolizer](documentation/logging.md)
* [package manager](documentation/packages.md)

### Images

`//device` contains metadata describing device configurations matching a given
version of the IDK.
This metadata contains pointers to images that can be paved onto said devices.
See [working with devices](documentation/devices.md) for how to interact with a device
running Fuchsia.
