blob: 323f4aadcca8a9bf146ca9497405b93e6d11d955 [file] [log] [blame] [view]
# Creating a FIDL library
## Prerequisites
This tutorial expects that you have completed the [getting
started][getting-started] guide and are able to build and run Fuchsia. You
should be familiar with running components on Fuchsia, which is covered in [run
an example component][run-examples].
## Overview
In this tutorial, you will define and build the FIDL library
`examples.keyvaluestore.baseline`. After you're done, you'll know how to author
a FIDL file, set up necessary GN rules, and build FIDL bindings.
The full source for this tutorial can be found at
[//examples/fidl/new/key_value_store/baseline/fidl/][baseline]
Note: This library will be used later in the [key-value store example series].
## Define the FIDL library
First, create a directory for this tutorial by running the following command
from your fuchsia checkout:
```
mkdir -p vendor/fidl-tutorials/building-fidl
```
Create a new file, `key_value_store.test.fidl`:
```
touch vendor/fidl-tutorials/building-fidl/key_value_store.test.fidl
```
FIDL file names use the `.fidl` extension. Similar to C header files, FIDL files
define data types and declare functional interfaces. These declarations are used in
conjunction with FIDL-specific data types to communicate between FIDL endpoints.
Add the following FIDL code to `key_value_store.test.fidl`:
```fidl
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/new/key_value_store/baseline/fidl/key_value_store.test.fidl" %}
```
This FIDL defines an `Item` type to represent items in the store, a `WriteError`
enum to list known errors for writes, and a `Store` protocol with one method:
`WriteItem`. As defined, this library can only write values into a store, but in
the [key-value store example series], you'll augment this library to support
nested stores, reading values, and other features.
Note: The `test.fidl` extension is used instead of `.fidl` to avoid linting and
API review requirements. Use `.fidl` for production code.
## Create a GN target for the FIDL library
Now that you've defined your FIDL, you need to create a `gn` target that other
code can depend on.
Create a new file, `BUILD.gn`:
```
touch vendor/fidl-tutorials/building-fidl/BUILD.gn
```
and add the following build rules:
```gn
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/new/key_value_store/baseline/fidl/BUILD.gn" %}
```
The `gn` template [`fidl("examples.keyvaluestore.baseline")`][fidl-template]
creates the necessary targets to use this library from other code.
## Compile the FIDL library
To build your new FIDL library, run the following `fx set` command:
```
fx set core.x64\
--with //vendor/fidl-tutorials/building-fidl:examples.keyvaluestore.baseline_rust\
--with //vendor/fidl-tutorials/building-fidl:examples.keyvaluestore.baseline_cpp
```
This command configures `fx build` to generate the rust and cpp bindings.
Next, build the code:
```
fx build
```
## Explore the generated bindings
Now that the code is built, you can explore the generated code for your
bindings. To see the generated code, browse the following directories:
| binding type | directory |
|--------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| rust | //out/default/fidling/gen/vendor/fidl-tutorials/building-fidl/examples.keyvaluestore.baseline/rust/ |
| new c++ | //out/default/fidling/gen/vendor/fidl-tutorials/building-fidl/examples.keyvaluestore.baseline/cpp/fidl/examples.keyvaluestore.baseline/cpp/ |
See [generated code] for more details.
## Next steps
Now that you've finished this tutorial, you're ready to explore the full
[key-value store example series].
<!-- xrefs -->
[fidl-template]: /build/fidl/fidl.gni
[getting-started]: /docs/get-started/README.md
[run-examples]: /docs/development/run/run-examples.md
[example series]: /docs/development/languages/fidl/examples.md
[key-value store example series]: /docs/development/languages/fidl/examples/key_value_store/README.md
[baseline]: https://cs.opensource.google/fuchsia/fuchsia/+/main:examples/fidl/new/key_value_store/baseline/fidl/
[generated code]: /docs/development/languages/fidl/guides/generated-code.md