pw_rust#

Rust support in pigweed is highly experimental. Currently functionality is split between Bazel and GN support.

Bazel#

Bazel support is based on rules_rust and supports a rich set of targets for both host and target builds.

Building and Running the Embedded Examples#

The examples can be built for both the lm3s6965evb and microbit QEMU machines. The examples can be built and run using the following commands where PLATFORM is one of lm3s6965evb or microbit.

embedded_hello#

$ bazel build //pw_rust/examples/embedded_hello:hello \
  --platforms //pw_build/platforms:${PLATFORM}

$ qemu-system-arm \
  -machine ${PLATFORM} \
  -nographic \
  -semihosting-config enable=on,target=native \
  -kernel ./bazel-bin/pw_rust/examples/embedded_hello/hello
Hello, Pigweed!

tokenized_logging#

$ bazel build //pw_rust/examples/tokenized_logging:tokenized_logging \
  --//pw_log/rust:pw_log_backend=//pw_rust/examples/tokenized_logging:pw_log_backend\
  --platforms //pw_build/platforms:${PLATFORM}

$ qemu-system-arm \
  -machine ${PLATFORM} \
  -nographic \
  -semihosting-config enable=on,target=native \
  -kernel ./bazel-bin/pw_rust/examples/tokenized_logging/tokenized_logging \
  | python -m pw_tokenizer.detokenize \
  base64 \
  ./bazel-bin/pw_rust/examples/tokenized_logging/tokenized_logging

GN#

In GN, currently only building a single host binary using the standard libraries is supported. Windows builds are currently unsupported.

Building#

To build the sample rust targets, you need to enable pw_rust_ENABLE_EXPERIMENTAL_BUILD:

$ gn gen out --args="pw_rust_ENABLE_EXPERIMENTAL_BUILD=true"

Once that is set, you can build and run the hello example:

$ ninja -C out host_clang_debug/obj/pw_rust/examples/basic_executable/bin/hello
$ ./out/host_clang_debug/obj/pw_rust/examples/basic_executable/bin/hello
Hello, Pigweed!

no_std#

Set pw_rust_USE_STD = false in the toolchain configuration, if the target toolchain does not support std.

no_std toolchain builds target //pw_rust/examples/basic_executable/bin/hello_pw_log. It also prints “Hello, Pigweed!”, but links and uses pw_log C++ backend.

Third Party Crates#

Thrid party crates are vendored in the third_party/rust_crates respository. Currently referencing these is only supported through the bazel build.