FIDL-based bind libraries tutorial for Bazel

This tutorial is for driver authors using the SDK who want to use FIDL-based auto-generated bind libraries. The tutorial assumes familiarity with the following:

What is the same and what is different?

Most of the concepts and samples laid out in the linked tutorials above will apply to users of the SDK as well.

The only differences are:

  • The Bazel target for the FIDL-based bind library fuchsia_fidl_bind_library needs to be manually added if the FIDL library is not from the SDK.
  • The Bazel target for the bind library code generation target fuchsia_bind_cc_library needs to be manually added if the FIDL library is not from the SDK.

An example

The example in this section shows a manually-defined FIDL library and how to use the generated bind library and its associated generated code to create bind rules for a child driver and access constants for these bind library values from the parent driver.

BUILD.bazel

The FIDL library

# This is a FIDL library that we manually define.
fuchsia_fidl_library(
    name = "examples.gizmo",
    srcs = [
        "testfidl.fidl",
    ],
    library = "examples.gizmo",
)

# The C++ bindings for the FIDL library.
fuchsia_fidl_llcpp_library(
    name = "examples.gizmo_cc",
    library = ":examples.gizmo",
    visibility = ["//visibility:public"],
    deps = [
        "@fuchsia_sdk//pkg/fidl_cpp_v2",
        "@fuchsia_sdk//pkg/fidl_cpp_wire",
    ],
)

# We have to manually create the bind library from it.
fuchsia_fidl_bind_library(
    name = "examples.gizmo_bindlib",
    library = ":examples.gizmo",
    visibility = ["//visibility:public"],
)

# We have to manually create the C++ lib for the FIDL based bind library we created.
fuchsia_bind_cc_library(
    name = "examples.gizmo_bindlib_cc",
    library = ":examples.gizmo_bindlib",
    visibility = ["//visibility:public"],
)

The parent driver

fuchsia_cc_driver(
    name = "parent_driver",
    srcs = [
        "gizmo_server.h",
        "parent-driver.cc",
        "parent-driver.h",
    ],
    deps = [
        # This is a C++ lib from our manually created bind library.
        "//src/bind_library/lib:examples.gizmo.bind_cc",
        # This is a C++ lib from our manually created FIDL based bind library.
        "//src/bind_library/lib:examples.gizmo_bindlib_cc",
        "//src/bind_library/lib:examples.gizmo_cc",
        # This is a C++ lib from an SDK FIDL based bind library.
        "@fuchsia_sdk//fidl/fuchsia.device.fs:fuchsia.device.fs_bindlib_cc",
        "@fuchsia_sdk//pkg/driver_component_cpp",
    ],
)

The child bind rules

fuchsia_driver_bind_bytecode(
    name = "bind_bytecode",
    output = "child-driver.bindbc",
    rules = "child-driver.bind",
    deps = [
        # This bind library is one we created manually.
        "//src/bind_library/lib:examples.gizmo.bind",
        # This bind library is from a FIDL library that we created manually.
        "//src/bind_library/lib:examples.gizmo_bindlib",
        # This bind library is from an SDK FIDL library.
        "@fuchsia_sdk//fidl/fuchsia.device.fs:fuchsia.device.fs_bindlib",
    ],
)

parent-driver.cc

#include <bind/examples/gizmo/bind/cpp/bind.h>
#include <bind/examples/gizmo/cpp/bind.h>
#include <bind/fuchsia/device/fs/cpp/bind.h>

...

properties[4] = fdf::MakeProperty(arena, bind_fuchsia_device_fs::EXPORTER,
                                  bind_fuchsia_device_fs::EXPORTER_ZIRCONTRANSPORT);
properties[5] = fdf::MakeProperty(arena, bind_examples_gizmo::TESTINGPROTOCOL,
                                  bind_examples_gizmo::TESTINGPROTOCOL_ZIRCONTRANSPORT);

child-driver.bind

using fuchsia.device.fs;
using examples.gizmo;

...

fuchsia.device.fs.Exporter == fuchsia.device.fs.Exporter.ZirconTransport;
examples.gizmo.TestingProtocol == examples.gizmo.TestingProtocol.ZirconTransport;