This guide provides step-by-step instructions that walk you through the basic workflows of building, running, debugging, and updating drivers in a Fuchsia system using the Fuchsia SDK.
Important: This guide is the driver equivalent of the Get started with the Fuchsia SDK guide. If you haven‘t already, it’s strongly recommended that you first complete the Get started with the Fuchsia SDK guide to become familiar with the comprehensive set of Fuchsia SDK-based workflows.
Complete the following sections:
Found an issue? Please let us know{:.external}.
Before you begin, complete the prerequisite steps below:
This guide requires that your host machine meets the following criteria:
git
and bazel
need to be installed on the host machine. You need Bazel 5.1 or higher.
Note: You only need to complete these steps once on your host machine.
Do the following:
Install Git{:.external}.
Install Bazel{:.external} – the easiest install option is to download the Bazelisk binary{:.external} and rename it to bazel
in a convenient place on your path.
The ffx
tool requires that Fuchsia-specific SSH keys are stored on the host machine for connecting to Fuchsia devices (including the Fuchsia emulator).
To check if your host machine already has Fuchsia SSH keys, do the following:
Scan the $HOME/.ssh
directory for Fuchsia SSH keys:
ls $HOME/.ssh | grep fuchsia
Verify that the following fuchsia_*
files are present:
$ ls $HOME/.ssh | grep fuchsia fuchsia_authorized_keys fuchsia_ed25519 fuchsia_ed25519.pub
If you don’t see these files, you need to generate Fuchsia SSH keys on the host machine:
Generate a new private and public SSH key pair:
Note: These Fuchsia SSH keys are only used for connecting to Fuchsia devices during development. Generating these SSH keys won't alter your current SSH settings.
[[ -f "${HOME}/.ssh/fuchsia_ed25519" ]] || ssh-keygen -P "" -t ed25519 -f "${HOME}/.ssh/fuchsia_ed25519" -C "${USER}@$(hostname -f) Shared SSH Key for Fuchsia"
Generate a fuchsia_authorized_keys
file:
[[ -f "${HOME}/.ssh/fuchsia_authorized_keys" ]] || ssh-keygen -y -f "${HOME}/.ssh/fuchsia_ed25519" > "${HOME}/.ssh/fuchsia_authorized_keys"
Verify that Fuchsia SSH keys are generated:
ls $HOME/.ssh | grep fuchsia
This command prints output similar to the following:
$ ls $HOME/.ssh | grep fuchsia fuchsia_authorized_keys fuchsia_ed25519 fuchsia_ed25519.pub
Clone the SDK driver samples repository{:.external} on your host machine. This repository contains sample driver components and the Bazel-based Fuchsia SDK.
The tasks include:
ffx
commands.Do the following:
In a terminal, change to your home directory:
Note: This guide uses the home directory ($HOME
) as a base directory. This is where a new work directory (drivers
) will be created for this guide. You may also select a different base directory (for instance, cd $HOME/my-fuchsia-project
).
cd $HOME
Clone the SDK driver samples repository:
git clone https://fuchsia.googlesource.com/sdk-samples/drivers --recurse-submodules
This creates a new directory named drivers
, which clones the content of the SDK driver samples repository.
Go to the new directory:
cd drivers
To verify the Fuchsia SDK environment setup, build the sample drivers:
bazel build --config=fuchsia_x64 //src/qemu_edu
The first build may take a few minutes to download dependencies, such as Bazel build rules, Clang, and Fuchsia IDK (which includes the ffx
tool).
When finished successfully, it prints output similar to the following in the end:
$ bazel build --config=fuchsia_x64 //src/qemu_edu ... INFO: Elapsed time: 131.746s, Critical Path: 26.89s INFO: 722 processes: 454 internal, 268 linux-sandbox. INFO: Build completed successfully, 722 total actions
To verify that you can use the ffx
tool in your environment, run the following command:
tools/ffx version -v
This command prints output similar to the following:
$ tools/ffx version -v ffx: abi-revision: 0xA56735A6690E09D8 api-level: 8 build-version: 2022-06-09T20:02:48+00:00 integration-commit-hash: dfddeea2221689c800ca1db7a7c7d1f2cb0bd99f integration-commit-time: Thu, 09 Jun 2022 20:02:48 +0000 daemon: abi-revision: 0xA56735A6690E09D8 api-level: 8 build-version: 2022-06-09T20:02:48+00:00 integration-commit-hash: dfddeea2221689c800ca1db7a7c7d1f2cb0bd99f integration-commit-time: Thu, 09 Jun 2022 20:02:48 +0000
At this point, you only need to confirm that you can run this ffx
command without any errors.
Note: To ensure that you’re using the right version of ffx
(which needs to match the version of the SDK), consider updating your PATH
to include the SDK‘s tools
directory where ffx
is located (for instance, export PATH="$PATH:$HOME/drivers/tools"
). However, if you don’t wish to update your PATH
, ensure that you specify the relative path to this ffx
tool (tools/ffx
) whenever you run ffx
commands.
Start the Fuchsia emulator on the host machine while configuring the emulator instance to use Fuchsia’s new driver framework (DFv2).
The tasks include:
Do the following:
Download the latest Workstation image for the emulator:
tools/ffx product-bundle get workstation.qemu-x64
This command may take a few minutes to download the image and product metadata.
Once the download is finished, the ffx product-bundle get
command creates a local Fuchsia package repository named workstation.qemu-x64
on your host machine. This package repository hosts additional system packages for this Workstation prebuilt image. Later in Step 7 you’ll register this package repository to the emulator instance.
Stop all emulator instances:
tools/ffx emu stop --all
Start the Fuchsia emulator:
tools/ffx emu start workstation.qemu-x64 --headless --kernel-args "driver_manager.use_driver_framework_v2=true" --kernel-args "driver_manager.root-driver=fuchsia-boot:///#meta/platform-bus.cm" --kernel-args "devmgr.enable-ephemeral=true"
This command starts a headless emulator instance running the Workstation prebuilt image.
When the instance is up and running, the command prints output similar to the following:
$ tools/ffx emu start workstation.qemu-x64 --headless --kernel-args "driver_manager.use_driver_framework_v2=true" --kernel-args "driver_manager.root-driver=fuchsia-boot:///#meta/platform-bus.cm" -- kernel-args "devmgr.enable-ephemeral=true" Logging to "/home/alice/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log" Waiting for Fuchsia to start (up to 60 seconds). Emulator is ready.
Verify that the new emulator instance is running:
tools/ffx emu list
This command prints output similar to the following:
$ tools/ffx emu list [Active] fuchsia-emulator
Set the default target device:
tools/ffx target default set fuchsia-emulator
This command exits silently without output.
Start the Fuchsia package server:
tools/ffx repository server start
This command prints output similar to the following:
$ tools/ffx repository server start ffx repository server is listening on [::]:8083
Register the system package repository (workstation.qemu-x64
) to the target device:
tools/ffx target repository register -r workstation.qemu-x64 --alias fuchsia.com
This command exits silently without output.
The Fuchsia emulator (launched in the Start the emulator section above) is configured to create a virtual device named edu
, which is an educational device for writing drivers. In the previous section, when the emulator started, Fuchsia’s driver framework detected this edu
device in the system, but it wasn’t able to find a driver that could serve the edu
device. So the edu
device was left unmatched.
In this section, we build and publish the qemu_edu
sample driver (which is a Fuchsia component). Upon detecting a new driver, the driver framework will discover that this new qemu_edu
driver is a match for the edu
device. Once matched, the qemu_edu
driver starts providing the edu
device’s services (capabilities) to other components in the system – one of the services provided by the edu
device is that it computes a factorial given an integer.
The tasks include:
qemu_edu
driver component.qemu_edu
driver is loaded to the emulator instance.qemu_edu
component.Do the following:
View the list of the currently loaded drivers:
tools/ffx driver list --loaded
This command prints output similar to the following:
$ tools/ffx driver list --loaded fuchsia-boot:///#meta/block.core.cm fuchsia-boot:///#meta/bus-pci.cm fuchsia-boot:///#meta/fvm.cm fuchsia-boot:///#meta/hid-input-report.cm fuchsia-boot:///#meta/hid.cm fuchsia-boot:///#meta/intel-rtc.cm fuchsia-boot:///#meta/netdevice-migration.cm fuchsia-boot:///#meta/network-device.cm fuchsia-boot:///#meta/pc-ps2.cm fuchsia-boot:///#meta/platform-bus-x86.cm fuchsia-boot:///#meta/platform-bus.cm fuchsia-boot:///#meta/ramdisk.cm fuchsia-boot:///#meta/sysmem.cm fuchsia-boot:///#meta/virtio_block.cm fuchsia-boot:///#meta/virtio_ethernet.cm fuchsia-boot:///#meta/zxcrypt.cm fuchsia-pkg://fuchsia.com/virtual_audio#meta/virtual_audio_driver.cm
Build and publish the qemu_edu
driver component:
bazel run --config=fuchsia_x64 //src/qemu_edu:pkg.component
This command prints output similar to the following:
$ bazel run --config=fuchsia_x64 //src/qemu_edu:pkg.component INFO: Analyzed target //src/qemu_edu:pkg.component (6 packages loaded, 162 targets configured). INFO: Found 1 target... Target //src/qemu_edu:pkg.component up-to-date: bazel-bin/src/qemu_edu/pkg.component_run_component.sh INFO: Elapsed time: 1.660s, Critical Path: 0.49s INFO: 21 processes: 12 internal, 8 linux-sandbox, 1 local. INFO: Build completed successfully, 21 total actions INFO: Build completed successfully, 21 total actions added repository bazel.pkg.component Registering fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm Successfully bound: Node 'root.sys.platform.platform-passthrough.PCI0.bus.00_06_0_', Driver 'fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm'.
Verify that the qemu_edu
driver is now loaded to the Fuchsia emulator instance:
tools/ffx driver list --loaded
This command prints output similar to the following:
$ tools/ffx driver list --loaded fuchsia-boot:///#meta/block.core.cm fuchsia-boot:///#meta/bus-pci.cm fuchsia-boot:///#meta/fvm.cm fuchsia-boot:///#meta/hid-input-report.cm fuchsia-boot:///#meta/hid.cm fuchsia-boot:///#meta/intel-rtc.cm fuchsia-boot:///#meta/netdevice-migration.cm fuchsia-boot:///#meta/network-device.cm fuchsia-boot:///#meta/pc-ps2.cm fuchsia-boot:///#meta/platform-bus-x86.cm fuchsia-boot:///#meta/platform-bus.cm fuchsia-boot:///#meta/ramdisk.cm fuchsia-boot:///#meta/sysmem.cm fuchsia-boot:///#meta/virtio_block.cm fuchsia-boot:///#meta/virtio_ethernet.cm fuchsia-boot:///#meta/zxcrypt.cm fuchsia-pkg://fuchsia.com/virtual_audio#meta/virtual_audio_driver.cm {{ '<strong>' }}fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm{{ '</strong>' }}
Notice that the qemu_edu
driver is shown at the bottom of the loaded drivers list.
View the qemu_edu
component information:
tools/ffx component show qemu_edu.cm
This command prints output similar to the following:
$ tools/ffx component show qemu_edu.cm Moniker: /bootstrap/universe-pkg-drivers:root.sys.platform.platform-passthrough.PCI0.bus.00_06_0_ URL: fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm Type: CML dynamic component Component State: Resolved Incoming Capabilities: fuchsia.device.fs.Exporter fuchsia.driver.compat.Service fuchsia.logger.LogSink pkg Merkle root: a4832605ffe6bf6ddad3aad0d3d36c435ee2e66f79d43cd0b818d2aae20f7755 Execution State: Running Start reason: Instance is in a single_run collection Outgoing Capabilities: qemu-edu
View device logs:
tools/ffx log --filter qemu_edu
This command prints output similar to the following:
$ tools/ffx log --filter qemu_edu ... [176.540][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://bazel.pkg.component/qemu_edu to a4832605ffe6bf6ddad3aad0d3d36c435ee2e66f79d43cd0b818d2aae20f7755 with TUF [176.542][bootstrap/driver_index][driver_index,driver][I] Registered driver successfully: fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm. [176.571][core/pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://bazel.pkg.component/qemu_edu: [] [176.573][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://bazel.pkg.component/qemu_edu to a4832605ffe6bf6ddad3aad0d3d36c435ee2e66f79d43cd0b818d2aae20f7755 with TUF [176.577][bootstrap/driver_manager][driver_manager.cm][I]: [driver_runner.cc:858] Binding fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm to 00_06_0_ [176.908][bootstrap/driver-hosts:driver-host-3][driver_host2.cm][I]: [driver_host.cc:289] Started 'fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm'
Press CTRL+C
to exit.
The qemu_edu
driver sample has a “tools” component named eductl
, which can interact with the sample driver. Developers create these tools components for testing and debugging drivers during development.
In this case, the eductl
component contacts the qemu_edu
driver and passes an integer as input. The driver (using the resource of the edu
virtual device) computes the integer's factorial and returns the result to the eductl
component. The component then prints the result in the log.
The tasks include:
eductl
component.qemu_edu
driver.Do the following:
Build and run the eductl
component:
bazel run --config=fuchsia_x64 //src/qemu_edu:eductl_pkg.eductl_component
This command prints output similar to the following:
$ bazel run --config=fuchsia_x64 //src/qemu_edu:eductl_pkg.eductl_component INFO: Analyzed target //src/qemu_edu:eductl_pkg.eductl_component (0 packages loaded, 14 targets configured). INFO: Found 1 target... Target //src/qemu_edu:eductl_pkg.eductl_component up-to-date: bazel-bin/src/qemu_edu/eductl_pkg.eductl_component_run_component.sh INFO: Elapsed time: 1.667s, Critical Path: 1.22s INFO: 23 processes: 7 internal, 15 linux-sandbox, 1 local. INFO: Build completed successfully, 23 total actions INFO: Build completed successfully, 23 total actions added repository bazel.eductl.pkg.eductl.component URL: fuchsia-pkg://bazel.eductl.pkg.eductl.component/eductl#meta/eductl.cm Moniker: /core/ffx-laboratory:eductl Creating component instance... Starting component instance... Success! The component instance has been started.
View the device logs of the eductl
component:
tools/ffx log --filter eductl dump
This command prints output similar to the following:
$ tools/ffx log --filter eductl dump ... [367.076][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://bazel.eductl.pkg.eductl.component/eductl to 4fe2e38ed56693bf720565c3ee5e6f8314a64c601cae67288db5e8d30f1a9265 with TUF [367.080][core/pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://bazel.eductl.pkg.eductl.component/eductl: [] [367.081][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://bazel.eductl.pkg.eductl.component/eductl to 4fe2e38ed56693bf720565c3ee5e6f8314a64c601cae67288db5e8d30f1a9265 with TUF {{ '<strong>' }}[367.166][core/ffx-laboratory:eductl][][I] Factorial(12) = 479001600{{ '</strong>' }} [367.173][core/pkg-resolver][pkg-resolver][I] removing repository fuchsia-pkg://bazel.eductl.pkg.eductl.component [367.173][core/pkg-resolver][pkg-resolver][I] closing fuchsia-pkg://bazel.eductl.pkg.eductl.component [367.176][core/pkg-resolver][pkg-resolver][I] AutoClient for "http://10.0.2.2:8083/bazel.eductl.pkg.eductl.component/auto" stopping
The output Factorial(12) = 479001600
shows that the eductl
component passed 12 as input to the driver and received the result from the driver. (For the default input, see this eductl.cml
file.)
Use the Fuchsia debugger (zxdb
) to step through the sample driver’s code as the driver is running on the emulator instance.
The tasks include:
qemu_edu
driver.Do the following:
View the list of the running driver hosts:
tools/ffx driver list-hosts
This command prints output similar to the following:
$ tools/ffx driver list-hosts Driver Host: 4690 fuchsia-boot:///#meta/block.core.cm fuchsia-boot:///#meta/bus-pci.cm fuchsia-boot:///#meta/fvm.cm fuchsia-boot:///#meta/hid.cm fuchsia-boot:///#meta/netdevice-migration.cm fuchsia-boot:///#meta/network-device.cm fuchsia-boot:///#meta/platform-bus-x86.cm fuchsia-boot:///#meta/platform-bus.cm fuchsia-boot:///#meta/ramdisk.cm fuchsia-boot:///#meta/sysmem.cm fuchsia-boot:///#meta/virtio_block.cm fuchsia-boot:///#meta/virtio_ethernet.cm fuchsia-boot:///#meta/zxcrypt.cm fuchsia-pkg://fuchsia.com/virtual_audio#meta/virtual_audio_driver.cm Driver Host: 7820 fuchsia-boot:///#meta/intel-rtc.cm Driver Host: 7903 fuchsia-boot:///#meta/pc-ps2.cm Driver Host: 50125 fuchsia-pkg://bazel.pkg.component/qemu_edu#meta/qemu_edu.cm
Make a note of the PID of the qemu_edu
driver host (50125
in the example above).
Start the Fuchsia debugger:
tools/ffx debug connect
This command prints output similar to the following:
$ tools/ffx debug connect Connecting (use "disconnect" to cancel)... Connected successfully. 👉 To get started, try "status" or "help". [zxdb]
Attach the debugger to the qemu_edu
driver host:
Replace PID
with the PID of the qemu_edu
driver host identified in Step 1, for example:
[zxdb] attach 50125
This command prints output similar to the following:
[zxdb] attach 50125 Attached Process 1 state=Running koid=50125 name=driver_host2.cm Downloading symbols... Symbol downloading complete. 7 succeeded, 0 failed. [zxdb]
Set a breakpoint at the driver’s ComputeFactorial
function:
This command prints output similar to the following:
[zxdb] break QemuEduDriver::ComputeFactorial Created Breakpoint 1 @ QemuEduDriver::ComputeFactorial 177 void QemuEduDriver::ComputeFactorial(ComputeFactorialRequestView request, ◉ 178 ComputeFactorialCompleter::Sync& completer) { 179 // Write a value into the factorial register. [zxdb]
In different terminal, run the tools component:
Note: In this new terminal, make sure that you change to the same work directory (for instance, cd $HOME/drivers
).
bazel run --config=fuchsia_x64 //src/qemu_edu:eductl_pkg.eductl_component
In the zxdb
terminal, verify that the debugger is stopped at the driver’s ComputeFactorial
function, for example:
🛑 thread 2 on bp 1 qemu_edu::QemuEduDriver::ComputeFactorial(qemu_edu::QemuEduDriver*, fidl::WireServer<fuchsia_hardware_qemuedu::Device>::ComputeFactorialRequestView, fidl::Completer<fidl::internal::WireCompleterBase<fuchsia_hardware_qemuedu::Device::ComputeFactorial> >::Sync&) • qemu_edu.cc:178 176 177 void QemuEduDriver::ComputeFactorial(ComputeFactorialRequestView request, ▶ 178 ComputeFactorialCompleter::Sync& completer) { 179 // Write a value into the factorial register. 180 uint32_t input = request->input; [zxdb]
In the zxdb
terminal, view the source code around the current breakpoint:
This command prints output similar to the following:
[zxdb] list 173 }); 174 return outgoing_.Serve(std::move(outgoing_dir)); 175 } 176 177 void QemuEduDriver::ComputeFactorial(ComputeFactorialRequestView request, ▶ 178 ComputeFactorialCompleter::Sync& completer) { 179 // Write a value into the factorial register. 180 uint32_t input = request->input; 181 182 mmio_->Write32(input, regs::kFactorialCompoutationOffset); 183 184 // Busy wait on the factorial status bit. 185 while (true) { 186 const auto status = regs::Status::Get().ReadFrom(&*mmio_); 187 if (!status.busy()) 188 break; [zxdb]
In the zxdb
terminal, step through the code using the next
command until the value of factorial
is read from the device (that is, until the line 194 is reached):
The last next
command prints output similar to the following:
... [zxdb] next 🛑 thread 2 qemu_edu::QemuEduDriver::ComputeFactorial(qemu_edu::QemuEduDriver*, fidl::WireServer<fuchsia_hardware_qemuedu::Device>::ComputeFactorialRequestView, fidl::Completer<fidl::internal::WireCompleterBase<fuchsia_hardware_qemuedu::Device::ComputeFactorial> >::Sync&) • qemu_edu.cc:194 192 uint32_t factorial = mmio_->Read32(regs::kFactorialCompoutationOffset); 193 ▶ 194 FDF_SLOG(INFO, "Replying with", KV("factorial", factorial)); 195 completer.Reply(factorial); 196 } [zxdb]
Print the factorial
variable:
This command prints output similar to the following:
[zxdb] print factorial 479001600 [zxdb]
To exit the zxdb
terminal, type exit
or press Ctrl-D
.
Note: For more information on usages and best practices on zxdb
, see the zxdb user guide.
Update the source code of the sample driver and reload it to the emulator instance.
The tasks include:
qemu_edu
driver.qemu_edu
driver.Do the following:
Stop the emulator instance:
tools/ffx emu stop
This command stops the currently running emulator instance.
Start a new instance of the Fuchsia emulator:
tools/ffx emu start workstation.qemu-x64 --headless --kernel-args "driver_manager.use_driver_framework_v2=true" --kernel-args "driver_manager.root-driver=fuchsia-boot:///#meta/platform-bus.cm" --kernel-args "devmgr.enable-ephemeral=true"
This command starts a headless emulator instance running the Workstation prebuilt image.
Use a text editor to open the source code of the sample driver, for example:
nano src/qemu_edu/qemu_edu.cc
In the QemuEduDriver::ComputeFactorial
function, between the line uint32_t factorial = mmio_->Read32(regs::kFactorialCompoutationOffset);
(Line 192) and the FDF_SLOG()
call (Line 194), add the following line:
factorial=12345;
The function should look like below:
void QemuEduDriver::ComputeFactorial(ComputeFactorialRequestView request, ComputeFactorialCompleter::Sync& completer) { // Write a value into the factorial register. uint32_t input = request->input; mmio_->Write32(input, regs::kFactorialCompoutationOffset); // Busy wait on the factorial status bit. while (true) { const auto status = regs::Status::Get().ReadFrom(&*mmio_); if (!status.busy()) break; } // Return the result. uint32_t factorial = mmio_->Read32(regs::kFactorialCompoutationOffset); {{ '<strong>' }}factorial = 12345;{{ '</strong>' }} FDF_SLOG(INFO, "Replying with", KV("factorial", factorial)); completer.Reply(factorial); }
The function is now updated to return the value of 12345
only.
Save the file and close the text editor.
Rebuild and run the modified sample driver:
bazel run --config=fuchsia_x64 //src/qemu_edu:pkg.component
Run the tools component:
bazel run --config=fuchsia_x64 //src/qemu_edu:eductl_pkg.eductl_component
To verify that change, view the device logs of the tools component:
tools/ffx log --filter eductl dump
This command prints output similar to the following:
$ tools/ffx log --filter eductl dump ... [43.349][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://bazel.eductl.pkg.eductl.component/eductl to 4fe2e38ed56693bf720565c3ee5e6f8314a64c601cae67288db5e8d30f1a9265 with TUF [43.354][core/pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://bazel.eductl.pkg.eductl.component/eductl: [] [43.355][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://bazel.eductl.pkg.eductl.component/eductl to 4fe2e38ed56693bf720565c3ee5e6f8314a64c601cae67288db5e8d30f1a9265 with TUF {{ '<strong>' }}[43.439][core/ffx-laboratory:eductl][][I] Factorial(12) = 12345{{ '</strong>' }} [43.448][core/pkg-resolver][pkg-resolver][I] removing repository fuchsia-pkg://bazel.eductl.pkg.eductl.component [43.449][core/pkg-resolver][pkg-resolver][I] closing fuchsia-pkg://bazel.eductl.pkg.eductl.component [43.452][core/pkg-resolver][pkg-resolver][I] AutoClient for "http://10.0.2.2:8083/bazel.eductl.pkg.eductl.component/auto" stopping.
The line in the logs shows that the qemu_edu
driver returned the hardcoded value of 12345
as the factorial of 12 to the tools component.
Congratulations! You’re now all set with the Fuchsia driver development!
Learn more about how the qemu_edu
driver works in the Driver sample walkthrough: qemu_edu guide.
If you run into a problem while following this guide and decide to start over from the beginning, consider running the commands below to clean up your development environment (that is, to clean up directories, build artifacts, downloaded files, symlinks, configuration settings, and more).
Remove the package repositories created in this guide:
tools/ffx repository remove workstation.qemu-x64
tools/ffx repository server stop
rm -rf $HOME/.package_repos/sdk-samples
Remove all existing configurations and data of ffx
:
tools/ffx daemon stop
rm -rf $HOME/.local/share/Fuchsia/ffx
Remove the drivers
directory and its artifacts:
Caution: If the SDK samples repository is cloned to a different location than $HOME/drivers
, adjust the directory path in the command below. Be extremely careful with the directory path when you run the `rm -rf
rm -rf $HOME/drivers
When Bazel fails to build, try the commands below:
Caution: Running bazel clean
or deleting the $HOME/.cache/bazel
directory deletes all the artifacts downloaded by Bazel, which can be around 4 GB. This means Bazel will need to download those dependencies again the next time you run bazel build
.
bazel clean --expunge
bazel shutdown && rm -rf $HOME/.cache/bazel
Other clean up commands:
killall ffx
killall pm