Commit Graph
60 Commits
Author SHA1 Message Date
J. Nick Koston eb982e07a7 Veto the ld-script cache stamp when the warn note is lost, widen the linker denylist
A failed stderr-sidecar write no longer stamps the cache: the next build
re-runs -E and re-derives the preprocessor diagnostic honestly instead
of losing it for the life of the build dir. The sidecar unlink joins the
best-effort contract. The plain-linker denylist gains the
-nodefaultlibs/-nostdlib/-rdynamic family and the -fuse-ld=/--specs=
prefixes, with a comment naming it best-effort rather than complete.
The damaged-file helper test now lives only in test_helpers.py beside
the OSError-branch coverage.
2026-08-23 12:17:43 -05:00
J. Nick Koston 10d82b129a Rely on the lex funnel's empty-argument drop
The funnel now warns and drops empty glued arguments itself, so the
raise here had nothing left to catch.
2026-08-23 12:15:52 -05:00
J. Nick Koston be5317ae46 Scope the hex-only MMU rule to the segment sizes the surgery parser reads 2026-08-22 22:11:42 -05:00
J. Nick Koston 2521f29782 Apply the 18559 simplify pass: surgery wrapper, shared clean hint, resilient write helper, unified knob lookups, test scaffolding 2026-08-22 22:09:36 -05:00
J. Nick Koston bb7ba38fd0 Hoist the knob tables to dicts and the shape checks to compiled module regexes 2026-08-22 21:48:41 -05:00
J. Nick Koston 81afaca560 Unify the MMU guards: hex-only sizes, every valued MMU_* validated, no-knob refuses all 2026-08-22 21:29:31 -05:00
J. Nick Koston c60b8d1b8b Validate custom MMU sizes, refuse raw NONOSDK defines, warn on a lost stderr note 2026-08-22 20:26:27 -05:00
J. Nick Koston 33987c9682 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 20:01:32 -05:00
J. Nick Koston 8b8ef9bc61 Clean up the archive on any ar failure; state the link-order contract plainly 2026-08-22 20:00:22 -05:00
J. Nick Koston 03dba8b63e Raise on empty-argument build flags, pin the preprocessor decode, soften bookkeeping writes 2026-08-22 19:13:41 -05:00
J. Nick Koston 23fc61d9b1 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 16:38:31 -05:00
J. Nick Koston f4844e2d69 Accept precompiled=false, keep same-file copies intact, ungate the empty-match warning 2026-08-22 16:38:21 -05:00
J. Nick Koston db89d64c4e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 15:25:48 -05:00
J. Nick Koston 040c91259d Mirror the URL rule in the bundled probe; fail on empty converted trees; harden build_tool argv
A URL-pinned dependency now skips the bundled probe (the walk resolves
the fork; adding the bundled copy would double the archive). A versioned
bundled candidate's non-platform manifest fault warns here since it
skips the walk's usability filter via provides(); version-less causes
stay at debug (the walk already warned). The pending drain logs a
manifest-name suppression at debug and drops its unreachable
bundled_names re-check. A converted tree with no sources and no headers
now fails by name at emit like the bundled case (test scaffolds gained
real source files). build_tool validates each mode's operand count and
a failed copy unlinks the partial output.
2026-08-22 15:25:37 -05:00
J. Nick Koston 49dcc89130 Validate the board and flash-ld names; reject valued VTABLES defines; scope the damaged-cache recovery
The board name lands unquoted in two -D bodies and the flash linker
script name joins under the SDK and build ld dirs, so both are now
shape-validated like f_cpu. A VTABLES_IN_* define carrying a body would
split the compile line from the linker script and is refused. The
damaged-cache overwrite moves into a shared _write_generated helper
scoped to the comparison read: a corrupt existing copy is logged and
replaced (the testing-mode flash ld gets the same recovery), while a
genuine write failure still raises with its cause.
2026-08-22 15:05:58 -05:00
J. Nick Koston a9149aef28 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 13:10:55 -05:00
J. Nick Koston efa3018123 Close the four diagnostic gaps in the library backend
An owner-qualified dependency name (Owner/Pkg, both halves safe) is the
converter's to resolve and no longer draws the malformed-entry warning,
which stays for genuinely unsafe shapes. A declared srcFilter matching
only inert files now warns like one matching nothing, while matched
headers still read as a header-only library. The short-name suppression
logs the assumed external at debug so an accidental collision is
attributable. A failing ar batch unlinks the truncated archive before
returning its exit code.
2026-08-22 13:10:44 -05:00
J. Nick Koston 01f7373d51 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 12:26:39 -05:00
J. Nick Koston 6bdec7e907 Warn only for source-like suffix drops, batch ar argv, name non-iterable dependencies
The unmapped-suffix warning fired for every header-only library (the
default +<*> filter matches headers), so ArduinoJson would have warned
on every ESP8266 build. It now names exactly the source-like files
(.CPP, .ino and case-variants of the map) the case-sensitive suffix map
rejects, partial drops included, and stays quiet for headers and
metadata.

