Summary
The same FastLED source builds a 54 KB larger ESP32-S3 Blink with fbuild than it did with the PlatformIO backend FastLED used before switching to fbuild-only builds. FastLED's bloat gate had to be re-baselined for it (FastLED/FastLED#4418).
| Backend |
Blink total flash, esp32s3 |
CI runs |
| PlatformIO (before FastLED/FastLED#4412) |
336,465 B |
every run through 2026-09-13 09:58Z |
| fbuild 2.5.23 |
390,453 B |
4 of 4 runs since, identical each time |
| Difference |
+53,988 B (+16%) |
|
The number is deterministic on CI, so this is a real difference between the two builds, not noise.
How it is measured
FastLED's tests/test_esp32s3_bloat_regression.py runs bash bloat esp32s3 --build, which compiles examples/Blink for the esp32s3 board and then runs fbuild symbols on the resulting ELF. total_flash comes from that report.
Before FastLED/FastLED#4412, bash bloat --build forced the PlatformIO backend. After it, the same command builds with fbuild. Nothing else changed in the measurement.
fbuild build details from the CI log:
- fbuild 2.5.23
- xtensa-esp-elf-gcc 14.2.0
- framework-arduinoespressif32 3.3.11
- Board: Espressif ESP32-S3-DevKitC-1-N8,
-Os
The PlatformIO toolchain and framework versions for the older runs are not in the logs I read, so a version difference on that side is not ruled out.
Where to look
Largest flash symbols in the fbuild build, from the failing gate's output:
| Bytes |
Archive |
Symbol |
| 11,222 |
libc.a |
_svfprintf_r |
| 4,032 |
libFastLED.a |
fl::Channel::showPixels(...) |
| 3,223 |
libc.a |
_dtoa_r |
| 2,031 |
libesp_driver_rmt.a |
rmt_new_tx_channel |
| 1,872 |
(none) |
uartSetPins |
| 1,745 |
libesp_hw_support.a |
rtc_init |
| 1,619 |
libespcoredump.a |
esp_core_dump_do_write_elf_pass |
| 1,596 |
libespressif__esp_diag |
diag_log_add |
Candidates worth comparing against the PlatformIO build of the same sketch, none verified:
- libc printf. Full
_svfprintf_r and _dtoa_r suggest the non-nano newlib printf with float support is linked.
- Core dump and diagnostics.
esp_core_dump_* and esp_diag are present, which may be SDK-config differences between the frameworks.
- Link flags and garbage collection. LTO state,
--gc-sections coverage, and which precompiled SDK archives are pulled in.
- Framework version. arduino-esp32 3.3.11 versus whatever the PlatformIO platform pinned.
A symbol-level diff of the two ELFs would settle it quickly. The PlatformIO build is no longer reproducible from current FastLED master, so it would need a checkout from before FastLED/FastLED#4412.
Evidence
A local build on the same fbuild version measured 394,561 B, 4 KB more than CI. That gap is probably leftover state in the local build directory and is not verified.
🤖 Generated with Claude Code
https://claude.ai/code/session_01M9rUkvoW2gVKYurtQJpi4i
Summary
The same FastLED source builds a 54 KB larger ESP32-S3 Blink with fbuild than it did with the PlatformIO backend FastLED used before switching to fbuild-only builds. FastLED's bloat gate had to be re-baselined for it (FastLED/FastLED#4418).
The number is deterministic on CI, so this is a real difference between the two builds, not noise.
How it is measured
FastLED's
tests/test_esp32s3_bloat_regression.pyrunsbash bloat esp32s3 --build, which compilesexamples/Blinkfor theesp32s3board and then runsfbuild symbolson the resulting ELF.total_flashcomes from that report.Before FastLED/FastLED#4412,
bash bloat --buildforced the PlatformIO backend. After it, the same command builds with fbuild. Nothing else changed in the measurement.fbuild build details from the CI log:
-OsThe PlatformIO toolchain and framework versions for the older runs are not in the logs I read, so a version difference on that side is not ruled out.
Where to look
Largest flash symbols in the fbuild build, from the failing gate's output:
_svfprintf_rfl::Channel::showPixels(...)_dtoa_rrmt_new_tx_channeluartSetPinsrtc_initesp_core_dump_do_write_elf_passdiag_log_addCandidates worth comparing against the PlatformIO build of the same sketch, none verified:
_svfprintf_rand_dtoa_rsuggest the non-nano newlib printf with float support is linked.esp_core_dump_*andesp_diagare present, which may be SDK-config differences between the frameworks.--gc-sectionscoverage, and which precompiled SDK archives are pulled in.A symbol-level diff of the two ELFs would settle it quickly. The PlatformIO build is no longer reproducible from current FastLED master, so it would need a checkout from before FastLED/FastLED#4412.
Evidence
A local build on the same fbuild version measured 394,561 B, 4 KB more than CI. That gap is probably leftover state in the local build directory and is not verified.
🤖 Generated with Claude Code
https://claude.ai/code/session_01M9rUkvoW2gVKYurtQJpi4i