blob: 3b50116f5a3db556c84a5abe2d6f8b347fac4b5e [file] [log] [blame] [view]
# Compiling FIDL
## Prerequisites
This tutorial builds on the [Compiling FIDL][fidl-intro] tutorial.
For more information on other FIDL tutorials, see the [Overview][overview].
## Overview
This tutorial details how to include the HLCPP FIDL bindings into
your code by creating a unit test that you can use as a "playground" for
exploring the HLCPP bindings.
This document covers how to complete the following tasks:
* [Write a C++ host test](#write-a-cpp-test).
* [Add the HLCPP bindings of a FIDL library as a build
dependency](#add-dependency).
* [Include the HLCPP bindings into your C++ code](#include-hlcpp-bindings).
* [Inspect and use the generated bindings
code](#inspect-user-generated-bindings).
The example code is located in your Fuchsia checkout in
`//examples/fidl/hlcpp/unittests/`. If you want to write all the code
as you follow this tutorial, you can remove the example code:
```
rm -r examples/fidl/hlcpp/unittests/*
```
## Write a C++ host test {#write-a-cpp-test}
1. Add a gtest stub to `examples/fidl/hlcpp/unittests/main.cc`:
```c++
#include <gtest/gtest.h>
namespace {
} // namespace
```
1. Define a `test` and then create a dependency on the test through the `$host_toolchain`.
To do this, add the following to `examples/fidl/hlcpp/unittests/BUILD.gn`:
```gn
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/BUILD.gn" region_tag="first" %}
test("example-cpp-host-test") {
sources = [ "main.cc" ]
deps = [ "//src/lib/fxl/test:gtest_main" ]
}
```
1. Add the test suite to your configuration:
<pre class="prettyprint">
<code class="devsite-terminal">fx set <var>product</var>.<var>board</var> --with //examples/fidl/hlcpp/unittests</code>
</pre>
1. Run the empty test suite:
```posix-terminal
fx test -vo example-cpp-host-test
```
You should see test output indicating that zero tests have run,
since no tests have been added yet.
## Add the HLCPP FIDL bindings as a dependency {#add-dependency}
Add a dependency on the HLCPP bindings by referencing the FIDL target
directly. The new `test` target should look like:
```gn
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/BUILD.gn" region_tag="test" %}
```
(Optional) To view the newly generated bindings:
1. Rebuild using `fx build`.
2. Change to the generated files directory:
`out/default/fidling/gen/examples/fidl/fuchsia.examples/fuchsia/examples`, where
the generated files are located.
You may need to change `out/default` if you have set a different build output
directory. You can check your build output directory with `fx get-build-dir`.
For more information on how to find generated bindings code, see
[Viewing generated bindings code][generated-code].
## Include the HLCPP bindings in your C++ code {#include-hlcpp-bindings}
To include the bindings, add the following include statement to the top of
`examples/fidl/hlcpp/unittests/main.cc`
```cpp
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/main.cc" region_tag="include" %}
```
## Inspect and use the generated bindings code {#inspect-user-generated-bindings}
You can now write some tests by referring to the generated code. For more
information on the bindings, see [HLCPP Bindings Reference][bindings-ref].
To get started, you can also use some example code. You can add this inside the
anonymous namespace in `main.cc`:
```cpp
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/main.cc" region_tag="bits" %}
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/main.cc" region_tag="enums" %}
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/main.cc" region_tag="structs" %}
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/main.cc" region_tag="unions" %}
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/unittests/main.cc" region_tag="tables" %}
```
To rebuild and rerun the tests, run:
```posix-terminal
fx test -vo example-cpp-host-test
```
<!-- xrefs -->
[generated-code]: /docs/development/languages/fidl/guides/generated-code.md#c-family
[bindings-ref]: /docs/reference/fidl/bindings/hlcpp-bindings.md
[fidl-intro]: /docs/development/languages/fidl/tutorials/fidl.md
[overview]: /docs/development/languages/fidl/tutorials/overview.md