Het buildsysteem¶
INI-BESTANDEN · BASISSECTIES · OVERERVING · BRONFILTER
Uit één codebase komen 508 firmwarebestanden. Dit hoofdstuk beschrijft de
machinerie die dat doet: tachtig platformio.ini-bestanden, 108 basissecties
en twee verschillende overervingsmechanismen die allebei gevolgd moeten
worden. Wie er maar één volgt, mist 28 buildtargets zonder dat iets stukgaat.
[!NOTE] Bron. Deze pagina is geverifieerd tegen de firmware zelf:
MeshCorev1.16.0, commit03b6ef4, 28 juli 2026 — de rootplatformio.inien alle 79variants/*/platformio.ini.
De cijfers¶
| Wat | Aantal |
|---|---|
platformio.ini-bestanden |
80 (1 root + 79 varianten) |
| Secties totaal | 616 |
[env:...]-secties (buildtargets) |
508 |
| Basissecties | 108 |
| Targets die hun applicatie alleen via overerving hebben | 28 |
Een basissectie is een sectie zonder het voorvoegsel env:. PlatformIO bouwt
hem niet, maar andere secties kunnen er via extends van erven. De 108
basissecties dragen dus de gedeelde instellingen van de 508 targets.
Twee overervingsmechanismen¶
PlatformIO kent er twee, en ze werken anders.
extends neemt alle opties van de genoemde sectie over. Een sectie die
extends = esp32_base heeft, krijgt elke optie die daar staat, tenzij hij hem
zelf overschrijft.
${sectie.optie} splitst tekst in. Dat is geen overerving maar
tekstvervanging: op de plek van de verwijzing komt letterlijk de waarde van
die ene optie te staan.
Een sectie kan beide gebruiken, en veel secties doen dat. Wie alleen extends
volgt, mist de opties die via ${...} binnenkomen; wie alleen ${...} volgt,
mist alles wat via extends erft. In MeshCore 03b6ef4 mis je 28 buildtargets
als je maar één van de twee volgt: die krijgen hun build_src_filter — en dus
hun applicatie — van een gedeelde basissectie die zelf geen [env:...] is.
Hoeveel targets uit welke basissectie komen¶
| Basissectie | Targets die eruit erven |
|---|---|
arduino_base |
507 |
esp32_base |
270 |
nrf52_base |
199 |
rp2040_base |
22 |
esp32c6_base |
16 |
stm32_base |
16 |
nibble_screen_connect_base |
8 |
Heltec_E213_base |
6 |
Heltec_E290_base |
6 |
Heltec_T190_base |
6 |
Heltec_tracker_base |
6 |
Heltec_Wireless_Paper_base |
6 |
arduino_base staat onder alles: 507 van de 508 targets erven ervan. De
enige uitzondering is [env:native], de sectie waarmee de tests op een pc
draaien.
De vier familiebasissecties eronder — 270 + 199 + 22 + 16 — tellen samen op tot 507. Elk target hoort bij precies één platformfamilie.
esp32c6_base is geen vijfde familie. Die sectie erft zelf van esp32_base
en zit dus binnen de ESP32-familie; de 16 targets eronder zijn ook in de 270
meegeteld. De ESP32-C6 is een RISC-V-chip in plaats van een Xtensa, wat een
paar afwijkende compileropties nodig maakt, maar voor de firmware is het
dezelfde familie.
De naam van een sectie bewijst niets¶
Dit is de belangrijkste valkuil van dit hoofdstuk, en hij geldt voor elke telling over de buildmatrix.
Welke applicatie een target compileert, staat in build_src_filter — de optie
die bepaalt welke bronbestanden meegaan. Niet in de naam van de sectie. Een
sectie die Generic_ESPNOW_room_svr heet, compileert de room server zonder
dat er room_server in de naam staat; omgekeerd hoeft een naam op
_room_server niets te bewijzen.
Tellen op de naam geeft 70 room-servertargets in 66 directory's. Tellen op het opgeloste bronfilter geeft er 73 in 65. Dat verschil van drie targets en één directory komt geheel uit de twee overervingsmechanismen hierboven.
| Rol | Targets |
|---|---|
| Companion radio | 174 |
| Repeater | 136 |
| KISS-modem | 80 |
| Room server | 73 |
| Terminal chat | 26 |
| Sensor | 18 |
Samen 507, plus [env:native] zonder applicatie. Welke rol wat doet, staat in
Rollen.
Aanvullende buildopties¶
Boven op de combinatie van bord en rol komen de losse schakelaars. Ze staan los van elkaar aan of uit, en verklaren waarom er meer targets zijn dan borden maal rollen:
| Schakelaar | Targets |
|---|---|
ENV_INCLUDE_GPS |
323 |
DISPLAY_CLASS |
309 |
MESH_DEBUG |
36 |
WITH_ESPNOW_BRIDGE |
33 |
WITH_RS232_BRIDGE |
13 |
MESH_PACKET_LOGGING |
10 |
MESH_DEBUG verdient een waarschuwing. De macro komt 387 keer voor in de
tachtig ini-bestanden, maar staat in slechts 36 targets werkelijk aan. De rest
staat uitgecommentarieerd achter een ;. Wie op tekst zoekt in plaats van op
actieve regels, overschat de foutopsporing met een factor tien.
MESH_PACKET_LOGGING gaat net zo: 385 vermeldingen, 10 targets.
Drie bestanden met CRLF¶
variants/minewsemi_me25ls01/, variants/nibble_screen_connect/ en
variants/wio_wm1110/ gebruiken Windows-regeleinden. Zonder normalisatie
lezen esp32_base\r en esp32_base als twee verschillende ouders, en vallen
die targets buiten elke telling.
tools/design-overview.py normaliseert de regeleinden daarom voordat het iets
anders doet.
Wat er niet compileert¶
Generic_E22_kiss_modem compileert niet. De sectie bestaat en wordt door
PlatformIO herkend, maar de combinatie van opties levert een bouwfout op. Het
target zit in de tellingen omdat het een [env:...]-sectie is; wie een
firmwarebestand verwacht, krijgt er geen.
platformio.local.ini staat in extra_configs van de root, maar zit niet in
de repo. Dat is opzet: het is de plek voor lokale instellingen die je niet
meecommit. PlatformIO slaat een ontbrekend bestand in extra_configs over
zonder te klagen.
FIRMWARE_BUILD_DATE staat op "6 Jun 2026" in vier van de zes applicaties,
terwijl deze commit van 28 juli is. De waarde is handmatig, wordt zelden
bijgewerkt, en is dus geen betrouwbare aanduiding van wanneer een build is
gemaakt.
Narekenen¶
python3 tools/design-overview.py /pad/naar/MeshCore
python3 tools/design-overview.py /pad/naar/MeshCore --targets simple_room_server
Het script lost extends en ${sectie.optie} allebei op, normaliseert CRLF,
en slaat uitgecommentarieerde regels over. Zijn room-servertelling (73 targets
in 65 directory's) komt overeen met tools/room-server-overview.py, dat langs
een andere weg tot hetzelfde getal komt — die kruiscontrole is het bewijs dat
de oplosser klopt.