Files
firmware/variants/native/portduino/platformio.ini
Andrew YongandBen Meadors db84bdf3b4 Reduce ExternalNotificationModule flash usage (RTTTL + InputBroker) (#10989)
* Generalize RTTTL exclusion into MESHTASTIC_EXCLUDE_RTTTL

ExternalNotificationModule already stubbed out RTTTL playback for
STM32WL/portduino/ESP32C6 via a raw ARCH/CONFIG_IDF check, but the
ringtone config plumbing around it (protobuf message, encode/decode
tables, /prefs/ringtone.proto persistence, admin get/set-ringtone
handlers) still compiled in even though it can never do anything on
those platforms.

Introduce MESHTASTIC_EXCLUDE_RTTTL and gate the dead ringtone plumbing
behind it too. The flag is set in each architecture's *_base build_flags
(stm32_base, esp32c6_base, portduino_base) rather than in the module
itself - this matches how every other MESHTASTIC_EXCLUDE_* flag in the
tree is set (e.g. stm32_base already sets ten of them directly, and
esp32c6_base already excludes PAXCOUNTER for an analogous
platform-can't-support-this reason), rather than introducing a new
per-architecture C header pattern. Behavior is unchanged on all three
platforms; overridable via -D like every other MESHTASTIC_EXCLUDE_*
flag.

Also guard the two HAS_I2S ringtone-playback call sites with
!MESHTASTIC_EXCLUDE_RTTTL alongside HAS_I2S, since rtttlConfig itself
is now only declared when RTTTL is not excluded. No current platform
defines both HAS_I2S and MESHTASTIC_EXCLUDE_RTTTL simultaneously, so
this has no effect today, but prevents a future HAS_I2S platform that
also excludes RTTTL from failing to compile.

Saves 368 bytes flash / 236 bytes RAM on wio-e5 with no loss to the
GPIO on/off notification toggle itself, which does not depend on
RTTTL.

Signed-off-by: Andrew Yong <me@ndoo.sg>
Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>

* Skip unused InputBroker observer in ExternalNotificationModule

The inputObserver CallbackObserver member was declared unconditionally,
even though its only use site was already gated behind
MESHTASTIC_EXCLUDE_INPUTBROKER (set for all of stm32 in stm32.ini).
Because it's a non-trivial member, the compiler still generated its
constructor/destructor as part of ExternalNotificationModule's own
lifecycle even when InputBroker is compiled out entirely.

Gate the member and its only consumer, handleInputEvent(), behind the
same flag as their use site, and match the codebase's dominant
!MESHTASTIC_EXCLUDE_X style (used ~330 times) rather than
!defined(MESHTASTIC_EXCLUDE_X) (used ~20 times) while touching this
flag's other call site. Saves an additional 288 bytes flash on wio-e5,
no RAM change, no functional impact since InputBroker was already
unused on this platform.

Signed-off-by: Andrew Yong <me@ndoo.sg>
Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix(native-wasm): exclude RTTTL to unbreak build

The browser node builds its own build_flags from arduino_base rather
than inheriting portduino_base, so it did not pick up the
MESHTASTIC_EXCLUDE_RTTTL flag added to portduino_base. With the inline
ARCH_PORTDUINO stub in ExternalNotificationModule.h now replaced by that
flag, native-wasm tried to include the unavailable NonBlockingRtttl.h.

Set MESHTASTIC_EXCLUDE_RTTTL=1 directly in the native-wasm env
alongside its other exclusion flags.

Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>
Signed-off-by: Andrew Yong <me@ndoo.sg>

---------

Signed-off-by: Andrew Yong <me@ndoo.sg>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2026-08-28 19:58:23 +00:00

500 lines
23 KiB
INI

[native_base]
extends = portduino_base
build_flags = ${portduino_base.build_flags} -I variants/native/portduino
-I /usr/include
board = cross_platform
board_level = extra
lib_deps =
${portduino_base.lib_deps}
# renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028
melopero/Melopero RV3028@1.2.0
build_src_filter = ${portduino_base.build_src_filter}
[env:native]
extends = native_base
; The pkg-config commands below optionally add link flags.
; the || : is just a "or run the null command" to avoid returning an error code
build_flags = ${native_base.build_flags}
!pkg-config --libs libulfius --silence-errors || :
!pkg-config --libs openssl --silence-errors || :
!pkg-config --cflags --libs sdl2 --silence-errors || :
!pkg-config --cflags --libs libbsd-overlay --silence-errors || :
; Optional HUB75 RGB-matrix support on Raspberry Pi via hzeller/rpi-rgb-led-matrix.
; When the lib is installed (provides rgbmatrix.pc), these add its include/link flags and
; __has_include(<led-matrix.h>) enables HAS_HUB75_NATIVE (see configuration.h). Absent -> no-op.
!pkg-config --cflags rgbmatrix --silence-errors || :
!pkg-config --libs rgbmatrix --silence-errors || :
; Each test suite runs inside its own scratch $HOME. Every suite that constructs a NodeDB loads and
; saves ~/.portduino/default/prefs/, and nothing cleared it, so state leaked suite -> suite within a
; run and then run -> every later run: test_nodedb_blocked's deliberately saturated node database
; was still resident 22 suites later, where test_admin_radio inherited it and failed four unrelated
; assertions. Registered here rather than only in bin/run-tests.sh so a bare `pio test` and CI get
; the same boundary. See bin/pio-test-isolate.sh.
; https://docs.platformio.org/en/latest/projectconf/sections/env/options/test/test_testing_command.html
; -s matches [env:coverage]. The sandbox above only covers $HOME, but portduinoSetup() searches
; ./config.yaml and /etc/meshtasticd/config.yaml - absolute, so no $HOME sandbox can hide it. On a
; host running meshtasticd that config selects the real LoRa module and the run proceeds into GPIO
; and SPI setup, so a test run would drive the developer's own radio. -s short-circuits ahead of the
; config search and returns before hardware init. Suites asserting behaviour that simradio changes
; (PKC selection) clear the flag themselves in setUp, after the radio choice is already made.
test_testing_command =
${platformio.src_dir}/../bin/pio-test-isolate.sh
${platformio.build_dir}/${this.__env__}/meshtasticd
-s
[env:native-tft]
extends = native_base
build_type = release
lib_deps =
${native_base.lib_deps}
${device-ui_base.lib_deps}
build_flags = ${native_base.build_flags} -Os -lcurl -lX11 -linput -lxkbcommon -ffunction-sections -fdata-sections -Wl,--gc-sections
-D RAM_SIZE=16384
-D USE_X11=1
-D HAS_TFT=1
-D HAS_SCREEN=1
-D LV_CACHE_DEF_SIZE=6291456
-D LV_BUILD_TEST=0
-D LV_USE_LIBINPUT=1
-D LV_LVGL_H_INCLUDE_SIMPLE
-D LV_CONF_INCLUDE_SIMPLE
-D LV_COMP_CONF_INCLUDE_SIMPLE
-D USE_LOG_DEBUG
-D LOG_DEBUG_INC=\"DebugConfiguration.h\"
-D USE_PACKET_API
-D VIEW_320x240
!pkg-config --libs libulfius --silence-errors || :
!pkg-config --libs openssl --silence-errors || :
!pkg-config --cflags --libs sdl2 --silence-errors || :
!pkg-config --cflags --libs libbsd-overlay --silence-errors || :
build_src_filter =
${native_base.build_src_filter}
[env:native-fb]
extends = native_base
build_type = release
lib_deps =
${native_base.lib_deps}
${device-ui_base.lib_deps}
build_flags = ${native_base.build_flags} -Os -ffunction-sections -fdata-sections -lcurl -Wl,--gc-sections
-D RAM_SIZE=8192
-D USE_FRAMEBUFFER=1
-D LV_COLOR_DEPTH=32
-D HAS_TFT=1
-D HAS_SCREEN=1
-D LV_BUILD_TEST=0
-D LV_USE_LOG=0
-D LV_USE_EVDEV=1
-D LV_LVGL_H_INCLUDE_SIMPLE
-D LV_CONF_INCLUDE_SIMPLE
-D LV_COMP_CONF_INCLUDE_SIMPLE
-D USE_LOG_DEBUG
-D LOG_DEBUG_INC=\"DebugConfiguration.h\"
-D USE_PACKET_API
-D VIEW_320x240
-D MAP_FULL_REDRAW
!pkg-config --libs libulfius --silence-errors || :
!pkg-config --libs openssl --silence-errors || :
!pkg-config --cflags --libs sdl2 --silence-errors || :
!pkg-config --cflags --libs libbsd-overlay --silence-errors || :
build_src_filter =
${native_base.build_src_filter}
[env:native-tft-debug]
extends = native_base
build_type = debug
lib_deps =
${native_base.lib_deps}
${device-ui_base.lib_deps}
build_flags = ${native_base.build_flags} -g -O0 -fsanitize=address -lcurl -lX11 -linput -lxkbcommon
-D DEBUG_HEAP
-D RAM_SIZE=16384
-D USE_X11=1
-D HAS_TFT=1
-D HAS_SCREEN=1
-D LV_CACHE_DEF_SIZE=6291456
-D LV_BUILD_TEST=0
-D LV_USE_LOG=1
-D LV_USE_SYSMON=1
-D LV_USE_PERF_MONITOR=1
-D LV_USE_MEM_MONITOR=0
-D LV_USE_PROFILER=0
-D LV_USE_LIBINPUT=1
-D LV_LVGL_H_INCLUDE_SIMPLE
-D LV_CONF_INCLUDE_SIMPLE
-D LV_COMP_CONF_INCLUDE_SIMPLE
-D USE_LOG_DEBUG
-D LOG_DEBUG_INC=\"DebugConfiguration.h\"
-D USE_PACKET_API
-D VIEW_320x240
!pkg-config --libs libulfius --silence-errors || :
!pkg-config --libs openssl --silence-errors || :
!pkg-config --cflags --libs sdl2 --silence-errors || :
!pkg-config --cflags --libs libbsd-overlay --silence-errors || :
build_src_filter = ${env:native-tft.build_src_filter}
[env:coverage]
extends = env:native
build_flags = -lgcov --coverage -fprofile-abs-path -fsanitize=address ${env:native.build_flags}
; Same per-suite scratch $HOME as [env:native] - see the note there and bin/pio-test-isolate.sh.
; https://docs.platformio.org/en/latest/projectconf/sections/env/options/test/test_testing_command.html
test_testing_command =
${platformio.src_dir}/../bin/pio-test-isolate.sh
${platformio.build_dir}/${this.__env__}/meshtasticd
-s
; Channel-table userPrefs: initDefaults() must reach every index, not just 0-2. The fixture header
; stands in for what bin/platformio-custom.py emits for a vendor who configured five channels.
[env:coverage-channel-table]
extends = env:coverage
build_flags = ${env:coverage.build_flags}
-include test/test_userprefs_channels/userprefs_fixture.h
test_filter =
test_userprefs_channels
[env:coverage-event-policy]
extends = env:coverage
build_flags = ${env:coverage.build_flags}
-DUSERPREFS_BLOCK_POSITION_ON_EVENT_CHANNEL=1
-include test/support/userprefs_event_channel.h
test_filter =
test_position_precision
test_event_channel_router
test_nexthop_routing
test_event_channel_phone_api
test_mqtt
; ---------------------------------------------------------------------------
; Native build for macOS (Darwin / arm64 + x86_64). Headless meshtasticd that
; runs in SimRadio mode (`-s`) or against real LoRa hardware via a CH341
; USB-SPI bridge. No BlueZ, libgpiod, or Linux I2C - those require Linux.
;
; Prerequisites (Homebrew):
; brew install platformio yaml-cpp libuv openssl@3 libusb argp-standalone pkg-config jsoncpp
; # Optional: enable the HTTP API (PiWebServer) on macOS:
; brew install ulfius
;
; The macOS-side patches now live upstream:
; * meshtastic/platform-native - `String.h`-shadow shim, `-Wno-enum-constexpr-conversion`,
; empty-variant-dir guard. Pulled via `portduino_base.platform` zip pin.
; * meshtastic/framework-portduino - LinuxHardwareI2C macOS stubs, AsyncUDP
; SOCK_NONBLOCK fallback, Common.h __APPLE__ guard, WiFiServer.cpp extern-C
; fix, package.json URL refresh. Pulled by platform-native at its pinned commit.
; This env therefore only carries the firmware-side build flags and src filter.
;
; Real LoRa hardware on macOS:
; The same lib_dep `pine64/libch341-spi-userspace` used on Linux works on
; macOS as-is - its `libusb_detach_kernel_driver()` call is `__linux__`-
; guarded, but on macOS the kernel doesn't bind a driver to a CH341A SPI
; bridge (PID 0x5512; bDeviceClass=0xff vendor-specific) by default, so
; no detach is needed. Apple's bundled CH34x driver targets the CH340
; *UART* variant (PID 0x7523) - different product. libusb opens the device
; and claims interface 0 directly via IOUSBHostInterface.
;
; To use, point `meshtasticd` at any of the existing `bin/config.d/lora-*.yaml`
; files that specify `spidev: ch341` - they're platform-agnostic. Example:
; pio run -e native-macos
; mkdir -p ~/.meshtasticd && cp bin/config-dist.yaml ~/.meshtasticd/config.yaml
; # Edit ~/.meshtasticd/config.yaml: ConfigDirectory: ./config.d/
; mkdir ~/.meshtasticd/config.d && cp bin/config.d/lora-meshstick-1262.yaml ~/.meshtasticd/config.d/
; cd ~/.meshtasticd && /path/to/firmware/.pio/build/native-macos/meshtasticd
;
; The MAC address auto-derives from the CH341's USB serial + product string
; (PortduinoGlue.cpp ~497-518); on Linux a BlueZ HCI socket is the fallback
; when that path isn't taken, but BlueZ is `__linux__`-guarded so the
; serial-derivation path is mandatory on macOS. Override with
; `MACAddress: AA:BB:CC:DD:EE:FF` in config.yaml's `General:` section if
; the device's serial isn't 8 hex chars.
;
; Diagnosing CH341 issues on macOS:
; ioreg -p IOUSB -l -w 0 | grep -B2 -A30 0x5512
; Children should be `IOUSBHostInterface`. If a vendor driver class
; (e.g. `com.wch.CH34xVCPDriver` from a third-party WCH installer)
; claims interface 0, libusb will fail with LIBUSB_ERROR_BUSY.
; Workaround: `sudo kmutil unload -b <bundleID>`.
; LIBUSB_DEBUG=4 .pio/build/native-macos/meshtasticd
; Verbose libusb trace - useful when claim_interface fails.
; ---------------------------------------------------------------------------
[env:native-macos]
extends = native_base
; Apple's ld doesn't accept GNU ld's `-Wl,-Map,<file>` syntax (inherited from
; the top-level platformio.ini). Strip it; the linker map isn't useful for
; the macOS dev loop anyway, and Apple ld's equivalent (`-Wl,-map,<file>`)
; uses different argument shape.
build_unflags = -Wl,-Map,"${platformio.build_dir}"/output.map
; libi2c is Linux-only but build_flags_common carries -li2c (also duplicated in the Linux-only
; build_flags); macOS has no libi2c, so strip it here to let the link succeed.
-li2c
build_flags = ${portduino_base.build_flags_common}
-I variants/native/portduino
-I/opt/homebrew/include
-I/opt/homebrew/opt/argp-standalone/include
-I/opt/homebrew/opt/yaml-cpp/include
-L/opt/homebrew/lib
-L/opt/homebrew/opt/argp-standalone/lib
-L/opt/homebrew/opt/yaml-cpp/lib
-largp
-DPORTDUINO_DARWIN
; Headless build - variants/native/portduino/variant.h would otherwise
; default HAS_SCREEN to 1 and pull in screen-renderer source that uses
; VLA-with-initializer (a GNU/GCC extension Apple Clang rejects).
; MESHTASTIC_EXCLUDE_SCREEN gates the optional `screen->setHeading(...)`-
; style screen-driver hooks scattered through sensor sources.
-DHAS_SCREEN=0
-DMESHTASTIC_EXCLUDE_SCREEN=1
; openssl@3 is the keg-only Homebrew formula; --cflags is required so the
; compiler finds <openssl/*.h> in the Homebrew prefix (not just the linker).
!pkg-config --cflags --libs openssl --silence-errors || :
; PiWebServer (src/mesh/raspihttp/PiWebServer.cpp) auto-engages when ulfius
; headers are reachable via `#if __has_include(<ulfius.h>)`. The `|| :`
; tail keeps the build green when the user hasn't run `brew install ulfius`
; - they just don't get the HTTP API in that case.
!pkg-config --cflags --libs liborcania --silence-errors || :
!pkg-config --cflags --libs libyder --silence-errors || :
!pkg-config --cflags --libs libulfius --silence-errors || :
; src/input/Linux*.{cpp,h} drive evdev (`<linux/input.h>`) which doesn't exist
; on macOS. graphics/Panel_sdl.* and graphics/TFTDisplay.cpp pull LovyanGFX
; (which we lib_ignore on macOS for the <malloc.h> issue). Neither is needed
; for the headless build.
build_src_filter = ${native_base.build_src_filter}
-<input/LinuxInput.cpp>
-<input/LinuxInputImpl.cpp>
-<graphics/Panel_sdl.cpp>
-<graphics/TFTDisplay.cpp>
; LovyanGFX includes <malloc.h> (Linux-only) and is only needed by TFT
; variants - not relevant for the headless macOS build.
lib_ignore =
${portduino_base.lib_ignore}
LovyanGFX
; ---------------------------------------------------------------------------
; Same as [env:native-macos] but built with AddressSanitizer for catching
; use-after-free, leaks, and OOB access during local development. Headless
; (no SDL/X11/libinput) so it stays cheap to build. Mirrors the shape of
; [env:native-tft-debug] but without the TFT/X11 dependencies.
;
; pio run -e native-macos-debug
; .pio/build/native-macos-debug/meshtasticd -s
;
; ASan runtime tuning (set in the shell before launching):
; ASAN_OPTIONS=detect_leaks=1:halt_on_error=0:abort_on_error=1
; MallocStackLogging=1 # macOS: nicer stack traces in malloc reports
; ---------------------------------------------------------------------------
[env:native-macos-debug]
extends = native_base
build_type = debug
build_unflags = ${env:native-macos.build_unflags}
build_flags = ${env:native-macos.build_flags}
-O0
-g
-fsanitize=address
-fno-omit-frame-pointer
build_src_filter = ${env:native-macos.build_src_filter}
lib_ignore = ${env:native-macos.lib_ignore}
; ---------------------------------------------------------------------------
; Native build for Windows (x86_64) via the MSYS2 UCRT64 MinGW-w64 toolchain.
; Headless meshtasticd.exe running in SimRadio mode (`-s`). No BlueZ, libgpiod or
; Linux I2C, and no UDP multicast: the framework's AsyncUDP.cpp is BSD sockets,
; so HAS_UDP_MULTICAST stays unset here as it does on macOS.
;
; MSVC is not an option: platform-native's builder calls env.Tool("gcc") and the
; firmware builds as gnu17/gnu++17 with GNU extensions throughout.
;
; Prerequisites (MSYS2, https://www.msys2.org/):
; pacman -S --needed mingw-w64-ucrt-x86_64-{gcc,pkgconf,yaml-cpp,libuv,jsoncpp,openssl,libusb}
;
; argp is not packaged for MSYS2's mingw environments (msys/libargp links the
; msys-2.0.dll emulation layer and can't be used for a native binary), yet
; Arduino.h includes <argp.h> and main.cpp calls argp_parse(). Build it once from
; source, the same dependency macOS meets with `brew install argp-standalone`:
; git clone https://github.com/tom42/argp-standalone
; cd argp-standalone && cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=Release .
; cmake --build build
; cp include/argp-standalone/argp.h /ucrt64/include/argp.h ; ships no install() rules
; cp build/src/libargp-standalone.a /ucrt64/lib/libargp.a
;
; Build from any shell with /ucrt64/bin on PATH:
; pio run -e native-windows
; .pio/build/native-windows/meshtasticd.exe -s
; ---------------------------------------------------------------------------
[env:native-windows]
extends = native_base
build_flags = ${portduino_base.build_flags_common}
-I variants/native/portduino
; Our drop-in libpinedio-usb.h, replacing the libusb one: libusb can only reach
; a device bound to WinUSB, which means Zadig on every machine. See
; src/platform/portduino/windows/libpinedio_ch341dll.c.
-I src/platform/portduino/windows/include
-largp
-lws2_32 ; GpsdSerial.cpp's TCP client
-lbcrypt ; BCryptGenRandom() in HardwareRNG.cpp
-liphlpapi ; GetAdaptersAddresses() host-MAC fallback in PortduinoGlue.cpp
-ladvapi32 ; Service Control Manager entry points in windows/WindowsService.cpp
; libch341's libpinedio-usb.h pulls in libusb.h and so <windows.h>, which
; collides with the Arduino API: winuser.h's `typedef struct tagINPUT INPUT` vs
; the PinMode enumerator, and rpcndr.h's `typedef unsigned char boolean` vs
; Arduino's `typedef bool boolean`. NOUSER and WIN32_LEAN_AND_MEAN keep those
; headers out, NOMINMAX stops min/max being macroed over std::min/std::max.
-DWIN32_LEAN_AND_MEAN
-DNOMINMAX
-DNOUSER
-DNOGDI
; yaml-cpp declares its API __declspec(dllimport) unless told the link is
; static, leaving every YAML symbol undefined as __imp_*.
-DYAML_CPP_STATIC_DEFINE
; Headless: variant.h would otherwise default HAS_SCREEN to 1 and pull in the
; screen renderer; EXCLUDE_SCREEN gates the `screen->...` hooks in the sensors.
-DHAS_SCREEN=0
-DMESHTASTIC_EXCLUDE_SCREEN=1
!pkg-config --cflags --libs openssl --silence-errors || :
build_unflags =
-fPIC ; ignored on Windows, where all code is position-independent
; Static link, so meshtasticd.exe stands alone and can't be hijacked by a stray
; System32 DLL. PlatformIO only feeds build_flags to the compile step, hence the script.
extra_scripts =
${env.extra_scripts}
post:extra_scripts/windows_link_flags.py
; LinuxInput drives evdev; Panel_sdl/TFTDisplay pull LovyanGFX. Neither is needed
; for the headless build.
build_src_filter = ${native_base.build_src_filter}
-<input/LinuxInput.cpp>
-<input/LinuxInputImpl.cpp>
-<graphics/Panel_sdl.cpp>
-<graphics/TFTDisplay.cpp>
; LovyanGFX includes <malloc.h> and is only needed by the TFT variants. The pine64
; libch341 is the libusb backend that libpinedio_ch341dll.c replaces; keeping both
; would duplicate every pinedio_* symbol.
lib_ignore =
${portduino_base.lib_ignore}
LovyanGFX
Pine libch341-spi Userspace library
; Windows counterpart of [env:coverage-channel-table]; same flags, runnable on this host.
[env:native-windows-channel-table]
extends = env:native-windows
build_flags = ${env:native-windows.build_flags}
-include test/test_userprefs_channels/userprefs_fixture.h
test_filter =
test_userprefs_channels
; Windows counterpart of [env:coverage-event-policy]; same flags, runnable on this host.
[env:native-windows-event-policy]
extends = env:native-windows
build_flags = ${env:native-windows.build_flags}
-DUSERPREFS_BLOCK_POSITION_ON_EVENT_CHANNEL=1
-include test/support/userprefs_event_channel.h
test_filter = ${env:coverage-event-policy.test_filter}
; ---------------------------------------------------------------------------
; WASM (Emscripten) - the portduino node compiled to WebAssembly, driving a real
; LoRa radio over WebUSB through a CH341 (src/platform/portduino/wasm/). The same
; setup()/loop() firmware that runs native, but the radio HAL talks WebUSB and
; the cooperative loop suspends via Asyncify. Software/CI build target; the radio
; path itself is hardware (CH341/WebUSB, Chromium). See the README in that dir.
;
; Toolchain comes from the meshtastic/platform-wasm PlatformIO platform (emcc/
; em++). Prereq: an Emscripten SDK on PATH - `source <emsdk>/emsdk_env.sh` (or
; export EMSDK=<path>) - so the platform builder can locate emcc.
;
; Build: pio run -e native-wasm -> .pio/build/native-wasm/meshnode.{mjs,wasm}
; ---------------------------------------------------------------------------
[env:native-wasm]
platform =
# renovate: datasource=git-refs depName=platform-wasm packageName=https://github.com/meshtastic/platform-wasm gitBranch=master
https://github.com/meshtastic/platform-wasm/archive/7834113c8ee05bedc6af9c9cce7f515a1560e2c6.zip
framework = arduino
board = wasm
board_level = extra
; wasm-ld doesn't accept GNU ld's `-Wl,-Map,<file>` (inherited from [env]); strip
; it. The linker map isn't meaningful for the emcc/Asyncify output anyway.
build_unflags = -Wl,-Map,"${platformio.build_dir}"/output.map
build_flags = ${arduino_base.build_flags}
-I variants/native/portduino
-I src/platform/portduino
; FIRST: our <argp.h> stub shadows the missing glibc header
-I src/platform/portduino/wasm/stubs
-I src/platform/portduino/wasm/include
-I src/platform/portduino/wasm
-D ARCH_PORTDUINO
; ARCH_PORTDUINO_WASM gates every wasm guard in the firmware (the glue/main
; entry points, the single-threaded cooperative paths, region/RNG, etc.). The
; platform's board.json also injects it, but define it here too so the build's
; correctness never hinges on an out-of-repo board file.
-D ARCH_PORTDUINO_WASM
-DRADIOLIB_EEPROM_UNSUPPORTED
-fexceptions
; firmware uses gettimeofday(); the native toolchain pulls <sys/time.h> in
; transitively but emscripten doesn't, so force it.
-include sys/time.h
; Headless browser node - no screen / GPS / I2C / sensors / host services.
; Same exclusions the standalone emcc build used; gate out hardware/host code
; the tab can't run (the EXCLUDE_* defines also keep LDF from pulling the libs).
-DHAS_SCREEN=0
-DMESHTASTIC_EXCLUDE_SCREEN=1
-DMESHTASTIC_EXCLUDE_GPS=1 -DNO_GPS=1 -DNO_EXT_GPIO=1
-DMESHTASTIC_EXCLUDE_I2C=1
-DMESHTASTIC_EXCLUDE_ACCELEROMETER=1 -DMESHTASTIC_EXCLUDE_MAGNETOMETER=1
-DMESHTASTIC_EXCLUDE_AUDIO=1 -DMESHTASTIC_EXCLUDE_INPUTBROKER=1
-DMESHTASTIC_EXCLUDE_MQTT=1 -DMESHTASTIC_EXCLUDE_TZ=1
-DMESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR=1 -DMESHTASTIC_EXCLUDE_DETECTIONSENSOR=1
-DMESHTASTIC_EXCLUDE_EXTERNALNOTIFICATION=1 -DMESHTASTIC_EXCLUDE_CANNEDMESSAGES=1
-DMESHTASTIC_EXCLUDE_STOREFORWARD=1 -DMESHTASTIC_EXCLUDE_SERIAL=1
-DMESHTASTIC_EXCLUDE_PAXCOUNTER=1 -DMESHTASTIC_EXCLUDE_WAYPOINT=1
; No PWM/RTTTL ringtone playback support in the browser node.
-DMESHTASTIC_EXCLUDE_RTTTL=1
; The firmware-specific emcc *link* settings (exported fns, runtime methods, the
; WebUSB Asyncify import seam, the ES-module factory name) can't ride in
; build_flags - PlatformIO only feeds those to the compile step - so they're
; appended to LINKFLAGS by this post script. (The generic Asyncify/MODULARIZE/
; memory flags and emsdk auto-location both come from the platform-wasm builder.)
extra_scripts =
${env.extra_scripts}
post:extra_scripts/wasm_link_flags.py
; chain+ so the EXCLUDE_* / HAS_SCREEN defines gate sensor/screen #includes out
; of LDF (otherwise it would try to build host/incompatible sensor libs).
lib_ldf_mode = chain+
lib_deps =
${env.lib_deps}
${radiolib_base.lib_deps}
# renovate: datasource=git-refs depName=meshtastic/Crypto packageName=https://github.com/meshtastic/Crypto gitBranch=main
https://github.com/meshtastic/Crypto/archive/591ff9a690e8168ccb7a36abde8d7783e448d395.zip
# renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028
melopero/Melopero RV3028@1.2.0
lib_ignore =
LovyanGFX
SD
; Curated source set - the proven standalone emcc build's file list expressed as
; a PlatformIO filter. Deny everything, then add exactly what the browser node
; links: the wasm cooperative-loop entry, the mesh stack (top-level + generated),
; concurrency, the portduino glue, and the non-esp32 modules (the EXCLUDE_*
; defines gate the unwanted module bodies). serialization/ stays excluded - the
; wasm stub replaces MeshPacketSerializer (jsoncpp is MQTT-only).
build_src_filter =
-<*>
+<main.cpp>
+<PowerFSM.cpp> +<Power.cpp> +<airtime.cpp> +<sleep.cpp>
+<RedirectablePrint.cpp> +<SerialConsole.cpp> +<Observer.cpp>
+<FSCommon.cpp> +<SafeFile.cpp> +<MessageStore.cpp> +<meshUtils.cpp> +<UptimeClock.cpp>
+<memGet.cpp> +<memory/> +<GpioLogic.cpp> +<PowerMon.cpp> +<SPILock.cpp>
+<xmodem.cpp> +<DisplayFormatters.cpp>
+<detect/ScanI2C.cpp> +<detect/ScanI2CTwoWire.cpp> +<detect/ScanI2CConsumer.cpp>
+<power/PowerHAL.cpp>
+<gps/RTC.cpp>
+<buzz/buzz.cpp> +<buzz/BuzzerFeedbackThread.cpp>
+<mesh/*.cpp> +<mesh/*.c>
; template-only, amalgamated into InterfacesTemplates.cpp
-<mesh/LR20x0Interface.cpp>
+<mesh/generated/>
+<concurrency/>
+<platform/portduino/PortduinoGlue.cpp> +<platform/portduino/SimRadio.cpp>
+<platform/portduino/wasm/>
+<modules/> -<modules/esp32/>