# Compiler Interface

This document describes the command-line interface to the FIDL compiler.

Information on the internals of that tool lives
[alongside the source of the tool](/zircon/system/host/fidl/README.md).

See [Overview](../intro/README.md) for more information about FIDL's overall
purpose, goals, and requirements, as well as links to related documents.

## Overview

The FIDL compiler is split into a frontend and a number of backends. The
compiler processes one library at a time. The frontend consumes the FIDL
declarations for the library (as well as for all transitive dependencies),
performs semantic analysis, and outputs an intermediate representation of the
library. The backends consume the intermediate representation and generate
language-specific bindings for the library.

## Frontend

The frontend is a command-line program named `fidlc`. The `fidlc` compiler takes
a number of arguments:

 * `--c-header HEADER_PATH`. If present, this flag instructs `fidlc` to output
   a C header at the given path. In principle, the C header generation could
   have been implemented as a C backend, but for some practical reasons, we
   integrated the C header generation directly into the frontend.

 * `--tables TABLES_PATH`. If present, this flag instructs `fidlc` to output
   coding tables at the given path. The coding tables are required to encode and
   decode messages from the C and C++ bindings.

 * `--json JSON_PATH`. If present, this flag instructs `fidlc` to output the
   library's intermediate representation at the given path. The intermediate
   representation is JSON that conforms to [a particular schema](/zircon/system/host/fidl/schema.json).
   The intermediate representation is used as input to the various backends.

 * `--name LIBRARY_NAME`. If present, this flag instructs `fidlc` to validate
   that the library being compiled has the given name. This flag is useful to
   cross-check between the library's declaration in a build system and the
   actual contents of the library.

 * `--files [FIDL_FILE...]...`. Each `--file [FIDL_FILE...]` chunk of arguments
   describes a library, all of which must share the same top-level library name
   declaration. Libraries must be presented in dependency order, with later
   libraries able to use declarations from preceding libraries but not vice versa.
   Output is only generated for the final library, not for each of its dependencies.

All of the arguments can also be provided via a response file, denoted as
`@responsefile`. The contents of the file at `responsefile` will be interpreted
as a whitespace-delimited list of arguments. Response files cannot be nested,
and must be the only argument.

## Backend

The backend is a command-line program named `fidlgen`. The `fidlgen` compiler
takes a number of arguments:

 * `--json` (required). The path to the intermediate representation of the
   library. The intermediate representation is JSON that conforms to
   [a particular schema](/zircon/system/host/fidl/schema.json).

 * `--generators` (required). A comma-separated list of generators to run on the
   given library. The following generators are currently supported: `cpp`, `go`,
   `dart`, and `rust`.

 * `--output-base` (required). The base file name for files generated by this
   generator. The generator will create files by adding extensions to this file
   name. For example, the `cpp` backend generates two files, one with the `.h`
   extension and another with the `.cc` extension.

 * `--include-base` (required). The base directory relative to which C and C++
   `#include` directives should be computed. For example, when the `cpp` backend
   generates an `#include` directive to reference the `.h` file from the `.cc`
   file, the backend will create the `#include` path relative to this directory.

## Limitations

For the `cpp` backend, the generated `.h` file must be includeable as
`#include <fuchsia/cpp/$LIBRARY_NAME.h>`, where `$LIBRARY_NAME` is the name of
the corresponding FIDL library. Typically, that means that the `--output-base`
flag will have the value `$INCLUDE_BASE/fuchsia/cpp/$LIBRARY_NAME`, where
`$INCLUDE_BASE` is the value of the `--include-base` flag.