The ar shim batches the expanded object list by argv length (rc then q
appends), keeping the command line under the Windows 32767-char limit
the rspfile existed to avoid. A non-iterable dependencies value in a
manifest now warns by library name instead of raising a bare
TypeError.
2026-08-22 12:26:24 -05:00
J. Nick Koston dc1bbac385 Harden the build spec: content-hashed ld cache, strict f_cpu, loud diagnostics
The linker-script stamp now records the sha256 of the written content, so
an externally edited or truncated cached script regenerates instead of
passing a SECTIONS substring probe, and a non-UTF-8 cached script is
overwritten by the regeneration instead of aborting it. The cached
preprocessor diagnostic re-emit no longer swallows its own read failure.

board_build.f_cpu is validated (digits with an optional L) before landing
unquoted on the compile line, _pio_option rejects empty and blank values
instead of silently reverting to the default, and user MMU define bodies
re-quote through shell_token like every other user token. The plain-form
linker denylist is a named constant the _project_flags docstring points
at, so the two cannot drift.
2026-08-22 12:01:08 -05:00
J. Nick Koston 67544598c5 Trim comment essays 2026-08-22 11:42:55 -05:00
J. Nick Koston 351eb9209f Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 11:42:02 -05:00
J. Nick Koston c7a96f77d2 Trim comment essays and hoist function-local test imports 2026-08-22 11:41:59 -05:00
J. Nick Koston 2959fb6e7d Resolve the test's gcc path through toolchain_tool so Windows stats the .exe 2026-08-21 21:11:20 -05:00
J. Nick Koston e5ad855337 Use the shared tool accessor for gcc, drop dead dataclass defaults, add a resolve test helper
toolchain_tool owns the bin path and Windows suffix now; _BuildConfig's
knob and MMU fields are required since the only constructor always
passes both; the tests' set-flags-then-resolve idiom collapses into one
_resolve helper (12 sites).
2026-08-21 20:47:17 -05:00
J. Nick Koston accfd12199 Honor board_build.f_cpu on the native compile line
The routed override (published configs pin 160000000L for
timing-sensitive integrations) reaches -DF_CPU via a small _pio_option
reader; the default stays the audited 80 MHz all 45 boards ship.
2026-08-21 20:28:27 -05:00
J. Nick Koston 44b64e0963 Note why F_CPU is hardcoded, widen the plain linker-flag denylist
F_CPU gets the same drift-audit note as _MMU_DEFAULT: upstream reads it
from the board manifest, and all 45 supported boards ship 80000000L.
The plain-form refusal also covers -e, -s, -static, and -nostartfiles,
which gcc accepts inertly on a -c line.
2026-08-21 20:21:57 -05:00
J. Nick Koston df1aa5ff61 Make the lex-once contract structural, stamp the compiler, guard bare -I/-D
tokens is a required parameter on _flag_defines and _project_flags now,
so the per-consumer re-lex the shared lexer was meant to end cannot
come back. The cache stamp covers the gcc binary's size and mtime via
a shared _stat_sig (an in-place toolchain re-extraction regenerates
the script like a header edit). A bare -I or -D from an empty argument
is warned and skipped instead of letting gcc eat the next flag.
_defines_flags documents that its tokens carry shell-level escaping and
must be emitted unquoted, and _MMU_DEFAULT notes why the board-manifest
values are hardcoded.
2026-08-21 19:59:26 -05:00
J. Nick Koston ce5ccb4294 Name every ld-generation failure, refuse inert linker flags, reuse the shared lexer
Both testing-mode segment patches get the RuntimeError-to-EsphomeError
wrap the ratetable surgery already had. Plain-form -T/-Xlinker/-u flags
raise naming the -Wl, form instead of warning into an inert -c compile
line. _lexed_build_flags and _unflag_tokens go through the shared
lex_build_flags so a future lexing fix cannot miss this path. The MMU
conflict message names dropping the variant knob when MMU_CUSTOM is
already set. An unreadable (not absent) header forces a cache miss
every run instead of pinning the stamp to a constant, and preprocessor
warnings persist beside the stamp and re-emit on cache hits. The drift
docstring states what the tests actually pin.
2026-08-21 18:54:19 -05:00
J. Nick Koston 7c2254d8ee Refuse knob-plus-raw define splits, lex build flags once, harden the ld cache
A raw MMU_* define alongside a PIO_FRAMEWORK_ARDUINO_MMU_* knob, or a
raw TCP_MSS/LWIP_* alongside the lwIP knobs, would win the compile line
while the linker script or prebuilt library keeps the knob's values;
both now raise like the no-knob case. _MMU_VARIANTS holds tuples and the
resolved config gets a copy, so nothing aliases the module table.
_lexed_build_flags lexes once and both consumers accept the tokens, so
a malformed entry warns once per build. The linker-script stamp covers
the header's size and mtime, an unreadable or non-UTF-8 cache
regenerates instead of aborting, plain-form linker flags warn that they
are not routed to the link line, and a moved rate-table anchor surfaces
as a named build error.
2026-08-21 13:32:12 -05:00
J. Nick Koston 84de74663c Cover the testing-mode flash-ld OSError guard 2026-08-21 13:06:33 -05:00
J. Nick Koston 784cf6819f Refuse inconsistent memory-layout configs, validate the cached linker script
Unknown or conflicting VTABLES_IN_* defines raise instead of warning
and picking arbitrarily (a typo previously won the sorted pick and died
in the SDK header's #error). Custom MMU sizes without the CUSTOM knob
raise too: PlatformIO warns but its defaults win the compile line,
while here the user's tokens would win and compile against a layout the
linker script does not implement. The cached linker script is re-checked
for its SECTIONS block so a truncated file regenerates, the
testing-mode flash-ld read gets the same OSError guard as the gcc
spawn, the ParseFlags docstring states its actual coverage, and the ld
test mocks are quiet so the clean path asserts no warnings.
2026-08-21 12:55:23 -05:00
J. Nick Koston a7febfbf05 Track the per-platform shell quoting in the requote drift test 2026-08-21 12:26:23 -05:00
J. Nick Koston cd2ab6e78b Join unflag tokens, filter knobs by unflags, pin every table verbatim, guard degenerate ld output and empty lib flags 2026-08-20 23:57:45 -05:00
J. Nick Koston 68db655047 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 20:41:36 -05:00
J. Nick Koston fdbd4157ff Carry lib_archive, warn on unresolvable deps, unquote rsp lines, fail empty archives, note deviations 2026-08-20 20:41:17 -05:00
J. Nick Koston e1cbe5e586 Sort flag iteration for reproducible defines, pin the flag tables, wrap a missing compiler cleanly 2026-08-20 18:28:26 -05:00
J. Nick Koston 52aafc3af6 Drop the escaping test superseded by the shared ninja module tests 2026-08-20 16:20:19 -05:00
J. Nick Koston 0d794ce678 Lex every build flag entry, warn on custom MMU sizes without the knob, note the scanf omission 2026-08-20 16:10:02 -05:00
J. Nick Koston 0171af9f67 Adopt the shared ninja quoting helpers and typed install paths in the build spec 2026-08-20 16:07:22 -05:00
J. Nick Koston d9cea818b4 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 15:12:49 -05:00
J. Nick Koston 8bbaa09891 Expand ar response files in the shim and honor bundled library.json manifests 2026-08-20 14:46:09 -05:00
J. Nick Koston cd0c3bb069 Keep the spec half honest: fingerprint-stamped ld cache, MMU table, emission helpers deferred 2026-08-20 14:19:53 -05:00
J. Nick Koston 9d54e87c70 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 14:17:02 -05:00
J. Nick Koston d64592d2ea Simplify library classification, share the manifest flag lexing, and home the build tool with the generators 2026-08-20 14:16:46 -05:00
J. Nick Koston 0ed4c47b66 Adopt the exact-segments surgery API 2026-08-20 13:48:16 -05:00
J. Nick Koston 8e5b9dca03 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 13:44:30 -05:00
J. Nick Koston e82453e80e Complete the unit-test package chain so test modules import fully qualified 2026-08-20 13:42:15 -05:00
J. Nick Koston 61e32230d9 Add the ESP8266 native build spec (knobs, defines, flags, linker scripts) 2026-08-20 13:02:52 -05:00
David van 't Wout 2ab09e1a77 [core] Add add_cmake_arg (#18498) 2026-08-20 12:30:33 -05:00