pw_assert_basic: Fix build and minor bugfix

This commit fixes the bazel build files. This fix also addresses a bug
where an interaction between @io_bazel//src/main/tools:process-wrapper
and pw_assert_basic caused the output from `bazel test
//some_test_target` to be completely empty on assertion. This occured
because pw_assert_basic was 'aborting' causing the core to dump without
calling the destructors. Under normal circumstances this is fine as
stdout is synchronised. However as bazel's process wrapper binds
stdout, it results in stdout buffering, meaning that when
pw_assert_basic 'aborts' the buffered stdout is lost. The replacement
of 'abort' to 'exit' allows destructors for the stdout handles to be
called thus flushing the buffer out to bazels process-wrapper.
This is not a critical bug and is more of a nuisance as the message that
prints the line number that caused the assertion is lost when the
program aborts.

Change-Id: Ia1599db78c5caa878f3d7496e2b3009e3c44dcea
Reviewed-by: Keir Mierle <>
Reviewed-by: Wyatt Hepler <>
Commit-Queue: Keir Mierle <>
2 files changed
tree: fbbfd94fb6af5c9e722f3889bf94d3b8984ebb9b
  1. build_overrides/
  2. docker/
  3. docs/
  4. pw_allocator/
  5. pw_arduino_build/
  6. pw_assert/
  7. pw_assert_basic/
  8. pw_assert_log/
  9. pw_base64/
  10. pw_bloat/
  11. pw_blob_store/
  12. pw_boot_armv7m/
  13. pw_build/
  14. pw_bytes/
  15. pw_checksum/
  16. pw_chrono/
  17. pw_chrono_freertos/
  18. pw_chrono_stl/
  19. pw_chrono_threadx/
  20. pw_cli/
  21. pw_containers/
  22. pw_cpu_exception/
  23. pw_cpu_exception_cortex_m/
  24. pw_docgen/
  25. pw_doctor/
  26. pw_env_setup/
  27. pw_fuzzer/
  28. pw_hdlc/
  29. pw_hex_dump/
  30. pw_i2c/
  31. pw_interrupt/
  32. pw_interrupt_cortex_m/
  33. pw_kvs/
  34. pw_log/
  35. pw_log_basic/
  36. pw_log_multisink/
  37. pw_log_null/
  38. pw_log_rpc/
  39. pw_log_sink/
  40. pw_log_tokenized/
  41. pw_malloc/
  42. pw_malloc_freelist/
  43. pw_metric/
  44. pw_minimal_cpp_stdlib/
  45. pw_module/
  46. pw_package/
  47. pw_polyfill/
  48. pw_preprocessor/
  49. pw_presubmit/
  50. pw_protobuf/
  51. pw_protobuf_compiler/
  52. pw_random/
  53. pw_result/
  54. pw_ring_buffer/
  55. pw_router/
  56. pw_rpc/
  57. pw_span/
  58. pw_status/
  59. pw_stream/
  60. pw_string/
  61. pw_sync/
  62. pw_sync_baremetal/
  63. pw_sync_freertos/
  64. pw_sync_stl/
  65. pw_sync_threadx/
  66. pw_sys_io/
  67. pw_sys_io_arduino/
  68. pw_sys_io_baremetal_lm3s6965evb/
  69. pw_sys_io_baremetal_stm32f429/
  70. pw_sys_io_stdio/
  71. pw_target_runner/
  72. pw_thread/
  73. pw_thread_freertos/
  74. pw_thread_stl/
  75. pw_thread_threadx/
  76. pw_tokenizer/
  77. pw_toolchain/
  78. pw_trace/
  79. pw_trace_tokenized/
  80. pw_unit_test/
  81. pw_varint/
  82. pw_watch/
  83. pw_web_ui/
  84. targets/
  85. third_party/
  86. .bazelignore
  87. .bazelrc
  88. .clang-format
  89. .eslintrc.json
  90. .gitattributes
  91. .gitignore
  92. .gn
  93. .prettierrc.js
  94. .pylintrc
  95. activate.bat
  97. bootstrap.bat
  99. BUILD
  102. CMakeLists.txt
  105. LICENSE
  106. modules.gni
  107. OWNERS
  108. package.json
  111. tsconfig.json
  113. yarn.lock


Pigweed is an open source collection of embedded-targeted libraries--or as we like to call them, modules. These modules are building blocks and infrastructure that enable faster and more reliable development on small-footprint MMU-less 32-bit microcontrollers like the STMicroelectronics STM32L452 or the Nordic nRF52832.

Pigweed is in the early stages of development, and should be considered experimental. We’re continuing to evolve the platform and add new modules. We value developer feedback along the way.

Quick links

Get the code: git clone

Getting Started

If you'd like to get set up with Pigweed, please visit the getting started guide.

What does Pigweed offer?

There are many modules in Pigweed, and this section only showcases a small selection that happen to produce visual output. For more information about the different Pigweed module offerings, refer to “Module Guides” section in the full documentation.

pw_watch - Build, flash, run, & test on save

In the web development space, file system watchers are prevalent. These watchers trigger a web server reload on source change, making development much faster. In the embedded space, file system watchers are less prevalent; however, they are no less useful! The Pigweed watcher module makes it easy to instantly compile, flash, and run tests upon save. Combined with the GN-based build which expresses the full dependency tree, only the exact tests affected by a file change are run on saves.

The demo below shows pw_watch building for a STMicroelectronics STM32F429I-DISC1 development board, flashing the board with the affected test, and verifying the test runs as expected. Once this is set up, you can attach multiple devices to run tests in a distributed manner to reduce the time it takes to run tests.

pw watch running on-device tests

pw_presubmit - Vacuum code lint on every commit

Presubmit checks are essential tools, but they take work to set up, and projects don’t always get around to it. The pw_presubmit module provides tools for setting up high quality presubmit checks for any project. We use this framework to run Pigweed’s presubmit on our workstations and in our automated building tools.

The pw_presubmit module includes pw format command, a tool that provides a unified interface for automatically formatting code in a variety of languages. With pw format, you can format C, C++, Python, GN, and Go code according to configurations defined by your project. pw format leverages existing tools like clang-format, and it’s simple to add support for new languages.

pw presubmit demo

pw_env_setup - Cross platform embedded compiler setup

A classic problem in the embedded space is reducing the time from git clone to having a binary executing on a device. The issue is that an entire suite of tools is needed for non-trivial production embedded projects. For example:

  • A C++ compiler for your target device, and also for your host
  • A build system or three; for example, GN, Ninja, CMake, Bazel
  • A code formatting program like clang-format
  • A debugger like OpenOCD to flash and debug your embedded device
  • A known Python version with known modules installed for scripting
  • A Go compiler for the Go-based command line tools
  • ... and so on

In the server space, container solutions like Docker or Podman solve this; however, in our experience container solutions are a mixed bag for embedded systems development where one frequently needs access to native system resources like USB devices, or must operate on Windows.

pw_env_setup is our compromise solution for this problem that works on Mac, Windows, and Linux. It leverages the Chrome packaging system CIPD to bootstrap a Python installation, which in turn inflates a virtual environment. The tooling is installed into your workspace, and makes no changes to your system. This tooling is designed to be reused by any project.