# FIDL Compiler and Tools

## Compiler Interface {#compiler-interface}

### 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 has these flags:

* `--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][schema]. 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 flags can also be provided through 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 has these flags:

* `--json`. Required. The path to the intermediate representation of the library. The
  intermediate representation is JSON that conforms to [a particular
  schema][schema].

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

* `--output-base`. Required. The base file name for files generated by this generator. The
  generator creates 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 creates the `#include`
  path relative to this directory.

### Limitations

For the `cpp` backend, the generated `.h` file must be includable 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.

## Linter

The FIDL linter is a command line program that processes one or more FIDL
files, and prints warnings about content that compiles (technically valid FIDL),
but appears to violate rules from the [FIDL Style Rubric][fidl-style].
Readability is important, and style is a component of that, but the FIDL Rubric
also defines rules that help ensure the FIDL API does not include things that are
known to hamper cross-language portability.

### Use `fx lint`

Fuchsia includes the `fx lint` command that automatically selects and runs the
appropriate code linter for each of a set of specified files. `fx lint` bundles
the files with a `.fidl` extension, and passes all of them, together, to the FIDL
linter command `fidl-lint`.

`fx lint` is the recommended way to invoke the FIDL linter, and ideally should be
run before uploading new FIDL libraries or changes to existing FIDL. Without any
arguments, `fx lint` will run all available linters on all files in your most
recent `git commit`.

```sh
fx lint
```

To review other available options, run:

```sh
fx lint --help
```

## Formatter

The FIDL formatter is a command line program that will format .fidl files. It is
automatically built in to the `fx format-code` command, which will format any
modified FIDL files:

```sh
fx format-code
```

<!-- xrefs -->
[fidl-style]: /docs/development/languages/fidl/guides/style.md
[schema]: /tools/fidl/fidlc/schema.json
