Compare commits

..
Author SHA1 Message Date
J. Nick Koston af43c31d45 Merge branch 'pch-strict-ci' into host-pch 2026-09-28 11:50:49 +02:00
J. Nick Koston 0c87abb3b4 Merge branch 'platformio-pch-libretiny' into pch-strict-ci
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-09-28 11:50:35 +02:00
J. Nick Koston 6b619ed973 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-28 11:50:11 +02:00
J. Nick Koston e9f7e00f78 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-28 11:50:10 +02:00
J. Nick Koston bc323e74aa Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-28 11:50:10 +02:00
J. Nick Koston 26b8186a73 Emit the precompiled header through a named function in the shared generator 2026-09-28 11:49:41 +02:00
J. Nick Koston b2c3b954d6 Precompile the host prefix on the ninja build through one shared helper 2026-09-28 11:45:48 +02:00
J. Nick Koston f28b569e9f Merge branch 'pch-strict-ci' into host-pch
# Conflicts:
#	esphome/components/host/__init__.py
2026-09-28 11:38:30 +02:00
J. Nick Koston 66717016d7 Merge branch 'platformio-pch-libretiny' into pch-strict-ci
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-09-28 11:36:36 +02:00
J. Nick Koston 440c78c4ea Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-28 11:36:04 +02:00
J. Nick Koston e93ebf120f Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-28 11:36:03 +02:00
J. Nick Koston 8695e9a7c7 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-28 11:36:03 +02:00
J. Nick Koston 38b06cbfbd Merge remote-tracking branch 'origin/dev' into esp8266-native-pch
# Conflicts:
#	esphome/arduino8266/framework.py
#	esphome/build_gen/arduino8266.py
#	esphome/build_helpers/ccache.py
#	tests/unit_tests/build_helpers/test_ccache.py
#	tests/unit_tests/test_arduino8266_toolchain.py
2026-09-28 11:35:49 +02:00
J. Nick Koston deca3d89be Merge branch 'pch-strict-ci' into host-pch 2026-09-26 21:01:36 +01:00
J. Nick Koston 52c71d4ecc Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-26 21:01:36 +01:00
J. Nick Koston d4c053bffb Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-26 21:01:36 +01:00
J. Nick Koston 0dc12d57a9 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-26 21:01:35 +01:00
J. Nick Koston d96b85b8de Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-26 21:01:35 +01:00
J. Nick Koston 9570f19c09 Merge remote-tracking branch 'origin/dev' into esp8266-native-pch 2026-09-26 21:01:19 +01:00
J. Nick Koston 715cb55d46 Merge branch 'pch-strict-ci' into host-pch 2026-09-26 20:50:35 +01:00
J. Nick Koston 7010858b19 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-26 20:50:34 +01:00
J. Nick Koston e7a7768e96 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-26 20:50:34 +01:00
J. Nick Koston d052d8a01d Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-26 20:50:34 +01:00
J. Nick Koston f613101703 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-26 20:50:26 +01:00
J. Nick Koston 36b60e585a Merge branch 'esp8266-native-ci' into esp8266-native-pch
# Conflicts:
#	esphome/build_helpers/idedata.py
#	esphome/components/esp8266/__init__.py
#	script/determine-jobs.py
#	tests/script/test_determine_jobs.py
#	tests/unit_tests/test_arduino8266_toolchain.py
2026-09-26 20:49:30 +01:00
J. Nick Koston 06a26ee57c Trigger the smoke tests when the shared build configs change 2026-09-26 20:47:51 +01:00
J. Nick Koston c125310f66 Check the blank component list before discovery
The guard validates arguments, so it reads better next to the other
early exit than after the loop that already skips blank patterns.
2026-09-26 20:44:15 +01:00
J. Nick Koston b695dde1c3 Add the native ESP8266 CI smoke test
Runs the test_build_components matrix with --toolchain arduino behind
a cached framework install, and teaches determine-jobs which changes
must trigger it.
2026-09-26 20:44:15 +01:00
J. Nick Koston d5b237f6e2 Merge branch 'pch-strict-ci' into host-pch 2026-09-26 11:25:05 +01:00
J. Nick Koston 7465c1ef02 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-26 11:25:05 +01:00
J. Nick Koston 1bcab7f2b8 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-26 11:25:05 +01:00
J. Nick Koston 0bf4f5dfba Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-26 11:25:05 +01:00
J. Nick Koston 45e79648a0 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-26 11:25:04 +01:00
J. Nick Koston 3390a13e8c Merge branch 'esp8266-native-ci' into esp8266-native-pch
# Conflicts:
#	esphome/components/esp8266/__init__.py
2026-09-26 11:24:50 +01:00
J. Nick Koston 5cb3ec2ac4 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-ci 2026-09-26 11:24:31 +01:00
J. Nick Koston 3bbe673ee5 Resolve the native backend from one shared table
The (platform, toolchain) mapping lived in both __main__ and the esp8266
component, so a renamed backend module meant editing two places and the
drift test only covered one. build_helpers/native.py now holds it; the
module stays import-light so the serial upload and logs fast path can
resolve a backend without pulling in a platform package.
2026-09-26 11:24:13 +01:00
J. Nick Koston d7075fbd5b Merge branch 'pch-strict-ci' into host-pch 2026-09-26 10:35:52 +01:00
J. Nick Koston 875615561c Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-26 10:35:52 +01:00
J. Nick Koston d4e741d419 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-26 10:35:51 +01:00
J. Nick Koston 26d6baea6c Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-26 10:35:51 +01:00
J. Nick Koston 32e699c4e4 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-26 10:35:51 +01:00
J. Nick Koston 831897c93b Merge branch 'esp8266-native-ci' into esp8266-native-pch 2026-09-26 10:35:51 +01:00
J. Nick Koston 6eab575dc5 Check the blank component list before discovery
The guard validates arguments, so it reads better next to the other
early exit than after the loop that already skips blank patterns.
2026-09-26 10:35:50 +01:00
J. Nick Koston 2d162da693 Merge branch 'pch-strict-ci' into host-pch 2026-09-26 10:32:27 +01:00
J. Nick Koston 2b9c549a0c Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-26 10:32:27 +01:00
J. Nick Koston 8b41b14528 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-26 10:32:27 +01:00
J. Nick Koston 17bac02770 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-26 10:32:26 +01:00
J. Nick Koston 0d0a808e49 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-26 10:32:26 +01:00
J. Nick Koston 75cece4f4f Merge branch 'esp8266-native-ci' into esp8266-native-pch 2026-09-26 10:32:26 +01:00
J. Nick Koston cf6ada1e85 Merge remote-tracking branch 'origin/dev' into esp8266-arduino-toolchain 2026-09-26 10:32:25 +01:00
J. Nick Koston 47321da57c Merge branch 'esp8266-arduino-toolchain' into esp8266-native-ci 2026-09-26 10:32:25 +01:00
J. Nick Koston 22fa536fa5 Simplify the native toolchain driver
Drops the ninja dry-run probe (a second full manifest load and stat
sweep per build to suppress one line), the compile-database stamp file
(a plain mtime compare says the same), and the ccache sentinel
(resolve_ccache_path only spawns when it returns a value, so a plain
fallback never re-probes). The crash decoder resolves addr2line and
the ELF once per run instead of once per address, which removes the
module-level warn-dedup dict along with its test fixture. The size
summary uses the toolchain path it was handed rather than re-deriving
it, and its two failure branches merge.

The framework import moves into the functions that need it: the serial
upload and logs fast path resolves this module for artifact paths
alone and was paying 16 ms and 29 modules for the package-download
stack. test_lazy_imports now guards that module so it cannot come
back. analyze-memory's idedata candidate list learns the suffixed
native cache name, and warn_if_idedata_missing goes back to being a
one-for-one extraction.
2026-09-26 10:31:52 +01:00
J. Nick Koston 83fd1646b4 Merge branch 'pch-strict-ci' into host-pch 2026-09-26 10:01:01 +01:00
J. Nick Koston ba4bb6c778 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-26 10:01:01 +01:00
J. Nick Koston e65aeff1e2 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-26 10:01:01 +01:00
J. Nick Koston bd329cdceb Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-26 10:01:01 +01:00
J. Nick Koston 94f83b4ee2 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-26 10:01:01 +01:00
J. Nick Koston 5d477af185 Merge branch 'esp8266-native-ci' into esp8266-native-pch 2026-09-26 10:01:00 +01:00
J. Nick Koston d1e8b5afcc Add the native ESP8266 CI smoke test
Runs the test_build_components matrix with --toolchain arduino behind
a cached framework install, and teaches determine-jobs which changes
must trigger it.
2026-09-26 10:00:44 +01:00
J. Nick Koston d16714de24 Move the native ESP8266 CI wiring to a follow-up PR
The smoke-test job, its cache action, and the job-determination and
harness changes that drive it land separately so this PR stays the
build driver alone.
2026-09-26 10:00:11 +01:00
J. Nick Koston 427c2f4cb3 Merge branch 'pch-strict-ci' into host-pch
# Conflicts:
#	esphome/writer.py
2026-09-25 16:22:52 +01:00
J. Nick Koston dbecf359ac Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-25 16:22:03 +01:00
J. Nick Koston d01748bc40 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-25 16:22:03 +01:00
J. Nick Koston 08e3b6af06 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-25 16:22:02 +01:00
J. Nick Koston 269374397e Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-25 16:22:02 +01:00
J. Nick Koston 25f600d437 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-25 16:22:02 +01:00
J. Nick Koston 739cc7fb5a Merge remote-tracking branch 'origin/dev' into esp8266-arduino-toolchain 2026-09-25 16:22:01 +01:00
J. Nick Koston ebbeb5a472 Merge branch 'pch-strict-ci' into host-pch 2026-09-24 17:35:37 +01:00
J. Nick Koston f5ba555acf Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-24 17:35:36 +01:00
J. Nick Koston 44dea178ad Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-24 17:35:36 +01:00
J. Nick Koston b91d4055fc Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-24 17:35:36 +01:00
J. Nick Koston 9ddd2c5ee1 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-24 17:35:35 +01:00
J. Nick Koston ce43590835 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-24 17:35:35 +01:00
J. Nick Koston 4db8af29b4 Merge remote-tracking branch 'origin/dev' into esp8266-arduino-toolchain 2026-09-24 17:35:35 +01:00
J. Nick Koston edbfd9a437 Merge branch 'pch-strict-ci' into host-pch 2026-09-24 14:10:05 +01:00
J. Nick Koston 4b289765d2 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-24 14:10:05 +01:00
J. Nick Koston a2b3c3b97e Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-24 14:10:05 +01:00
J. Nick Koston 78663302f3 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-24 14:10:04 +01:00
J. Nick Koston 9a6b19e591 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-24 14:10:04 +01:00
J. Nick Koston 7a7fc6647b Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-24 14:10:04 +01:00
J. Nick Koston 61a0aad593 Merge remote-tracking branch 'origin/dev' into esp8266-arduino-toolchain 2026-09-24 14:10:03 +01:00
J. Nick Koston 9b24d56b39 Merge branch 'pch-strict-ci' into host-pch 2026-09-23 23:46:57 +01:00
J. Nick Koston 5421f1dd94 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 23:46:57 +01:00
J. Nick Koston 2e129ee1d2 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-23 23:46:57 +01:00
J. Nick Koston 3ab48fcf59 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 23:46:56 +01:00
J. Nick Koston 58f83bed2f Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 23:46:56 +01:00
J. Nick Koston 0a00cc7133 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-23 23:46:56 +01:00
J. Nick Koston 4ade8d0515 Merge remote-tracking branch 'origin/dev' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/build_gen/arduino8266.py
#	esphome/components/esp8266/__init__.py
2026-09-23 23:46:53 +01:00
J. Nick Koston 9f947c7cd8 Merge branch 'pch-strict-ci' into host-pch 2026-09-23 23:36:23 +01:00
J. Nick Koston e992a400d8 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 23:36:23 +01:00
J. Nick Koston 0459efecf5 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-23 23:36:22 +01:00
J. Nick Koston 5f1a6d9b7b Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 23:36:22 +01:00
J. Nick Koston 84fa24205c Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 23:36:21 +01:00
J. Nick Koston 7750cdb72e Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-23 23:36:21 +01:00
J. Nick Koston 87968a3ea3 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-23 23:36:21 +01:00
J. Nick Koston cec0d05f96 Merge remote-tracking branch 'origin/dev' into esp8266-native-ninja-emission 2026-09-23 23:36:20 +01:00
J. Nick Koston 735e6d0fc3 Merge branch 'pch-strict-ci' into host-pch 2026-09-23 23:23:00 +01:00
J. Nick Koston 8b3634fb34 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 23:23:00 +01:00
J. Nick Koston 961a3e176f Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-23 23:23:00 +01:00
J. Nick Koston 2f63536667 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 23:23:00 +01:00
J. Nick Koston 8f8704d638 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 23:22:59 +01:00
J. Nick Koston ef3f6d3951 Read the extracted flag sets in the pch emission
The write_project split moved cxxflags into _resolve_flag_sets's
return; the pch layer's two reads follow it.
2026-09-23 23:22:57 +01:00
J. Nick Koston 64b52357b0 Merge branch 'pch-strict-ci' into host-pch 2026-09-23 23:19:51 +01:00
J. Nick Koston 592699a96a Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 23:19:50 +01:00
J. Nick Koston efc8804867 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-23 23:19:50 +01:00
J. Nick Koston 0ae6d6d193 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 23:19:50 +01:00
J. Nick Koston 80a41ce453 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 23:19:50 +01:00
J. Nick Koston 73425d06a3 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-23 23:19:49 +01:00
J. Nick Koston 90a7c1dde2 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-23 23:19:49 +01:00
J. Nick Koston cc38e93214 Extract install checks and flag resolution from write_project
_check_install and _resolve_flag_sets pull ~110 lines out of the one
function body; behavior and emitted output are unchanged (the existing
end-to-end tests pass as-is).
2026-09-23 23:19:46 +01:00
J. Nick Koston a91874dcd9 Merge branch 'pch-strict-ci' into host-pch 2026-09-23 23:13:21 +01:00
J. Nick Koston a6c3e48466 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 23:13:21 +01:00
J. Nick Koston 90eb7bbc5c Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-23 23:13:21 +01:00
J. Nick Koston 57569404d9 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 23:13:20 +01:00
J. Nick Koston 62f0f0909a Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 23:13:20 +01:00
J. Nick Koston 3d6e5fd244 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-23 23:13:20 +01:00
J. Nick Koston 345106c56f Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-23 23:13:20 +01:00
J. Nick Koston c54e671a26 Check install completeness before spawning the linker-script gcc
A half-extracted framework cache now names the missing path instead of
surfacing a gcc failure; pure reorder, the checks depend on nothing
the generation step produces.
2026-09-23 23:13:03 +01:00
J. Nick Koston 45f4173ab5 Merge branch 'pch-strict-ci' into host-pch 2026-09-23 23:06:08 +01:00
J. Nick Koston 4a21970b24 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 23:06:08 +01:00
J. Nick Koston 08c4abf1ea Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-23 23:06:07 +01:00
J. Nick Koston f75206c707 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 23:06:07 +01:00
J. Nick Koston 0150b11a7f Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 23:06:07 +01:00
J. Nick Koston 2d79d1745d Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-23 23:06:07 +01:00
J. Nick Koston ce869366b8 Trim docstrings to repo standard 2026-09-23 23:06:04 +01:00
J. Nick Koston 94c3dd707f Merge branch 'pch-strict-ci' into host-pch 2026-09-23 23:02:49 +01:00
J. Nick Koston 2a86ab8d12 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 23:02:49 +01:00
J. Nick Koston 3341efba7a Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-23 23:02:49 +01:00
J. Nick Koston 958b7820ec Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 23:02:48 +01:00
J. Nick Koston f3e7399ab1 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 23:02:48 +01:00
J. Nick Koston 12fa602548 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-23 23:02:48 +01:00
J. Nick Koston c2406d5592 Trim comments to repo standard 2026-09-23 23:02:43 +01:00
J. Nick Koston a7b8642c2a Merge branch 'pch-strict-ci' into host-pch 2026-09-23 22:54:46 +01:00
J. Nick Koston 0cd6197873 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-23 22:54:46 +01:00
J. Nick Koston f25ce06a21 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny
# Conflicts:
#	esphome/components/libretiny/__init__.py
2026-09-23 22:54:43 +01:00
J. Nick Koston dfd52cb9c6 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-23 22:54:18 +01:00
J. Nick Koston 2ec4456942 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-23 22:54:18 +01:00
J. Nick Koston 0f49668b76 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-23 22:54:18 +01:00
J. Nick Koston 4913034584 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-23 22:54:17 +01:00
J. Nick Koston 1f94d0e904 Merge remote-tracking branch 'origin/dev' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-09-23 22:54:13 +01:00
J. Nick Koston c09eaf5b36 Merge branch 'pch-strict-ci' into host-pch 2026-09-17 08:46:11 -05:00
J. Nick Koston 52a3f1f609 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-17 08:46:10 -05:00
J. Nick Koston 8fabbec5b5 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-17 08:46:10 -05:00
J. Nick Koston 6d74cf00da Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-17 08:46:10 -05:00
J. Nick Koston 5323693d8f Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-17 08:46:10 -05:00
J. Nick Koston 39ae4d4f41 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-17 08:46:09 -05:00
J. Nick Koston ff7b402241 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-17 08:46:09 -05:00
J. Nick Koston 6db112b694 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-17 08:46:09 -05:00
J. Nick Koston 43b3167cff Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-09-17 08:46:08 -05:00
J. Nick Koston c47c962cf2 Merge branch 'pch-strict-ci' into host-pch 2026-09-16 09:29:17 -05:00
J. Nick Koston 862c588b24 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-16 09:29:17 -05:00
J. Nick Koston 6254687dc3 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-16 09:29:17 -05:00
J. Nick Koston ac707c4304 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-16 09:29:16 -05:00
J. Nick Koston 7878616117 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-16 09:29:16 -05:00
J. Nick Koston 7eb91404fb Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-16 09:29:15 -05:00
J. Nick Koston 651a309034 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-16 09:29:15 -05:00
J. Nick Koston 3fecee6f9c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-16 09:29:15 -05:00
J. Nick Koston 5884b4c01b Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-09-16 09:29:06 -05:00
J. Nick Koston 8b8866307b Merge branch 'pch-strict-ci' into host-pch 2026-09-12 08:41:59 -05:00
J. Nick Koston d93556b0e0 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-12 08:41:58 -05:00
J. Nick Koston 11e553b353 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-12 08:41:58 -05:00
J. Nick Koston f7fe90e5da Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-12 08:41:58 -05:00
J. Nick Koston fdd62b0bc5 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-12 08:41:57 -05:00
J. Nick Koston 2938bd2e1c Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-12 08:41:57 -05:00
J. Nick Koston 75ff8ec543 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-12 08:41:57 -05:00
J. Nick Koston 4863aae192 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-12 08:41:56 -05:00
J. Nick Koston eed19f5eca Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-09-12 08:41:47 -05:00
J. Nick Koston c270336f03 Merge branch 'pch-strict-ci' into host-pch 2026-09-08 18:09:30 +02:00
J. Nick Koston 157d3adc0e Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-08 18:09:30 +02:00
J. Nick Koston 845416ff55 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-08 18:09:30 +02:00
J. Nick Koston e3f46f0572 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-08 18:09:29 +02:00
J. Nick Koston 5f8d620ed8 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-08 18:09:29 +02:00
J. Nick Koston 7b6cff8adb Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-08 18:09:29 +02:00
J. Nick Koston a034800d91 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-08 18:09:29 +02:00
J. Nick Koston 5995887e7a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-08 18:09:28 +02:00
J. Nick Koston d6c337f9e0 Merge remote-tracking branch 'origin/host-pch' into host-pch 2026-09-08 18:09:27 +02:00
J. Nick Koston ff05946f33 Merge remote-tracking branch 'origin/pch-strict-ci' into pch-strict-ci 2026-09-08 18:09:27 +02:00
J. Nick Koston 5038755210 Merge remote-tracking branch 'origin/platformio-pch-libretiny' into platformio-pch-libretiny 2026-09-08 18:09:27 +02:00
J. Nick Koston 439f873767 Merge remote-tracking branch 'origin/platformio-pch-rp2' into platformio-pch-rp2 2026-09-08 18:09:27 +02:00
J. Nick Koston 9406d94dad Merge remote-tracking branch 'origin/esp32-idf-pch' into esp32-idf-pch 2026-09-08 18:09:27 +02:00
J. Nick Koston 7563e64482 Merge remote-tracking branch 'origin/esp8266-native-build-spec' into esp8266-native-build-spec 2026-09-08 18:09:26 +02:00
J. Nick Koston d941d910cc Merge remote-tracking branch 'origin/esp8266-native-pch' into esp8266-native-pch 2026-09-08 18:09:26 +02:00
J. Nick Koston 95ca13fba0 Merge remote-tracking branch 'origin/esp8266-arduino-toolchain' into esp8266-arduino-toolchain 2026-09-08 18:09:26 +02:00
J. Nick Koston e31a1b2324 Merge remote-tracking branch 'origin/esp8266-native-ninja-emission' into esp8266-native-ninja-emission 2026-09-08 18:09:26 +02:00
J. Nick Koston 9f3f028b9d Merge branch 'pch-strict-ci' into host-pch 2026-09-08 18:02:33 +02:00
J. Nick Koston ba7b5262f4 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-08 18:02:32 +02:00
J. Nick Koston 2522e434b6 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-08 18:02:32 +02:00
J. Nick Koston 52ffd304ef Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-08 18:02:32 +02:00
J. Nick Koston b46bfc9bc3 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-08 18:02:31 +02:00
J. Nick Koston 79aab2c700 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-08 18:02:31 +02:00
J. Nick Koston 25dc7edca0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-08 18:02:31 +02:00
J. Nick Koston f629b9fee9 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-08 18:02:28 +02:00
J. Nick Koston 4557c7f0e8 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-09-08 18:02:15 +02:00
J. Nick Koston a176929805 Merge branch 'pch-strict-ci' into host-pch 2026-09-08 18:01:53 +02:00
J. Nick Koston 6a2a685bc7 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-08 18:01:52 +02:00
J. Nick Koston c1cb889f62 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-08 18:01:52 +02:00
J. Nick Koston 992789ba02 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-08 18:01:52 +02:00
J. Nick Koston 81ec1c999c Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-08 18:01:52 +02:00
J. Nick Koston 16081633dc Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-08 18:01:51 +02:00
J. Nick Koston bcdb87aaf8 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-09-08 18:01:51 +02:00
J. Nick Koston a4a5100942 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-08 18:01:51 +02:00
J. Nick Koston e79ea0aa4b Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-09-08 18:01:50 +02:00
J. Nick Koston bc1c91a5f7 Merge branch 'pch-strict-ci' into host-pch 2026-09-03 23:48:53 +02:00
J. Nick Koston e2229f1a5e Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-03 23:48:53 +02:00
J. Nick Koston f99b95e9a2 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-03 23:48:53 +02:00
J. Nick Koston 2b7f5f0ea9 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-03 23:48:52 +02:00
J. Nick Koston f5859f020b Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-03 23:48:52 +02:00
J. Nick Koston 5184cc1ace Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-03 23:48:52 +02:00
J. Nick Koston a59ab05bc8 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/components/esp8266/__init__.py
2026-09-03 23:48:38 +02:00
J. Nick Koston 71f9c159a8 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-03 23:46:48 +02:00
J. Nick Koston 417e1793c6 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-09-03 23:46:42 +02:00
J. Nick Koston b81d250737 Merge branch 'pch-strict-ci' into host-pch 2026-09-02 11:18:09 +02:00
J. Nick Koston 85b03d9dc1 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-09-02 11:18:09 +02:00
J. Nick Koston 8639526e5f Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-09-02 11:18:08 +02:00
J. Nick Koston 95fd6c42f3 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-09-02 11:18:08 +02:00
J. Nick Koston 42761a66b4 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-09-02 11:18:07 +02:00
J. Nick Koston bbd66c61da Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-09-02 11:18:07 +02:00
J. Nick Koston a5a3163b5d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	tests/script/test_determine_jobs.py
2026-09-02 11:17:59 +02:00
J. Nick Koston e547af259e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-09-02 11:17:14 +02:00
J. Nick Koston 0f05adbb4f Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-09-02 11:17:14 +02:00
J. Nick Koston cdd89dbfed Merge branch 'pch-strict-ci' into host-pch 2026-08-30 14:57:41 -05:00
J. Nick Koston 59367c9c44 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-30 14:57:40 -05:00
J. Nick Koston 2a41f7e2a8 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-30 14:57:40 -05:00
J. Nick Koston 9ef69d1576 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-30 14:57:40 -05:00
J. Nick Koston 4a7bd2d2e9 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-30 14:57:40 -05:00
J. Nick Koston 60a2bdb935 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-30 14:57:39 -05:00
J. Nick Koston 2a860769ce Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-30 14:57:39 -05:00
J. Nick Koston da95a657e1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-30 14:57:39 -05:00
J. Nick Koston ab680c2849 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-08-30 14:57:39 -05:00
J. Nick Koston 150f0a3b6c Merge branch 'pch-strict-ci' into host-pch 2026-08-28 20:52:39 -05:00
J. Nick Koston cf8872344b Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-28 20:52:39 -05:00
J. Nick Koston 6dc37ffe86 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-28 20:52:39 -05:00
J. Nick Koston f528758c8a Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-28 20:52:39 -05:00
J. Nick Koston d1704cabb2 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-28 20:52:39 -05:00
J. Nick Koston de3e4430d3 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-28 20:52:38 -05:00
J. Nick Koston b1d359c4a9 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-28 20:52:38 -05:00
J. Nick Koston f3d6bc89a4 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-28 20:52:38 -05:00
J. Nick Koston 4f653a195a Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-08-28 20:52:38 -05:00
J. Nick Koston 4af285a5a0 Merge branch 'pch-strict-ci' into host-pch 2026-08-28 20:45:04 -05:00
J. Nick Koston e43d2f71f4 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-28 20:45:04 -05:00
J. Nick Koston 741e436d2c Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-28 20:45:04 -05:00
J. Nick Koston 34c54e4dce Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-28 20:45:03 -05:00
J. Nick Koston 0d75e3e028 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-28 20:45:03 -05:00
J. Nick Koston d0a66d26fd Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-28 20:45:03 -05:00
J. Nick Koston 22f4adbb45 Keep espidf-only infra out of the esp8266 native trigger set
The dev merge moved the ESP-IDF trigger constants into clang_tidy_hash;
the esp8266 set keeps its explicit shared-module list with a subset
tripwire against the imported set instead of unioning it wholesale.
2026-08-28 20:44:53 -05:00
J. Nick Koston f2ee227070 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	script/determine-jobs.py
2026-08-28 20:44:18 -05:00
J. Nick Koston ad92a56f07 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-28 20:43:17 -05:00
J. Nick Koston 6cbb9a61a9 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-08-28 20:43:16 -05:00
J. Nick Koston 168d96d9f4 Merge branch 'pch-strict-ci' into host-pch 2026-08-28 20:41:32 -05:00
J. Nick Koston e6dfdc8009 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-28 20:41:32 -05:00
J. Nick Koston 4b43c026f0 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-28 20:41:32 -05:00
J. Nick Koston 0f6309bc92 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-28 20:41:32 -05:00
J. Nick Koston d1b28124bc Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-28 20:41:31 -05:00
J. Nick Koston a817a01097 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-28 20:41:31 -05:00
J. Nick Koston de60f9730e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-28 20:41:31 -05:00
J. Nick Koston e4ca495c4f Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-28 20:41:31 -05:00
J. Nick Koston 77d326a662 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-08-28 20:41:30 -05:00
J. Nick Koston 94fc9ec63a Merge branch 'pch-strict-ci' into host-pch 2026-08-28 13:52:01 -05:00
J. Nick Koston 340ac06699 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-28 13:52:01 -05:00
J. Nick Koston 455b14e10f Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-28 13:52:01 -05:00
J. Nick Koston 9e995377d5 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-28 13:52:01 -05:00
J. Nick Koston ade078a7f6 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-28 13:52:00 -05:00
J. Nick Koston 5f273cef7f Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-28 13:52:00 -05:00
J. Nick Koston 9f3842a0e0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-28 13:52:00 -05:00
J. Nick Koston 36e38125c6 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-28 13:51:59 -05:00
J. Nick Koston 6e8109b99c Merge remote-tracking branch 'origin/dev' into esp8266-native-build-spec 2026-08-28 13:51:59 -05:00
J. Nick Koston e51f711883 Merge branch 'pch-strict-ci' into host-pch 2026-08-28 13:07:06 -05:00
J. Nick Koston ece74ee0d1 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-28 13:07:06 -05:00
J. Nick Koston 7a947cd4c9 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-28 13:07:06 -05:00
J. Nick Koston 40f548a529 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-28 13:07:06 -05:00
J. Nick Koston 7e20e497bd Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-28 13:07:05 -05:00
J. Nick Koston 4137511f81 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-28 13:07:05 -05:00
J. Nick Koston eb1a3bc9e4 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-28 13:07:05 -05:00
J. Nick Koston 0a595aab03 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-28 13:07:05 -05:00
J. Nick Koston 9cefbd1901 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-28 13:07:04 -05:00
J. Nick Koston b1a048e27d Merge remote-tracking branch 'origin/dev' into esp8266-native-library-backend 2026-08-28 13:07:04 -05:00
J. Nick Koston addcb472af Merge branch 'pch-strict-ci' into host-pch 2026-08-27 23:01:19 -05:00
J. Nick Koston 4ecbde8bbc Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-27 23:01:19 -05:00
J. Nick Koston 9794eb9fc2 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-27 23:01:18 -05:00
J. Nick Koston fc41843cd5 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-27 23:01:18 -05:00
J. Nick Koston 0d50b57414 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-27 23:01:18 -05:00
J. Nick Koston 880ffc609d Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-27 23:01:18 -05:00
J. Nick Koston 979aac1cae Silence the framework elf2bin script's SyntaxWarning
The bundled elf2bin.py uses unescaped regex strings that Python 3.12+
flags at compile time; the frozen 3.1.2 framework will never fix it,
so the ninja rule suppresses that category for the one invocation.
2026-08-27 23:01:15 -05:00
J. Nick Koston b5c78a4711 Merge branch 'pch-strict-ci' into host-pch 2026-08-27 15:53:00 -05:00
J. Nick Koston a114147e03 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-27 15:53:00 -05:00
J. Nick Koston 80b592fa16 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-27 15:52:59 -05:00
J. Nick Koston 665f1d46ca Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-27 15:52:59 -05:00
J. Nick Koston 5f97c5756b Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-27 15:52:59 -05:00
J. Nick Koston 95ea16b8c4 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-27 15:52:59 -05:00
J. Nick Koston b29b203ab1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-27 15:52:58 -05:00
J. Nick Koston a928609b72 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-27 15:52:58 -05:00
J. Nick Koston eb44311bb3 Merge remote-tracking branch 'origin/dev' into esp8266-native-library-backend 2026-08-27 15:52:58 -05:00
J. Nick Koston 31470e7997 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-27 15:52:58 -05:00
J. Nick Koston 5bc3102c82 Merge branch 'pch-strict-ci' into host-pch 2026-08-27 14:04:02 -05:00
J. Nick Koston a5e4882196 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-27 14:04:02 -05:00
J. Nick Koston 4f9a02f85a Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-27 14:04:02 -05:00
J. Nick Koston 8f1e581bf6 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-27 14:04:02 -05:00
J. Nick Koston 8f8e6e95d4 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-27 14:04:02 -05:00
J. Nick Koston c817bdd25e Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-27 14:04:02 -05:00
J. Nick Koston 238238e8a1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-27 14:04:01 -05:00
J. Nick Koston 7288a70f96 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-27 14:04:01 -05:00
J. Nick Koston a1576fe28a Merge remote-tracking branch 'origin/dev' into esp8266-native-library-backend 2026-08-27 14:04:01 -05:00
J. Nick Koston 7f77764dbb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-27 14:04:01 -05:00
J. Nick Koston c4c6fe198e Merge branch 'pch-strict-ci' into host-pch 2026-08-27 12:38:39 -05:00
J. Nick Koston 7850fba837 Merge branch 'platformio-pch-libretiny' into pch-strict-ci 2026-08-27 12:38:39 -05:00
J. Nick Koston c2eb877a17 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-27 12:38:32 -05:00
J. Nick Koston 72c670f5f1 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-27 12:38:31 -05:00
J. Nick Koston ecc9248426 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-27 12:38:31 -05:00
J. Nick Koston 9d3a68cd33 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-27 12:38:31 -05:00
J. Nick Koston bb823ba4c0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-27 12:38:24 -05:00
J. Nick Koston 6d4a7e0a48 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-27 12:38:24 -05:00
J. Nick Koston b866a1f4a4 Merge remote-tracking branch 'origin/dev' into esp8266-native-library-backend 2026-08-27 12:38:24 -05:00
J. Nick Koston 1132ec92e8 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-27 12:38:24 -05:00
J. Nick Koston e56edc4af0 Drop the relative-path branch; compile databases record absolute paths 2026-08-27 12:37:01 -05:00
J. Nick Koston c6b1a41e76 Match the pch source TU by resolved path so symlinked build dirs keep the pch 2026-08-27 12:31:53 -05:00
J. Nick Koston 41d68d2978 Merge branch 'pch-strict-ci' into host-pch 2026-08-27 09:40:58 -05:00
J. Nick Koston 59556a730d Keep the parity test hermetic, give touch the shared error contract 2026-08-27 09:40:54 -05:00
J. Nick Koston 7d4e28b5e2 Merge branch 'pch-strict-ci' into host-pch 2026-08-27 09:13:55 -05:00
J. Nick Koston 87cbe42cae Blame the baseline honestly, split sidecar unlinks, pin the script's knob and import branches 2026-08-27 09:13:51 -05:00
J. Nick Koston 8180134d30 Merge branch 'pch-strict-ci' into host-pch 2026-08-27 08:40:39 -05:00
J. Nick Koston 8a5d53899c Simplify: strict knob via parse_enable_env, one probe tail, latch folded into _fail, discard owns its policy 2026-08-27 08:40:35 -05:00
J. Nick Koston 92b71f8ce4 Exclude the prefix wrapper from esphome.h, state the failure-path cost honestly 2026-08-27 08:33:25 -05:00
J. Nick Koston 4605ac08a5 Merge branch 'pch-strict-ci' into host-pch 2026-08-27 08:32:13 -05:00
J. Nick Koston 3e5688d6cd Blame the pch only when a baseline passes, validate the strict knob, abort on an undiscardable stale header 2026-08-27 08:32:01 -05:00
J. Nick Koston 9580fd14da Merge branch 'pch-strict-ci' into host-pch 2026-08-27 00:40:42 -05:00
J. Nick Koston d38542e48b Escalate all strict consumers, keep cached-probe rejections unlatched, drop the dead probe knob 2026-08-27 00:40:37 -05:00
J. Nick Koston 364c530832 Merge branch 'pch-strict-ci' into host-pch 2026-08-27 00:26:00 -05:00
J. Nick Koston c89c2d975d Strict escalates consumer invalid-pch, re-probes cached headers everywhere, and defaults the matrix to strict 2026-08-27 00:25:38 -05:00
J. Nick Koston a0c3a010e4 Guard the prefix for C edges, gate it on the pch knob, pin its resolution 2026-08-27 00:21:14 -05:00
J. Nick Koston fd871b8898 Precompile a curated core-header prefix on host 2026-08-27 00:10:07 -05:00
J. Nick Koston 78eff4f485 Strict re-probes a cached .gch, probe diagnostics get the exit-code fallback, nobuild detection narrows to ImportError 2026-08-26 23:43:09 -05:00
J. Nick Koston 833af674bf Simplify: shared tool-step runner, probe args helper, buildtool touch stamp, knob-spelling parity 2026-08-26 23:20:06 -05:00
J. Nick Koston 15d4f187c7 Bake the probe stamp into the rule text; edge bindings cannot expand $out 2026-08-26 23:10:55 -05:00
J. Nick Koston 21643396c4 Add an esp8266 native-toolchain smoke entry to the strict compile matrix 2026-08-26 23:03:00 -05:00
J. Nick Koston 34daa6138a Probe failures follow the compile branch's transient rules, strict on the native esp8266 job 2026-08-26 23:02:18 -05:00
J. Nick Koston 0266b7f0fb Cover the probe spawn failure and both probe-edge flag branches 2026-08-26 22:55:52 -05:00
J. Nick Koston 5d690104b5 Strict fails on a disabled pch, narrows the projenv exemption, and covers the new funnel sites 2026-08-26 22:51:53 -05:00
J. Nick Koston 4a3b095172 Probe the built .gch on the native paths so strict CI reds on an unloadable pch 2026-08-26 22:47:42 -05:00
J. Nick Koston 54bff55642 Reraise in strict through the IDF flow, funnel the remaining degrade paths, exempt nobuild 2026-08-26 22:42:03 -05:00
J. Nick Koston 264ccc0989 Add ESPHOME_PCH_STRICT and enforce it in the esp8266/esp32/rp2 image compile tests 2026-08-26 22:29:53 -05:00
J. Nick Koston 7449623022 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 22:23:01 -05:00
J. Nick Koston 2eab26052a Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 22:22:58 -05:00
J. Nick Koston 96beeed2c2 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 22:22:55 -05:00
J. Nick Koston 85142b5b99 Pass -MF to the probe only alongside a dependency flag 2026-08-26 22:22:42 -05:00
J. Nick Koston 1e13390b6d Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 22:06:04 -05:00
J. Nick Koston c916e93988 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 22:06:04 -05:00
J. Nick Koston 3ecd4e3e69 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 22:06:04 -05:00
J. Nick Koston a5afa55122 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch
# Conflicts:
#	esphome/platformio/toolchain.py
2026-08-26 22:06:01 -05:00
J. Nick Koston 3439a2d5ca Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-26 22:05:33 -05:00
J. Nick Koston c2f8347eed Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-26 22:05:32 -05:00
J. Nick Koston 6767e43022 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-26 22:05:32 -05:00
J. Nick Koston 178ff2c3ef Merge remote-tracking branch 'origin/dev' into esp8266-native-library-backend 2026-08-26 22:05:10 -05:00
J. Nick Koston 3e3655036b Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 14:23:26 -05:00
J. Nick Koston 58d6aec7fd Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 14:23:23 -05:00
J. Nick Koston c97250508a Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 14:23:20 -05:00
J. Nick Koston 3dd608cffc Use a drive-qualified basedir in the test on Windows 2026-08-26 14:23:16 -05:00
J. Nick Koston 16e4e05d92 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 14:14:08 -05:00
J. Nick Koston 153bfbc47c Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 14:14:05 -05:00
J. Nick Koston 50c9a3a5bb Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 14:14:02 -05:00
J. Nick Koston 1d4d28832e Reject relative CCACHE_BASEDIR values too 2026-08-26 14:13:57 -05:00
J. Nick Koston c5d14b9423 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 13:21:30 -05:00
J. Nick Koston 694741cd6b Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 13:21:28 -05:00
J. Nick Koston 1719e75e57 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 13:21:25 -05:00
J. Nick Koston 26e51c23b1 Hoist is_joined_include, cover the falsy EXTSUM warning 2026-08-26 13:21:21 -05:00
J. Nick Koston c2d1b1c583 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 13:14:22 -05:00
J. Nick Koston 198e4abc5d Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 13:14:17 -05:00
J. Nick Koston 35ab90fc58 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 13:14:11 -05:00
J. Nick Koston 6530bb62f8 Stat-aware local walk, atomic flag+env application, guard degenerate basedir and -include- flags 2026-08-26 13:14:03 -05:00
J. Nick Koston 77fc8af9f0 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 11:59:22 -05:00
J. Nick Koston b8675a4b56 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 11:59:18 -05:00
J. Nick Koston b497ff17a7 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 11:58:36 -05:00
J. Nick Koston 3730f7bbae Distinguish stat failure from absence, fail closed on unmodelable flags and unreadable local headers 2026-08-26 11:58:20 -05:00
J. Nick Koston f4199a7510 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 10:44:37 -05:00
J. Nick Koston c7f0e17409 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 10:44:35 -05:00
J. Nick Koston 0ba8e3d83e Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 10:44:32 -05:00
J. Nick Koston d0263b0bef Mirror the joined -include fold, harden the probe, fail closed on unreadable closure headers 2026-08-26 10:44:17 -05:00
J. Nick Koston c6d056b240 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 10:03:33 -05:00
J. Nick Koston ca81777eba Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 10:03:31 -05:00
J. Nick Koston 68f2dc3219 Gate the ccache sloppiness on emission for the IDF backend too 2026-08-26 10:03:26 -05:00
J. Nick Koston c7fb26a6d1 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 10:01:27 -05:00
J. Nick Koston 410a3868ea Gate the ccache sloppiness on the pch actually being emitted 2026-08-26 10:00:59 -05:00
J. Nick Koston f665ecf977 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 09:58:06 -05:00
J. Nick Koston 5e95306bcc Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 09:58:02 -05:00
J. Nick Koston c813fe8e35 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 09:57:59 -05:00
J. Nick Koston a69f2c8f66 Fold the joined src force-include spelling, export ccache settings after the flags land 2026-08-26 09:57:44 -05:00
J. Nick Koston c025b875d1 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 09:34:43 -05:00
J. Nick Koston 6a5a092f03 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 09:34:41 -05:00
J. Nick Koston c10fb88430 Trim comments to repo standard 2026-08-26 09:34:37 -05:00
J. Nick Koston 5be8ad98e8 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 09:33:15 -05:00
J. Nick Koston c9b4086a92 Trim comments and docstrings to repo standard 2026-08-26 09:33:06 -05:00
J. Nick Koston 639e1c2fdf Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 09:08:08 -05:00
J. Nick Koston 6722ec22ab Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 09:08:05 -05:00
J. Nick Koston 3d35a111ac Pin the compile locale in the generic pch flow too 2026-08-26 09:08:02 -05:00
J. Nick Koston a07bdf3a03 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 09:07:56 -05:00
J. Nick Koston 397ae10c55 Demote invalid-pch on PlatformIO too, pin the compile locale, document the .sum invariant 2026-08-26 09:07:38 -05:00
J. Nick Koston e2446cad8f Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 08:40:41 -05:00
J. Nick Koston 404cf7b728 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 08:40:38 -05:00
J. Nick Koston 987da8f5c4 Treat resource exhaustion as transient in the generic pch flow too 2026-08-26 08:40:35 -05:00
J. Nick Koston c9963881ba Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 08:39:47 -05:00
J. Nick Koston 7417dcdd7b Demote invalid-pch under user -Werror, catch the joined -include spelling, treat resource exhaustion as transient 2026-08-26 08:39:27 -05:00
J. Nick Koston 2a7245ac79 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 00:46:51 -05:00
J. Nick Koston 1ca8b7066c Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 00:46:48 -05:00
J. Nick Koston e13aa8b775 Read the pch sidecars defensively in the generic flow too 2026-08-26 00:46:45 -05:00
J. Nick Koston 3a483e3284 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 00:46:31 -05:00
J. Nick Koston f5593deb38 Warn and skip the pch when a user -include precedes it, walk angle includes, read sidecars defensively 2026-08-26 00:46:14 -05:00
J. Nick Koston 0fea10f263 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-26 00:06:44 -05:00
J. Nick Koston f8f12b3a5d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-26 00:06:43 -05:00
J. Nick Koston 187199e9b3 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-26 00:06:43 -05:00
J. Nick Koston fb5a042dfe Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-26 00:06:43 -05:00
J. Nick Koston 85dd29f7e0 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-26 00:06:43 -05:00
J. Nick Koston 21896b057f Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-26 00:06:42 -05:00
J. Nick Koston d651573a20 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-26 00:06:42 -05:00
J. Nick Koston 0e404ba2b4 Update ar prose to match the rcs/qs ops 2026-08-26 00:06:28 -05:00
J. Nick Koston a892f47f89 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 23:42:31 -05:00
J. Nick Koston 9fa031f134 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 23:42:31 -05:00
J. Nick Koston c9044bb860 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 23:42:30 -05:00
J. Nick Koston b255e77e76 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 23:42:30 -05:00
J. Nick Koston c2767c096c Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 23:42:30 -05:00
J. Nick Koston c86b038dc1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 23:42:30 -05:00
J. Nick Koston 79a72efee7 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 23:42:30 -05:00
J. Nick Koston 21fd74b201 Tighten the review-round edges
Only IncompatiblePlatform counts as a knowing skip; other malformed
manifest data stays out of the satisfied set so the reconciliation can
still flag a broken promise. Backend-provided names are recorded before
the manifest-name evidence so the overlap warns once, in the backend's
own suppression loop. ar runs rcs/qs so the symbol index is explicit,
and the copy shim prints and returns 1 like its siblings instead of
re-raising.
2026-08-25 23:42:13 -05:00
J. Nick Koston bffbc6dce5 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 23:16:53 -05:00
J. Nick Koston ba9131324a Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 23:16:53 -05:00
J. Nick Koston 5ab40084c9 Merge remote-tracking branch 'origin/platformio-pch-libretiny' into platformio-pch-libretiny 2026-08-25 23:16:53 -05:00
J. Nick Koston 82b9575b6f Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 23:16:52 -05:00
J. Nick Koston 55f1122eba Merge remote-tracking branch 'origin/esp8266-native-pch' into esp8266-native-pch 2026-08-25 23:16:52 -05:00
J. Nick Koston 6223ecda32 Merge remote-tracking branch 'origin/platformio-pch-rp2' into platformio-pch-rp2 2026-08-25 23:16:52 -05:00
J. Nick Koston 5bd7884ac1 Merge remote-tracking branch 'origin/esp32-idf-pch' into esp32-idf-pch 2026-08-25 23:16:52 -05:00
J. Nick Koston c1c78ebf18 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 23:16:33 -05:00
J. Nick Koston dd05cdd2f8 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 23:16:33 -05:00
J. Nick Koston cfcbf5b420 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 23:16:33 -05:00
J. Nick Koston fb640bdc47 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 23:16:32 -05:00
J. Nick Koston 7aa90fc4c4 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 23:16:32 -05:00
J. Nick Koston a75d6768ab Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 23:16:32 -05:00
J. Nick Koston 20e5b23b86 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 23:16:32 -05:00
J. Nick Koston b957fb0712 Keep the missing-manifest diagnostic at debug
The legacy manifest-less layout is legal and the 3.1.2 core ships one
such library (FSTools), so the warning would be unactionable noise; a
test now pins the level.
2026-08-25 23:16:18 -05:00
J. Nick Koston 80206fd232 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 23:03:16 -05:00
J. Nick Koston e18bcc74f3 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 23:03:13 -05:00
J. Nick Koston 40f74815f0 Widen the identity-unknown guard to UnicodeError in the generic prepare_pch 2026-08-25 23:03:11 -05:00
J. Nick Koston eb28f2630a Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 23:02:56 -05:00
J. Nick Koston 10204c6bd9 Surrogateescape the digest extras, keep absolute force-includes consumer-only 2026-08-25 23:02:43 -05:00
J. Nick Koston 5b53eb9f6c Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 22:55:24 -05:00
J. Nick Koston 0768a1c8cf Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 22:55:24 -05:00
J. Nick Koston 32c1125116 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 22:55:24 -05:00
J. Nick Koston 8e5d72a133 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 22:55:24 -05:00
J. Nick Koston ccaec42798 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 22:55:23 -05:00
J. Nick Koston 5755e47101 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 22:55:23 -05:00
J. Nick Koston 15b9f3897b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 22:55:23 -05:00
J. Nick Koston aa87ab6d0d Warn when a bundled library has no manifest
Core libraries all ship one, so an absent manifest most likely means a
torn framework extraction; at debug the miscompile risk was invisible.
2026-08-25 22:55:21 -05:00
J. Nick Koston 5cd9e77f3d Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 22:53:03 -05:00
J. Nick Koston 5a05184ee3 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 22:53:03 -05:00
J. Nick Koston a9284c7d4b Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 22:53:03 -05:00
J. Nick Koston 5a1f3a382d Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 22:53:02 -05:00
J. Nick Koston 813008200c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 22:53:02 -05:00
J. Nick Koston f217ab18d2 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 22:53:02 -05:00
J. Nick Koston ce909f68b3 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 22:53:02 -05:00
J. Nick Koston 3fa4d478e5 Fail by name on a corrupt bundled manifest; name the recording side effect
A truncated bundled library.json now raises the module's named error
with the clean-all hint instead of a raw JSONDecodeError. The renamed
_reconcile_versionless_skips advertises that it records into
backend.provided_requests. Two real-converter tests gain the
registry-guard patch their siblings use so a regression fails offline.
2026-08-25 22:52:39 -05:00
J. Nick Koston 53a3501bdc Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 22:40:46 -05:00
J. Nick Koston bcdefa873b Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 22:40:46 -05:00
J. Nick Koston 6c86c02769 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 22:40:46 -05:00
J. Nick Koston 83eede0d9d Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 22:40:46 -05:00
J. Nick Koston 32c3bf7f15 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 22:40:46 -05:00
J. Nick Koston f21310d517 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 22:40:45 -05:00
J. Nick Koston 3b77d812a3 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 22:40:45 -05:00
J. Nick Koston 112868414e Keep per-file resolve(): srcFilter patterns may escape src_dir 2026-08-25 22:40:14 -05:00
J. Nick Koston 9304661da3 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 22:39:45 -05:00
J. Nick Koston fe95bd2d0c Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 22:39:45 -05:00
J. Nick Koston 2a45a21ad3 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 22:39:45 -05:00
J. Nick Koston df8fb0fb49 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 22:39:45 -05:00
J. Nick Koston 1895bef123 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 22:39:44 -05:00
J. Nick Koston e18e8deded Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 22:39:44 -05:00
J. Nick Koston de1bb32262 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 22:39:44 -05:00
J. Nick Koston 2497e1aa94 Simplify the library backend after review
Rely on normalize_dependencies' guarantee of a non-empty string name
instead of re-checking it, collect sources in a single pass that
re-roots on the resolved directory rather than calling realpath per
file, probe library.properties once, hoist the invariant log-level
choice out of the warning loop, and record provided_requests as a set
since order was never used.
2026-08-25 22:39:40 -05:00
J. Nick Koston 85d49bd940 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 22:29:40 -05:00
J. Nick Koston 36062184a1 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 22:29:40 -05:00
J. Nick Koston 2864ea8c9a Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 22:29:40 -05:00
J. Nick Koston bf849f441f Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 22:29:40 -05:00
J. Nick Koston 97bf416a2b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 22:29:39 -05:00
J. Nick Koston d3d81f593b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 22:29:39 -05:00
J. Nick Koston 5d57bb7781 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 22:29:39 -05:00
J. Nick Koston fbb13f6fc9 Trim comments to repo standard 2026-08-25 22:29:35 -05:00
J. Nick Koston 5f81a04086 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 22:23:08 -05:00
J. Nick Koston ac176636db Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 22:23:08 -05:00
J. Nick Koston aebcc71201 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 22:23:07 -05:00
J. Nick Koston fc654c4c63 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 22:23:07 -05:00
J. Nick Koston 204cec24a1 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 22:23:07 -05:00
J. Nick Koston d87e666f02 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 22:23:07 -05:00
J. Nick Koston 2c67bb965a Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 22:23:06 -05:00
J. Nick Koston 6cdc34178d Reconcile provides() promises against the final manifests only
The walk records across re-resolutions, so a dependency a re-resolved
manifest no longer declares would have failed the build by name. The
reconciliation now intersects the recordings with the dependency names
of the manifests actually emitted, keeping the raise for real broken
promises. The manifest-name warning also gains the treeless-backend
gate its sibling got, since those backends cannot act on it either.
2026-08-25 22:22:48 -05:00
J. Nick Koston 68ba1b9a7f Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 22:04:06 -05:00
J. Nick Koston 63e6f9bf70 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 22:04:06 -05:00
J. Nick Koston daccadca3f Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 22:04:06 -05:00
J. Nick Koston 3e9b6b0355 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 22:04:06 -05:00
J. Nick Koston 5b2670ea4f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 22:04:05 -05:00
J. Nick Koston 706e3a1a39 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 22:04:05 -05:00
J. Nick Koston 853abc20ad Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 22:04:05 -05:00
J. Nick Koston bdbdaa7ddc Reconcile version-less provides() skips and quiet the drop warning for treeless backends
A version-less dependency the walk skips on the backend's promise is now
recorded like the versioned path, and a bundled candidate the backend
knowingly skips through the platform filter counts as satisfied, so the
post-emit reconciliation covers both paths without raising on legitimate
builds. The manifest-name warning deduplicates like its sibling, the
final drop warning stays at debug for backends without provides() since
they can never supply a bundled name, and a bundled library missing both
manifests leaves a debug trace instead of silently building on defaults.
2026-08-25 22:03:47 -05:00
J. Nick Koston f4a5671445 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 21:45:12 -05:00
J. Nick Koston 2beabb2ca3 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 21:45:09 -05:00
J. Nick Koston d2c2414425 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 21:45:06 -05:00
J. Nick Koston 5a8e6761cb Fold only src-resolvable force-includes, surrogateescape the digest names, harden flag lexing and failure reporting 2026-08-25 21:44:52 -05:00
J. Nick Koston c6f21e2447 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 21:33:57 -05:00
J. Nick Koston 06556ceac5 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 21:33:56 -05:00
J. Nick Koston 9be7585000 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 21:33:56 -05:00
J. Nick Koston b253f32788 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 21:33:56 -05:00
J. Nick Koston 9db1835c40 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 21:33:56 -05:00
J. Nick Koston fc23fe5229 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 21:33:55 -05:00
J. Nick Koston 2e95fcf037 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 21:33:55 -05:00
J. Nick Koston d1845fcded Route extra-script link flags and fail loudly on an unfulfilled provides() promise
Extra-script LINKFLAGS travel outside build.flags by design; the backend
now drains them into the library's link flags, matching the ESP-IDF
backend, instead of dropping a link-stage input silently. An unfulfilled
provides() promise raises by name (deduplicated) like the module's other
can-never-link checks, the vacuous end-to-end silence test is replaced
by a link-flags test that can fail, and a version-less dependency
assumed satisfied by manifest name alone warns like its backend twin
since the match is name-only evidence.
2026-08-25 21:33:38 -05:00
J. Nick Koston 80c9ccd657 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 20:56:19 -05:00
J. Nick Koston c405d94f45 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 20:56:16 -05:00
J. Nick Koston f4003969ba Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 20:56:13 -05:00
J. Nick Koston 73cc3af130 Union sloppiness tokens on the PlatformIO path too, survive non-UTF-8 include names 2026-08-25 20:56:00 -05:00
J. Nick Koston 0194e2349c Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 20:48:39 -05:00
J. Nick Koston cf2ddde04c Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 20:48:37 -05:00
J. Nick Koston 365dcba506 Skip compile-DB entries with null fields instead of raising 2026-08-25 20:48:28 -05:00
J. Nick Koston 565ffad6f4 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 20:43:51 -05:00
J. Nick Koston 2145f50bb5 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 20:43:48 -05:00
J. Nick Koston a7e4cf536b Drop duplicate ccache test, keep full compiler output at debug, guard empty compile-DB directory 2026-08-25 20:43:37 -05:00
J. Nick Koston 62f8451831 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 20:40:38 -05:00
J. Nick Koston 120ac5e516 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 20:40:35 -05:00
J. Nick Koston eaa63e2695 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 20:40:32 -05:00
J. Nick Koston 6aa5540ff8 Cite esphome#8693 for the intended Arduino.h visibility 2026-08-25 20:40:20 -05:00
J. Nick Koston 259824d13d Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 20:26:29 -05:00
J. Nick Koston daf273b650 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 20:26:29 -05:00
J. Nick Koston faa93cc6e9 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 20:26:29 -05:00
J. Nick Koston 2e7aa4d534 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 20:26:28 -05:00
J. Nick Koston 26d7a75352 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 20:26:28 -05:00
J. Nick Koston 21febc49a2 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 20:26:28 -05:00
J. Nick Koston b5dd3d00b8 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 20:26:28 -05:00
J. Nick Koston 44d627f781 Merge remote-tracking branch 'origin/dev' into esp8266-native-library-backend 2026-08-25 20:26:27 -05:00
J. Nick Koston 90c804886d Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 20:00:39 -05:00
J. Nick Koston e6e738775b Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 20:00:37 -05:00
J. Nick Koston 791020f778 Merge follow-through: discard the pch when its identity cannot be established 2026-08-25 20:00:27 -05:00
J. Nick Koston 0c5cad19dc Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 19:59:34 -05:00
J. Nick Koston c419fc4bbc Skip the pch when a header identity is unknown, union missing sloppiness tokens, report projenv import failures 2026-08-25 19:59:25 -05:00
J. Nick Koston c15bafacfb Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 19:24:00 -05:00
J. Nick Koston 7bd2dd944c Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 19:23:58 -05:00
J. Nick Koston 84028e787a Log the pch line only when true, fail closed on unreadable sdkconfig, treat signal-killed compiles as transient 2026-08-25 19:23:49 -05:00
J. Nick Koston 5d745f0605 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 19:08:39 -05:00
J. Nick Koston 5672302b01 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 19:08:37 -05:00
J. Nick Koston 9faddeb0bc Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 19:08:34 -05:00
J. Nick Koston 9636717b32 Warn on unresolvable force-includes and pch_defines-less sloppiness, vary the unreadable marker 2026-08-25 19:08:21 -05:00
J. Nick Koston e25ffaf017 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 18:55:03 -05:00
J. Nick Koston 80b62ceacc Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 18:55:00 -05:00
J. Nick Koston 81bca96e1b Run the gch compile from its resolution dir, self-clean when disabled, log the opt-out hint, pin the knob in tests 2026-08-25 18:54:48 -05:00
J. Nick Koston 256457384c Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 18:20:37 -05:00
J. Nick Koston e5c6720063 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 18:20:36 -05:00
J. Nick Koston 4dc10199b9 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 18:20:36 -05:00
J. Nick Koston d5609f8dc6 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 18:20:36 -05:00
J. Nick Koston a4dd668e69 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 18:20:36 -05:00
J. Nick Koston 5b92b381c3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 18:20:35 -05:00
J. Nick Koston ccfe3dc379 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 18:20:35 -05:00
J. Nick Koston f1ccff4aa7 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 18:20:35 -05:00
J. Nick Koston 260f9d8763 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 18:20:35 -05:00
J. Nick Koston dcb73e7300 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-infra 2026-08-25 18:20:34 -05:00
J. Nick Koston d08bb3992a Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 18:19:27 -05:00
J. Nick Koston 8197fcd5a1 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 18:19:27 -05:00
J. Nick Koston 85520f520e Merge remote-tracking branch 'origin/platformio-pch-libretiny' into platformio-pch-libretiny 2026-08-25 18:19:27 -05:00
J. Nick Koston 2dd850b990 Merge remote-tracking branch 'origin/platformio-pch-rp2' into platformio-pch-rp2 2026-08-25 18:19:27 -05:00
J. Nick Koston aee60fa48a Merge remote-tracking branch 'origin/esp8266-native-pch' into esp8266-native-pch 2026-08-25 18:19:26 -05:00
J. Nick Koston d0bbd40e3b Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 18:19:26 -05:00
J. Nick Koston 7c9e7a807d Merge remote-tracking branch 'origin/esp32-idf-pch' into esp32-idf-pch 2026-08-25 18:19:26 -05:00
J. Nick Koston b11b60dd86 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 18:18:24 -05:00
J. Nick Koston efeb608725 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 18:18:24 -05:00
J. Nick Koston 7cc53d90bd Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 18:18:23 -05:00
J. Nick Koston 7b7acf7656 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 18:18:23 -05:00
J. Nick Koston bbd3e60d5b Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 18:18:23 -05:00
J. Nick Koston e8a8226bac Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 18:18:22 -05:00
J. Nick Koston e41c4c0a99 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 18:18:22 -05:00
J. Nick Koston 9a38acaa00 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 18:18:22 -05:00
J. Nick Koston d79d713edc Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 18:18:21 -05:00
J. Nick Koston 425b3e4795 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-infra 2026-08-25 18:17:23 -05:00
J. Nick Koston 600dab7185 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 18:13:33 -05:00
J. Nick Koston 609d9dfab3 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 18:13:31 -05:00
J. Nick Koston 8118575491 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 18:13:29 -05:00
J. Nick Koston 1b54d1b5b0 Survive -t nobuild, skip library trees in the local include digest, drop the false ENV scoping claim 2026-08-25 18:13:15 -05:00
J. Nick Koston a28086547f Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 18:05:34 -05:00
J. Nick Koston 0cdd654cc6 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 18:05:31 -05:00
J. Nick Koston 3e2dc30c06 Move the curated header list to build_helpers as PCH_DEFAULT_HEADERS 2026-08-25 18:05:23 -05:00
J. Nick Koston a400753d96 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 18:03:02 -05:00
J. Nick Koston 0f5050a617 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 18:03:00 -05:00
J. Nick Koston 7387211cf1 Move the generic pch build machinery into build_helpers/pch.py 2026-08-25 18:02:51 -05:00
J. Nick Koston 4819f986bc Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 17:58:31 -05:00
J. Nick Koston 904083d531 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 17:58:29 -05:00
J. Nick Koston 2a41892559 Simplify: reuse discard_pch, effective_ccache_basedir, and idedata's C++ suffixes 2026-08-25 17:58:05 -05:00
J. Nick Koston e1eff7447d Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 17:58:05 -05:00
J. Nick Koston b6c1552bcb Simplify: shared artifact names, one cxx override param, extracted gch compile, transient spawn semantics in the script 2026-08-25 17:56:23 -05:00
J. Nick Koston d8255cbece Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 17:48:14 -05:00
J. Nick Koston 6175ff24fe Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 17:48:12 -05:00
J. Nick Koston 1059ecf50c Fold header order into pch checksum, gate rebuild-forcing touch, guard malformed compile DBs 2026-08-25 17:48:01 -05:00
J. Nick Koston c5c7b598c9 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 17:45:02 -05:00
J. Nick Koston 564f3e31c1 Harden idedata -include anchoring, probe exit check, package identity, and failure diagnostics 2026-08-25 17:44:54 -05:00
J. Nick Koston 10a81076b2 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 16:20:46 -05:00
J. Nick Koston 9a2644e6e6 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 16:20:43 -05:00
J. Nick Koston 743f1dcb09 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 16:20:06 -05:00
J. Nick Koston a4a8c77151 Resolve idedata force-include paths, test probe rejection and env scoping, derive clean names 2026-08-25 16:19:29 -05:00
J. Nick Koston ceac527259 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 15:54:05 -05:00
J. Nick Koston 0908d1d3c6 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 15:54:02 -05:00
J. Nick Koston 278abf2771 Treat pch spawn errors as transient, keep user force-includes, fold command into checksum 2026-08-25 15:53:54 -05:00
J. Nick Koston 408dcd353a Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 15:44:03 -05:00
J. Nick Koston ca9500b5a8 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 15:44:03 -05:00
J. Nick Koston b25e30c0b7 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 15:44:02 -05:00
J. Nick Koston c1dfecf964 Cover the partial-clean pch artifact removal 2026-08-25 15:43:18 -05:00
J. Nick Koston cce6f71076 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 15:38:05 -05:00
J. Nick Koston 36790f78ab Merge branch 'platformio-pch-libretiny' of https://github.com/esphome/esphome into platformio-pch-libretiny 2026-08-25 15:38:04 -05:00
J. Nick Koston f215e3f45b Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 15:38:03 -05:00
J. Nick Koston fcaf17dafa Merge branch 'platformio-pch-rp2' of https://github.com/esphome/esphome into platformio-pch-rp2 2026-08-25 15:38:03 -05:00
J. Nick Koston 76ed94fe28 Merge branch 'esp32-idf-pch' of https://github.com/esphome/esphome into esp32-idf-pch 2026-08-25 15:38:02 -05:00
J. Nick Koston be60eca212 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 15:37:16 -05:00
J. Nick Koston b24bfa7552 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 15:37:16 -05:00
J. Nick Koston 1b325a66ce Warn when a consumer ignores the precompiled header 2026-08-25 15:37:15 -05:00
J. Nick Koston 273e5f22db Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 15:37:03 -05:00
J. Nick Koston d08c524f19 Harden the pch script for Windows paths and make ignored pchs visible 2026-08-25 15:36:41 -05:00
pre-commit-ci-lite[bot] f198964bc5 apply automatic formatting fixes 2026-08-25 20:32:46 +00:00
pre-commit-ci-lite[bot] 6431f6da35 apply automatic formatting fixes 2026-08-25 20:32:42 +00:00
pre-commit-ci-lite[bot] 4c26f23e76 apply automatic formatting fixes 2026-08-25 20:32:17 +00:00
pre-commit-ci-lite[bot] 18eb05177b apply automatic formatting fixes 2026-08-25 20:30:53 +00:00
J. Nick Koston f438e5a19a Merge branch 'platformio-pch-libretiny' of https://github.com/esphome/esphome into platformio-pch-libretiny 2026-08-25 15:29:59 -05:00
J. Nick Koston 92233e0ff2 Merge branch 'platformio-pch-rp2' of https://github.com/esphome/esphome into platformio-pch-rp2 2026-08-25 15:29:58 -05:00
J. Nick Koston 702da28c9c Merge branch 'esp32-idf-pch' of https://github.com/esphome/esphome into esp32-idf-pch 2026-08-25 15:29:58 -05:00
J. Nick Koston 8421fe0170 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 15:29:16 -05:00
J. Nick Koston 91eb7f2f7c Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 15:29:16 -05:00
J. Nick Koston 88bcb7ff03 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 15:29:16 -05:00
J. Nick Koston 009e28998d Merge branch 'esp8266-native-pch' into platformio-pch-libretiny 2026-08-25 15:28:36 -05:00
J. Nick Koston c50a1a068c Merge branch 'esp8266-native-pch' of https://github.com/esphome/esphome into esp8266-native-pch 2026-08-25 15:28:04 -05:00
J. Nick Koston dc45cd4d3f Probe that the toolchain can load the gch before enabling the pch 2026-08-25 15:27:53 -05:00
J. Nick Koston e52af0dfa8 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 15:17:14 -05:00
J. Nick Koston 250c5bf606 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 15:17:14 -05:00
J. Nick Koston 649727fcfb Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 15:17:14 -05:00
J. Nick Koston 6c98f2a177 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 15:17:13 -05:00
J. Nick Koston bf573413c4 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 15:17:13 -05:00
J. Nick Koston c6217235e3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 15:17:13 -05:00
J. Nick Koston fa571f2881 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 15:17:12 -05:00
J. Nick Koston 26aac6619c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 15:17:12 -05:00
J. Nick Koston 659ad9fe13 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 15:17:12 -05:00
J. Nick Koston da046a9886 Assert the forced-on working-ccache case emits no warning at all
The 'Not decoded' escape hatch could only mask a regression; assert the
captured records directly instead.
2026-08-25 15:16:54 -05:00
pre-commit-ci-lite[bot] f5fd82bc42 apply automatic formatting fixes 2026-08-25 20:08:23 +00:00
J. Nick Koston 958ea20cc4 Use the shared pch registration helper 2026-08-25 15:06:29 -05:00
J. Nick Koston 243b8a871c Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 15:05:58 -05:00
J. Nick Koston 352129e77e Use the shared pch registration helper 2026-08-25 15:05:44 -05:00
J. Nick Koston e0a7347f41 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 15:05:10 -05:00
J. Nick Koston ce37667b1d Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 15:05:08 -05:00
J. Nick Koston fae9eb0dd2 Hash project-local include dirs into the pch checksum and share the registration gate 2026-08-25 15:04:55 -05:00
J. Nick Koston 0007dfab70 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 14:38:16 -05:00
J. Nick Koston 52176c4d59 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 14:38:16 -05:00
J. Nick Koston aa6e3f74fd Add the OBJECT_DEPENDS edge so a rebuilt gch recompiles its consumers 2026-08-25 14:38:04 -05:00
J. Nick Koston e0662b1551 Merge branch 'platformio-pch-rp2' into platformio-pch-libretiny 2026-08-25 14:29:11 -05:00
J. Nick Koston 61009e1162 Merge branch 'esp32-idf-pch' into platformio-pch-rp2 2026-08-25 14:29:10 -05:00
J. Nick Koston 078e918bdb Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 14:29:10 -05:00
J. Nick Koston 6ab93051b7 Address review: order-covering checksum, loud degraded states, script tests 2026-08-25 14:28:57 -05:00
J. Nick Koston d5c044c7b3 [libretiny] Enable the PlatformIO precompiled header 2026-08-25 14:23:14 -05:00
J. Nick Koston 94b02b46f4 [rp2] Enable the PlatformIO precompiled header 2026-08-25 14:23:14 -05:00
J. Nick Koston d081632c53 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 14:21:46 -05:00
J. Nick Koston 04648a8044 Merge branch 'esp32-idf-pch' of https://github.com/esphome/esphome into esp32-idf-pch 2026-08-25 14:18:56 -05:00
J. Nick Koston 21c9dd33e0 Use native separators in the pch test fixture paths 2026-08-25 14:18:46 -05:00
J. Nick Koston 7d91938b79 Reconstruct compiler argv per SCons element for the gch compile 2026-08-25 14:16:04 -05:00
J. Nick Koston ed59080f62 Tokenize SCons flags per element so spaced defines survive 2026-08-25 14:09:22 -05:00
J. Nick Koston d3f6cbe14a Patch the direct ccache probe in the usable-binary test 2026-08-25 14:06:32 -05:00
J. Nick Koston a63c5b3680 Merge branch 'esp8266-native-pch' of https://github.com/esphome/esphome into esp8266-native-pch 2026-08-25 14:04:38 -05:00
J. Nick Koston a6c4c46930 Merge branch 'esp8266-native-pch' into esp32-idf-pch
# Conflicts:
#	esphome/espidf/framework.py
2026-08-25 14:04:35 -05:00
J. Nick Koston 558acf6900 Make the PlatformIO pch script platform-agnostic 2026-08-25 14:04:29 -05:00
J. Nick Koston 32e11a95cb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 14:04:02 -05:00
J. Nick Koston 911b4afa08 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 14:04:02 -05:00
J. Nick Koston 1cb86be73d Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 14:04:02 -05:00
J. Nick Koston 2afec3db14 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 14:04:01 -05:00
J. Nick Koston 6cfff58f53 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 14:04:01 -05:00
J. Nick Koston ac458608fd Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 14:04:01 -05:00
J. Nick Koston 95ea7b954c Probe forced-on ccache directly so the warnings cannot contradict, carry the traceback on unexpected prefetch failures 2026-08-25 14:03:44 -05:00
J. Nick Koston 337ecfb8f9 Select the pch TU by source path, expand response files, and key the failure marker on the command 2026-08-25 13:58:34 -05:00
J. Nick Koston b08615f92f Merge remote-tracking branch 'origin/esp32-idf-pch' into esp32-idf-pch 2026-08-25 13:50:13 -05:00
J. Nick Koston 8625e02b8e Cover the remaining pch branches 2026-08-25 13:50:01 -05:00
J. Nick Koston f2204d155a Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 13:46:35 -05:00
J. Nick Koston f18b182606 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 13:46:34 -05:00
J. Nick Koston 43c389e1fa Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 13:46:34 -05:00
J. Nick Koston f4808e291e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 13:46:34 -05:00
J. Nick Koston cc605b1cfe Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 13:46:34 -05:00
J. Nick Koston 0239475b78 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 13:46:34 -05:00
J. Nick Koston 7d6e562bf5 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 13:46:33 -05:00
J. Nick Koston 465222a372 Cover the forced-on working-ccache path, pin both marker-probe arms 2026-08-25 13:46:16 -05:00
J. Nick Koston d46518d890 Cover the pch compile-command and failure paths 2026-08-25 13:45:43 -05:00
J. Nick Koston f866f878de Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 13:44:47 -05:00
J. Nick Koston 7f6a007d27 Add direct tests for the shared pch helpers 2026-08-25 13:44:24 -05:00
J. Nick Koston 59fc8dd2bb Merge remote-tracking branch 'origin/esp32-idf-pch' into esp32-idf-pch 2026-08-25 13:39:50 -05:00
J. Nick Koston 149d4d24a1 Merge branch 'esp8266-native-pch' into esp32-idf-pch 2026-08-25 13:39:50 -05:00
J. Nick Koston 0e54f66e78 Merge remote-tracking branch 'origin/esp8266-native-pch' into esp8266-native-pch 2026-08-25 13:39:49 -05:00
J. Nick Koston 35104faaba Merge branch 'esp8266-native-pch' into esp32-idf-pch
# Conflicts:
#	esphome/espidf/framework.py
2026-08-25 13:38:03 -05:00
J. Nick Koston c27f97b8f9 [esp32] Precompile the shared core headers for src compiles 2026-08-25 13:37:42 -05:00
J. Nick Koston de7f622983 Merge branch 'esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 13:37:27 -05:00
J. Nick Koston 986c0563b2 Merge remote-tracking branch 'origin/esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 13:36:15 -05:00
J. Nick Koston 6c15897d26 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 13:34:52 -05:00
J. Nick Koston 6a39f1509f Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 13:34:52 -05:00
J. Nick Koston 0868e0839d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 13:34:51 -05:00
J. Nick Koston 43d0dd04e7 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 13:34:51 -05:00
J. Nick Koston b942c00be9 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 13:34:51 -05:00
J. Nick Koston a3194aa0f2 Split the forced-on ccache warning by cause, cover the marker re-check 2026-08-25 13:34:29 -05:00
J. Nick Koston 71cf6049aa [esp32] Precompile the shared core headers for src compiles 2026-08-25 13:33:56 -05:00
J. Nick Koston 2f1d21191e Merge remote-tracking branch 'origin/esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 13:32:52 -05:00
J. Nick Koston 83a2f78075 Walk the include closure in the pch checksum and honor a user CCACHE_BASEDIR 2026-08-25 13:32:17 -05:00
J. Nick Koston e090311ac2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 13:21:58 -05:00
J. Nick Koston 5e743ee301 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 13:21:58 -05:00
J. Nick Koston 519bc0ceb1 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 13:21:58 -05:00
J. Nick Koston 29ad72f897 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 13:21:57 -05:00
J. Nick Koston 84e1e0fb23 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer
# Conflicts:
#	tests/unit_tests/test_writer.py
2026-08-25 13:21:41 -05:00
J. Nick Koston 7f2851f283 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-25 13:20:50 -05:00
J. Nick Koston 57711a0721 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-25 13:20:50 -05:00
J. Nick Koston 1e9499d87d Merge remote-tracking branch 'origin/dev' into esp8266-native-build-surgery 2026-08-25 13:20:50 -05:00
J. Nick Koston 9caeb948f3 Warn when forced-on ccache has no usable binary, skip freshly installed dests in the prefetch, derive the clean-all sandbox from the cache registry 2026-08-25 13:20:30 -05:00
J. Nick Koston aaf76710a9 Merge remote-tracking branch 'origin/esp8266-arduino-toolchain' into esp8266-native-pch 2026-08-25 13:16:51 -05:00
J. Nick Koston 2665a4fa12 [esp8266] Precompile the shared prefix header for src compiles 2026-08-25 13:16:51 -05:00
J. Nick Koston d77be85afa Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 12:49:56 -05:00
J. Nick Koston 41f97a16db Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 12:49:56 -05:00
J. Nick Koston 09da94862f Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 12:49:55 -05:00
J. Nick Koston 61f15df4d3 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 12:49:55 -05:00
J. Nick Koston 83b5d67e3c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 12:49:55 -05:00
J. Nick Koston eb37f8efbe Fetch registry metadata through the consolidated HTTP path 2026-08-25 12:49:40 -05:00
J. Nick Koston dccd4e91d2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 12:39:03 -05:00
J. Nick Koston d018f5a720 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 12:39:03 -05:00
J. Nick Koston 5aea104907 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 12:39:03 -05:00
J. Nick Koston b6e9845f27 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-25 12:39:02 -05:00
J. Nick Koston e52bfe31f2 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 12:39:02 -05:00
J. Nick Koston 64dd23a705 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 12:39:02 -05:00
J. Nick Koston ed369ae353 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-25 12:39:02 -05:00
J. Nick Koston 3426eb2733 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-surgery 2026-08-25 12:38:49 -05:00
J. Nick Koston c91fa2b6fc Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 12:37:47 -05:00
J. Nick Koston e2c2b2f53e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 12:37:47 -05:00
J. Nick Koston 784f3b8680 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 12:37:47 -05:00
J. Nick Koston f8669a34dd Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-25 12:37:46 -05:00
J. Nick Koston 21de71bd7a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 12:37:46 -05:00
J. Nick Koston e47c800805 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 12:37:46 -05:00
J. Nick Koston fce5a94234 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-25 12:37:46 -05:00
J. Nick Koston 94b47496c8 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-surgery 2026-08-25 12:37:36 -05:00
J. Nick Koston 422d1c67da Honor bulk in every per-address decode marker 2026-08-25 11:54:33 -05:00
J. Nick Koston 6c14bff747 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-25 10:47:59 -05:00
J. Nick Koston e5d95bafd0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-25 10:47:59 -05:00
J. Nick Koston 6d9cb2daac Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-25 10:47:58 -05:00
J. Nick Koston 1fa27b79a6 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-25 10:47:58 -05:00
J. Nick Koston 0f41148e5c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-25 10:47:58 -05:00
J. Nick Koston e169f71bae Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-25 10:47:58 -05:00
J. Nick Koston 4e192cf89a Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-25 10:47:58 -05:00
J. Nick Koston 515aa96844 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-surgery 2026-08-25 10:47:44 -05:00
J. Nick Koston a0dcb6a5f5 Demote bulk stack-word decode misses to debug, count built components per pattern 2026-08-25 08:37:33 -05:00
J. Nick Koston 2ee448a7a8 Cover the failed-probe fall-through 2026-08-24 19:19:30 -05:00
J. Nick Koston f934f3ac7e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 18:53:58 -05:00
J. Nick Koston 605c894682 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 18:53:58 -05:00
J. Nick Koston fd3654e206 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 18:53:58 -05:00
J. Nick Koston a35290c8bc Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 18:53:57 -05:00
J. Nick Koston d5c0d18c0a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 18:53:57 -05:00
J. Nick Koston b7f3b3f2e1 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 18:53:57 -05:00
J. Nick Koston d217a7e6a8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 18:53:57 -05:00
J. Nick Koston 802a14f90a Hoist the test imports to module level 2026-08-24 18:53:36 -05:00
J. Nick Koston 85c0d86040 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/components/esp8266/__init__.py
2026-08-24 18:52:51 -05:00
J. Nick Koston 35d147aef1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/components/esp8266/const.py
2026-08-24 18:52:13 -05:00
J. Nick Koston abefc93225 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 18:51:28 -05:00
J. Nick Koston 9d6ceef241 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 18:51:28 -05:00
J. Nick Koston e87f617a5b Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 18:51:27 -05:00
J. Nick Koston ae8ab5773f Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 18:51:27 -05:00
J. Nick Koston 73a9f420c0 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 18:51:27 -05:00
J. Nick Koston 69a3ab6fb1 Error instead of substituting a state-destroying layout on legacy cores, extract the ld choice, regroup KEY_LDSCRIPT, document segment_length's None 2026-08-24 18:51:10 -05:00
J. Nick Koston 77de13dab3 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 18:48:02 -05:00
J. Nick Koston 8e3aa5e921 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 18:48:02 -05:00
J. Nick Koston d9d2c0bf6b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 18:48:01 -05:00
J. Nick Koston f41aa2ff62 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 18:48:01 -05:00
J. Nick Koston 4b731ce9ce Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 18:48:01 -05:00
J. Nick Koston bcc5a551dc Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 18:48:01 -05:00
J. Nick Koston 50e6a011cb Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 18:48:01 -05:00
J. Nick Koston 2cd5db4854 Merge remote-tracking branch 'origin/esp8266-native-build-surgery' into esp8266-native-build-surgery 2026-08-24 18:47:58 -05:00
J. Nick Koston 260bfc2358 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 18:47:07 -05:00
J. Nick Koston 4e66248682 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 18:47:07 -05:00
J. Nick Koston f6c308cefa Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 18:47:07 -05:00
J. Nick Koston 63b25f00cb Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 18:47:06 -05:00
J. Nick Koston 44c8ce777a Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 18:47:06 -05:00
J. Nick Koston bd9cf790d7 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 18:47:06 -05:00
J. Nick Koston 6eaf22afd8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 18:47:06 -05:00
J. Nick Koston 767b60a914 Merge remote-tracking branch 'origin/dev' into esp8266-native-build-surgery 2026-08-24 18:46:55 -05:00
J. Nick Koston 7ca1b79544 Name the ldscript key, warn when a pre-2.4.2 core cannot honor it, pin the rule
KEY_LDSCRIPT replaces the bare literal at both the table entry and the
lookup, so a typo cannot silently fall back to the layout-moving
default; the regeneration recipe notes that overrides must survive a
refresh; a board pinning an override on an Arduino core <= 2.4.2 warns
that the layout cannot be honored; and board_ld_script gains the test
pinning d1_wroom_02's shipped layout and the size defaults.
2026-08-24 18:46:47 -05:00
J. Nick Koston a25509bda0 Share the per-board ldscript rule via boards.board_ld_script
One source of truth for the PlatformIO pinning and the native
generator's fallback, so the per-board rule cannot drift.
2026-08-24 18:46:47 -05:00
J. Nick Koston 04825d3a58 Reconcile BOARDS with the generated table: d1_wroom_02 joins with its shipped flash layout 2026-08-24 18:46:47 -05:00
J. Nick Koston e714848fb9 Trim comment essays and hoist function-local test imports 2026-08-24 18:46:47 -05:00
J. Nick Koston d7ee824228 Phrase the board-table regen comment imperatively 2026-08-24 18:46:47 -05:00
J. Nick Koston 862b7f7c3e Pin fingerprint stability and sensitivity behaviorally, note the platform pairing 2026-08-24 18:46:47 -05:00
J. Nick Koston 77c41d2579 State what the fingerprint test actually pins 2026-08-24 18:46:47 -05:00
J. Nick Koston 4d92741e69 Pin the decoy anchor, guard unselected segments, fingerprint the module source 2026-08-24 18:46:47 -05:00
J. Nick Koston b2ac49d8a8 Anchor the segment regex, reject unknown segments, and pin real-script fixtures 2026-08-24 18:46:47 -05:00
J. Nick Koston 8fb6496583 Export a surgery fingerprint for linker-script cache stamps 2026-08-24 18:46:47 -05:00
J. Nick Koston 5f3d73720e Patch exactly the named segments and share the segment-line pattern 2026-08-24 18:46:47 -05:00
J. Nick Koston cdd8a16cb9 Add the ESP8266 linker-script surgery and board build metadata 2026-08-24 18:46:47 -05:00
J. Nick Koston a5ae1097cc Restore the fast fail before the baseline build when nothing matched 2026-08-24 18:45:40 -05:00
J. Nick Koston 1739bbf3de Name explicit ninja targets instead of policing mtimes, unify the no-tests accounting per pattern, mark stale-ELF decodes, glob the idedata caches 2026-08-24 18:15:58 -05:00
J. Nick Koston f30802757e Stamp the compile-DB freshness, defer the silent-component failure past the summary, mark every undecoded address, honor all-platform fixtures 2026-08-24 17:06:59 -05:00
J. Nick Koston eb2e9a791b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 16:00:09 -05:00
J. Nick Koston 38bc629db3 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 16:00:09 -05:00
J. Nick Koston ed4c1af5a9 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 16:00:09 -05:00
J. Nick Koston 13b9ff5f7f Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 16:00:09 -05:00
J. Nick Koston 7e2c83a397 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 16:00:09 -05:00
J. Nick Koston dafb60434f Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 16:00:08 -05:00
J. Nick Koston 53cb82c76b Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 16:00:08 -05:00
J. Nick Koston 4efc3ecb70 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-24 16:00:08 -05:00
J. Nick Koston 4457158e3b Merge remote-tracking branch 'origin/dev' into esp8266-native-shared-helpers 2026-08-24 15:59:59 -05:00
J. Nick Koston 8d1c58afaa Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 15:58:32 -05:00
J. Nick Koston 37d5ba1807 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 15:58:32 -05:00
J. Nick Koston eaa9e955b2 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 15:58:31 -05:00
J. Nick Koston f6cb25f811 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 15:58:31 -05:00
J. Nick Koston 431312da29 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 15:58:31 -05:00
J. Nick Koston bc86285369 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 15:58:31 -05:00
J. Nick Koston f78c1cb85c Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 15:58:30 -05:00
J. Nick Koston ad437cbd15 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-24 15:58:30 -05:00
J. Nick Koston 7e236bc762 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-24 15:58:30 -05:00
J. Nick Koston 6eed2e5d2b Merge remote-tracking branch 'origin/dev' into esp8266-native-library-converter 2026-08-24 15:58:21 -05:00
J. Nick Koston 4b62689952 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 14:39:01 -05:00
J. Nick Koston 4fb83364e8 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 14:39:01 -05:00
J. Nick Koston 9a4603abce Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 14:39:00 -05:00
J. Nick Koston 66be5a2a6d Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 14:39:00 -05:00
J. Nick Koston 3f75a7f7b2 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 14:38:59 -05:00
J. Nick Koston e37275d8ba Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 14:38:59 -05:00
J. Nick Koston 1c440fb30e Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 14:38:59 -05:00
J. Nick Koston 454e380057 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-24 14:38:58 -05:00
J. Nick Koston cd1e5aad67 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-24 14:38:58 -05:00
J. Nick Koston a8c4018536 Merge remote-tracking branch 'origin/dev' into esp8266-native-library-converter 2026-08-24 14:38:49 -05:00
J. Nick Koston 634dfe6f3c Harden the skip path against stale artifacts, tolerate corrupt linker scripts, guard the baseline degrade, mark undecoded addresses 2026-08-24 13:49:50 -05:00
J. Nick Koston 0556c212b2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 13:36:49 -05:00
J. Nick Koston 9b02163b99 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-24 13:36:39 -05:00
J. Nick Koston 3f76981e2d Serialize the cache-stamp command unambiguously, annotate the test helpers 2026-08-24 13:36:07 -05:00
J. Nick Koston 0036732dde Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-24 12:32:55 -05:00
J. Nick Koston 6068d7887f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 12:32:55 -05:00
J. Nick Koston 7dddad5471 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 12:32:55 -05:00
J. Nick Koston 31c6dad695 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 12:32:55 -05:00
J. Nick Koston 49d92b7787 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 12:32:54 -05:00
J. Nick Koston fb8f02e552 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 12:32:54 -05:00
J. Nick Koston 30fff6e91c Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 12:32:54 -05:00
J. Nick Koston 200ee0c9c3 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-24 12:32:54 -05:00
J. Nick Koston 81c375af0b Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-24 12:32:53 -05:00
J. Nick Koston 3ca65ffb0d Cover the file-like backoff tick, settle the batch worker return shape 2026-08-24 12:32:38 -05:00
J. Nick Koston e50057f7bb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-24 12:20:54 -05:00
J. Nick Koston 738f5b1798 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-24 12:20:54 -05:00
J. Nick Koston 81b1a22500 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-24 12:20:54 -05:00
J. Nick Koston 8737ade027 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-24 12:20:42 -05:00
J. Nick Koston c92530b8c0 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-24 12:20:18 -05:00
J. Nick Koston 18890d219e Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-24 12:20:18 -05:00
J. Nick Koston 3425a13d51 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-24 12:20:18 -05:00
J. Nick Koston 68b474fd00 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-24 12:20:18 -05:00
J. Nick Koston efa7fae845 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-24 12:20:18 -05:00
J. Nick Koston 29c290166b Apply simplify pass: flatten the batch worker, drop a dead guard, skip the unread backoff probe 2026-08-24 12:20:14 -05:00
J. Nick Koston d348284d9e Hoist the manifest shape gate into a helper 2026-08-24 12:17:05 -05:00
J. Nick Koston af500d6bec Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 22:25:38 -05:00
J. Nick Koston efb8f5ff1a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 22:25:38 -05:00
J. Nick Koston 0d078a3416 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 22:25:38 -05:00
J. Nick Koston ae2fa92a3d Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 22:25:37 -05:00
J. Nick Koston 39b12a9382 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 22:25:37 -05:00
J. Nick Koston bd568038ee Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 22:25:37 -05:00
J. Nick Koston 1aff27727f Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 22:25:37 -05:00
J. Nick Koston 3a248d526d Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 22:25:37 -05:00
J. Nick Koston 2f49405740 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 22:25:36 -05:00
J. Nick Koston d418472a8f Merge remote-tracking branch 'origin/dev' into esp8266-native-library-converter
# Conflicts:
#	esphome/platformio/library.py
#	tests/unit_tests/test_platformio_library.py
2026-08-23 22:25:22 -05:00
J. Nick Koston ac3a6934f6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 22:02:14 -05:00
J. Nick Koston 7db3fd1286 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 22:02:14 -05:00
J. Nick Koston 81cca915f6 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 22:02:13 -05:00
J. Nick Koston 5c7a7eee29 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 22:02:13 -05:00
J. Nick Koston abde296f54 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 22:02:13 -05:00
J. Nick Koston 516508ef92 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 22:02:13 -05:00
J. Nick Koston 2a4bd1789c Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 22:02:13 -05:00
J. Nick Koston 7a715ee583 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 22:02:12 -05:00
J. Nick Koston d8dc1dc70e Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 22:02:12 -05:00
J. Nick Koston 5479752da6 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 22:02:12 -05:00
J. Nick Koston b0e4711cc3 Merge remote-tracking branch 'origin/esp8266-native-converter-hardening' into esp8266-native-converter-hardening 2026-08-23 22:01:59 -05:00
J. Nick Koston 1780a54524 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 22:00:36 -05:00
J. Nick Koston 6b5b8e0fd0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 22:00:35 -05:00
J. Nick Koston 568002014e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 22:00:35 -05:00
J. Nick Koston dd5b1a7ae3 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 22:00:35 -05:00
J. Nick Koston 0b03327dd9 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 22:00:35 -05:00
J. Nick Koston c0965a3a8a Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 22:00:35 -05:00
J. Nick Koston 141fd285c9 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 22:00:34 -05:00
J. Nick Koston d744a98f5b Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 22:00:34 -05:00
J. Nick Koston a03945bbfb Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 22:00:34 -05:00
J. Nick Koston bc2b4bd381 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 22:00:34 -05:00
J. Nick Koston f8acaab6c1 Merge remote-tracking branch 'origin/dev' into esp8266-native-converter-hardening
# Conflicts:
#	script/determine-jobs.py
#	tests/script/test_determine_jobs.py
2026-08-23 22:00:22 -05:00
J. Nick Koston 5f2b8f7251 Type LINK_FLAGS in the gate, skip malformed transitive deps, escape quotes in zephyr CMake entries 2026-08-23 21:59:22 -05:00
J. Nick Koston d80d2c7034 Tolerate malformed repository/description metadata instead of crashing 2026-08-23 21:59:22 -05:00
J. Nick Koston 1f5152892c Give the fake env real membership, widen the manifest gate, route zephyr through the shared lexer 2026-08-23 21:59:22 -05:00
J. Nick Koston 89671f9e0d Normalize captured CPPDEFINES to a CppDefine named tuple at capture time 2026-08-23 21:59:22 -05:00
J. Nick Koston c6f9153e63 Route captured LINKFLAGS to the link line and make Prepend a real front-insert 2026-08-23 21:59:22 -05:00
J. Nick Koston aa3268a6d8 Match SCons' remaining CPPDEFINES spellings, drop dead test scaffolding
A bare 2-tuple is one name=value pair (not -DFOO -D1), a dict maps
names to values, and a None value is a bare define, per processDefines.
The unused caplog_at_info helper and the progress kwarg the download
stubs declared ahead of their PR are gone.
2026-08-23 21:59:22 -05:00
J. Nick Koston 879cbf6264 Cover env access warnings and the unmodelled-subscript degrade 2026-08-23 21:59:22 -05:00
J. Nick Koston 4da8868510 Quote CPPDEFINES, warn on env access, degrade unmodelled subscripts, realify InvalidLibrary
CPPDEFINES joins the quoted buckets (a spaced define no longer splits
across tokens) and its tuple branch validates the pair elements. The
fake env warns on attribute access rather than call, so hasattr/
truthiness branches are diagnosable, with dunder probes excluded; an
unmodelled subscript warns and returns '' instead of a KeyError
discarding the whole capture. Malformed platforms/frameworks values
raise plain InvalidLibrary, giving the non-platform warning branches a
real producer, and their tests use real manifests instead of
monkeypatched raisers. The version-less dependency drop moves to debug:
bundled names (Wire, SPI) made it per-build noise nobody can act on.
2026-08-23 21:59:22 -05:00
J. Nick Koston df76fc6fba Trim comments and docstrings 2026-08-23 21:59:22 -05:00
J. Nick Koston 0d75f597b3 Harden the shared library converter
Split out of #18662: the converter/manifest hardening without the
download parallelization, which stays there.

The PIO extra-script shim moves from espidf/ to platformio/ and gains
type checks for every manifest field, capture of the Append variants and
CPPPATH, warn-once diagnostics for unmodelled env reads, and uniform
shlex quoting so captured values survive the lex_build_flags round-trip.
The dependency walk normalizes every spelling PIO accepts, splits the
routine cross-platform skip (IncompatiblePlatform) from real manifest
problems, validates manifest shape once, and the shared flag lexer
warns and drops trailing or empty glued arguments.
2026-08-23 21:59:22 -05:00
J. Nick Koston 1caad91260 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 21:10:49 -05:00
J. Nick Koston 9ee07ab960 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 21:10:49 -05:00
J. Nick Koston 0155e4c296 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 21:10:48 -05:00
J. Nick Koston db23748616 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 21:10:48 -05:00
J. Nick Koston 1a5c219909 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 21:10:48 -05:00
J. Nick Koston 23a3412752 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 21:10:47 -05:00
J. Nick Koston 148d4f3f3a Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 21:10:47 -05:00
J. Nick Koston 936bc708af Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 21:10:46 -05:00
J. Nick Koston 13dcf54a43 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 21:10:46 -05:00
J. Nick Koston 5bccc41ca3 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 21:10:46 -05:00
J. Nick Koston 5ba31dcccb Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 21:10:45 -05:00
J. Nick Koston 3fe4e255d8 Merge remote-tracking branch 'origin/dev' into esp8266-native-idedata-helpers 2026-08-23 21:10:35 -05:00
J. Nick Koston 985a784f5e Point analyze-memory at the platformio escape hatch, test the backend-table invariant instead of asserting at import, fail blank component lists under the flag, clean the arduino idedata cache 2026-08-23 20:53:55 -05:00
J. Nick Koston 0b920477b3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 19:43:43 -05:00
J. Nick Koston bae1291d73 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 19:43:43 -05:00
J. Nick Koston d4715511aa Cover the non-UTF-8 script raise and the note-read race 2026-08-23 19:43:31 -05:00
J. Nick Koston 4a9dfe0456 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 19:38:34 -05:00
J. Nick Koston f973c7bfb7 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 19:38:34 -05:00
J. Nick Koston 0b04623072 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 19:38:33 -05:00
J. Nick Koston a1ea46e002 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 19:38:33 -05:00
J. Nick Koston 7bb4f2ecb2 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 19:38:33 -05:00
J. Nick Koston 1eb0fff084 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 19:38:33 -05:00
J. Nick Koston 2e1217b1e1 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 19:38:32 -05:00
J. Nick Koston 67608f9386 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 19:38:32 -05:00
J. Nick Koston 9c2a3baaa9 Name the platform in the analyze-memory refusal, surface parser-shaped idedata failures, count builds per component under the no-tests flag 2026-08-23 19:38:12 -05:00
J. Nick Koston 983c5a1de9 Decode the linker script strictly, fold the diagnostic note into the cache stamp, fix the comment attachment 2026-08-23 19:35:42 -05:00
J. Nick Koston 5aaf5e8150 Parametrize the build-info staleness test 2026-08-23 19:33:08 -05:00
J. Nick Koston f3851bf3ad Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 19:30:47 -05:00
J. Nick Koston 0bbd09219d Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 19:30:47 -05:00
J. Nick Koston d0dc7cc57c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 19:30:47 -05:00
J. Nick Koston b9d40d2b1b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 19:30:47 -05:00
J. Nick Koston 14a68e7b35 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 19:30:47 -05:00
J. Nick Koston c4e8cb5ccd Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 19:30:46 -05:00
J. Nick Koston ecb0c24bee Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 19:30:46 -05:00
J. Nick Koston 5ce8c68df5 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 19:30:46 -05:00
J. Nick Koston 412b7a8b99 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 19:30:46 -05:00
J. Nick Koston e594888176 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter
# Conflicts:
#	esphome/platformio/library.py
2026-08-23 19:30:35 -05:00
J. Nick Koston 6bdd8b1163 Type LINK_FLAGS in the gate, skip malformed transitive deps, escape quotes in zephyr CMake entries 2026-08-23 19:30:02 -05:00
J. Nick Koston 8af64629d7 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 18:59:47 -05:00
J. Nick Koston 6dbe414b77 Assemble plain .s without the preprocessor, allow unflagging operand-less linker flags 2026-08-23 18:59:45 -05:00
J. Nick Koston 2c489b5e8a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 18:59:00 -05:00
J. Nick Koston e98d3ad066 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 18:59:00 -05:00
J. Nick Koston c89154bb93 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 18:59:00 -05:00
J. Nick Koston fc058a1e14 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 18:59:00 -05:00
J. Nick Koston fa6e6f3d36 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 18:59:00 -05:00
J. Nick Koston 092aaf9852 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 18:58:59 -05:00
J. Nick Koston 06e3525f82 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 18:58:59 -05:00
J. Nick Koston 476ec16a3d Split the AS and ASPP source kinds to match SCons 2026-08-23 18:58:48 -05:00
J. Nick Koston 6f775ca9af Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 18:45:16 -05:00
J. Nick Koston 2879861c1c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 18:45:15 -05:00
J. Nick Koston 717a21add7 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 18:45:15 -05:00
J. Nick Koston f27453e570 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 18:45:15 -05:00
J. Nick Koston 2e681bfb2e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 18:45:15 -05:00
J. Nick Koston 0e9a08a3b5 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 18:45:14 -05:00
J. Nick Koston 7ddbd5c943 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 18:45:14 -05:00
J. Nick Koston d9b3536e9f Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 18:45:14 -05:00
J. Nick Koston 0ed990e311 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 18:45:14 -05:00
J. Nick Koston 69d997521f Guard the bar writes, narrow the cache probe, make a total prefetch failure loud 2026-08-23 18:45:02 -05:00
J. Nick Koston 4c4ccc4444 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 18:33:24 -05:00
J. Nick Koston 4946221da0 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 18:33:24 -05:00
J. Nick Koston e623bb90ae Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 18:33:24 -05:00
J. Nick Koston 97d9f6be12 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 18:33:24 -05:00
J. Nick Koston 8ef6bd24d6 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 18:33:24 -05:00
J. Nick Koston 59c3af7533 Complete the toolchain-plumbing merge that the format hook split 2026-08-23 18:33:00 -05:00
J. Nick Koston 344843ec93 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 18:31:08 -05:00
J. Nick Koston 4affd574ac Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 18:31:08 -05:00
J. Nick Koston 4840740032 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers
# Conflicts:
#	esphome/writer.py
2026-08-23 18:31:05 -05:00
J. Nick Koston ae5e5b3011 Merge remote-tracking branch 'origin/dev' into esp8266-native-idedata-helpers 2026-08-23 18:30:06 -05:00
J. Nick Koston 3ab464c345 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 18:30:06 -05:00
J. Nick Koston b74de2dfa2 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 18:30:06 -05:00
J. Nick Koston d4f75e5468 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 18:26:13 -05:00
J. Nick Koston b458d6b4af Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 18:26:13 -05:00
J. Nick Koston 9a04c0ffdc ASCII-only shape regexes, document the flash_mode precondition 2026-08-23 18:26:04 -05:00
J. Nick Koston 0e54d7d510 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 18:20:47 -05:00
J. Nick Koston d8dea887b0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 18:20:47 -05:00
J. Nick Koston a818f5e259 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 18:20:46 -05:00
J. Nick Koston 1b7db46c8c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 18:20:46 -05:00
J. Nick Koston ea0bab57ff Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 18:20:46 -05:00
J. Nick Koston 71ae4f94ab Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 18:20:46 -05:00
J. Nick Koston 08c7eb627e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 18:20:46 -05:00
J. Nick Koston 7ea8892e0a Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 18:20:45 -05:00
J. Nick Koston dce979245d Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 18:20:45 -05:00
J. Nick Koston 6e65634408 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 18:20:45 -05:00
J. Nick Koston 6300e9b72e Tolerate malformed repository/description metadata instead of crashing 2026-08-23 18:20:43 -05:00
J. Nick Koston 129f50b712 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 18:15:05 -05:00
J. Nick Koston bfafb41888 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 18:15:05 -05:00
J. Nick Koston 093184e950 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 18:15:05 -05:00
J. Nick Koston 51afb0ed25 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 18:15:05 -05:00
J. Nick Koston 7d69b7babd Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 18:15:04 -05:00
J. Nick Koston 6f543c728a Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 18:15:04 -05:00
J. Nick Koston 6c63e61261 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 18:15:04 -05:00
J. Nick Koston cb4dd32e19 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 18:15:04 -05:00
J. Nick Koston 6381ed97b9 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 18:15:04 -05:00
J. Nick Koston 786e9ef278 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter
# Conflicts:
#	esphome/platformio/library.py
2026-08-23 18:14:53 -05:00
J. Nick Koston 24ce2195da Merge remote-tracking branch 'origin/dev' into esp8266-native-idedata-helpers 2026-08-23 18:12:27 -05:00
J. Nick Koston d5fe45db66 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 18:12:27 -05:00
J. Nick Koston a027d06231 Give the fake env real membership, widen the manifest gate, route zephyr through the shared lexer 2026-08-23 18:12:14 -05:00
J. Nick Koston b893cee6ca Apply simplify pass: shared idedata warning, platform-keyed backend table, one owner for the cache prefix and trigger files 2026-08-23 18:07:46 -05:00
J. Nick Koston 73fd512a25 Make symbol unflags pair-aware on the link line, drop the dead KEY_FLASH_MODE 2026-08-23 18:03:15 -05:00
J. Nick Koston aaebc6e007 Cover the skipped-size-summary warning in run_compile 2026-08-23 18:00:34 -05:00
J. Nick Koston f0f6671c83 Pin that the native upload path imports no platform component package 2026-08-23 17:52:27 -05:00
J. Nick Koston ebb6ffa509 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 17:51:16 -05:00
J. Nick Koston e902d8d1fc Widen _collect_sources exclude to Collection 2026-08-23 17:51:09 -05:00
J. Nick Koston f82d8ec99b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 17:46:54 -05:00
J. Nick Koston a15dbe750f Pin that a non-default flash mode reaches the define and the image header 2026-08-23 17:46:53 -05:00
J. Nick Koston fde0a835b6 Pin board_build.flash_mode unconditionally, dispatch native backends by toolchain, report a skipped size summary 2026-08-23 17:46:23 -05:00
J. Nick Koston 830d12dec7 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 17:27:07 -05:00
J. Nick Koston 08421c9bfb Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 17:27:07 -05:00
J. Nick Koston d59f6eb46d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 17:27:07 -05:00
J. Nick Koston 3c07602fd1 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 17:27:06 -05:00
J. Nick Koston d0811277cc Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 17:27:06 -05:00
J. Nick Koston 32e8c4169c Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 17:27:06 -05:00
J. Nick Koston de126b4879 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 17:27:06 -05:00
J. Nick Koston 8f7534f39a Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 17:27:06 -05:00
J. Nick Koston 6bac1ed950 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 17:27:05 -05:00
J. Nick Koston 57241e40b8 Make failure_reason public now that two modules import it, cover interrupt() on a finished bar 2026-08-23 17:26:47 -05:00
J. Nick Koston 43e053a2a5 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 17:18:01 -05:00
J. Nick Koston 4e97a8f7f5 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 17:18:01 -05:00
J. Nick Koston 26982767bd Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 17:18:01 -05:00
J. Nick Koston 15d931b17e Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 17:18:00 -05:00
J. Nick Koston 8f65599afe Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 17:18:00 -05:00
J. Nick Koston 713fe99024 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 17:18:00 -05:00
J. Nick Koston 68281cfd5c Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 17:18:00 -05:00
J. Nick Koston 76ddbe5ebd Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 17:17:59 -05:00
J. Nick Koston 81d9b943aa Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 17:17:59 -05:00
J. Nick Koston 28f0a7b155 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 17:17:59 -05:00
J. Nick Koston 531bd8ec62 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 17:17:59 -05:00
J. Nick Koston 40e6e406d7 Merge remote-tracking branch 'origin/dev' into esp8266-native-idedata-helpers 2026-08-23 17:17:52 -05:00
J. Nick Koston 6cfbe5b166 Normalize captured CPPDEFINES to a CppDefine named tuple at capture time 2026-08-23 17:15:29 -05:00
J. Nick Koston c97fb7744b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 17:12:40 -05:00
J. Nick Koston b3ad8bd15d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 17:12:40 -05:00
J. Nick Koston 5990fbbf58 Warn on unrecognized flag shapes reaching the compile line, pin the IPv6 lwIP pair, fix stale comments 2026-08-23 17:12:31 -05:00
J. Nick Koston 6b5b2abdea Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 17:08:17 -05:00
J. Nick Koston ac37167db9 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 17:08:17 -05:00
J. Nick Koston 6da4a07546 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 17:08:17 -05:00
J. Nick Koston 1f44b89815 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 17:08:17 -05:00
J. Nick Koston 3cae91e542 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 17:08:17 -05:00
J. Nick Koston 09e5a7d2ac Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 17:08:16 -05:00
J. Nick Koston 4bb6da7f10 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 17:08:16 -05:00
J. Nick Koston b738b36a39 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 17:08:16 -05:00
J. Nick Koston ac66e3a96c Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 17:08:16 -05:00
J. Nick Koston e7fc3937bf Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 17:08:16 -05:00
J. Nick Koston 70f4555ec8 Route captured LINKFLAGS to the link line and make Prepend a real front-insert 2026-08-23 17:08:04 -05:00
J. Nick Koston c2edfd80eb Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:54:58 -05:00
J. Nick Koston e2aee2b28e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:54:58 -05:00
J. Nick Koston 726f0b5b57 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:54:57 -05:00
J. Nick Koston b3da79f65d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:54:57 -05:00
J. Nick Koston 75891a3449 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:54:57 -05:00
J. Nick Koston 5c62bd7abf Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:54:57 -05:00
J. Nick Koston 905c0835f4 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:54:57 -05:00
J. Nick Koston 5f20ddb630 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:54:56 -05:00
J. Nick Koston 6cfb915aeb Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:54:56 -05:00
J. Nick Koston 04a44d6e63 Let ProgressBar own the mid-row interrupt, share the part-file naming, fold duplicate except arms 2026-08-23 16:54:33 -05:00
J. Nick Koston cb10904fa3 Keep the combined bar steady during a backoff sleep 2026-08-23 16:49:54 -05:00
J. Nick Koston f1b2258661 Stop the false build_src_flags warning, share the idedata error tuple, make the no-tests guard per platform 2026-08-23 16:48:36 -05:00
J. Nick Koston 3f10a8ca36 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/components/esp8266/__init__.py
2026-08-23 16:43:20 -05:00
J. Nick Koston ad4c59873b Read flash mode from its real producer, share the mode set, store the scanf decision
flash_mode comes from the board_build.flash_mode option the component
already pins (validated by cv.one_of against the same BUILD_FLASH_MODES,
now living in const.py so the two sides cannot drift), retiring
KEY_FLASH_MODE from the generator. The scanf-float decision is stored in
CORE.data where it is computed instead of being a discarded local, so
KEY_SCANF_FLOAT has a producer in this PR. A trailing bare -include in
build_src_flags fails by name instead of degrading into the source dir.
2026-08-23 16:42:25 -05:00
J. Nick Koston 09d714bbef Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:36:12 -05:00
J. Nick Koston 436f06eb6d Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:36:10 -05:00
J. Nick Koston 9f1dd87938 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:36:08 -05:00
J. Nick Koston 03b994e23e Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:36:06 -05:00
J. Nick Koston 9b3aaa4ef0 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:36:04 -05:00
J. Nick Koston 5883e5505f Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:36:02 -05:00
J. Nick Koston 9ab69059bd Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:36:00 -05:00
J. Nick Koston 89e5ba00de Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:35:58 -05:00
J. Nick Koston 81b1678498 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:35:56 -05:00
J. Nick Koston ba0d9e77db Never log a blank prefetch reason, keep the download error over a tick failure
Both prefetch warning loops format through _failure_reason so a
message-less exception cannot log blank. A bar-frame write failure in
the failure path cannot displace the download error, the failure list
is annotated BaseException (cancellations are entries too), the Ctrl-C
docstring notes an in-progress extraction runs to completion, and the
wave-prefetch docstring carries the superseded-sibling caveat.
2026-08-23 16:35:48 -05:00
J. Nick Koston 6f0dffeb37 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:31:26 -05:00
J. Nick Koston 74003888a1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:31:24 -05:00
J. Nick Koston e468431081 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:31:22 -05:00
J. Nick Koston 9134ba29d2 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:31:20 -05:00
J. Nick Koston e460ead96b Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:31:18 -05:00
J. Nick Koston 0b19867efb Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:31:16 -05:00
J. Nick Koston 212a02a819 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:31:14 -05:00
J. Nick Koston 330f070921 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:31:12 -05:00
J. Nick Koston f6ae5e4892 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:31:10 -05:00
J. Nick Koston b0b174f3e2 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 16:31:08 -05:00
J. Nick Koston d8857080f0 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 16:31:06 -05:00
J. Nick Koston c285af3857 Cover the Flash line through the shared bar 2026-08-23 16:31:03 -05:00
J. Nick Koston 6b39cbb3e0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:25:37 -05:00
J. Nick Koston 8ac04d41e4 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:25:35 -05:00
J. Nick Koston b7e0952eb5 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:25:33 -05:00
J. Nick Koston 5f0d2ff217 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:25:30 -05:00
J. Nick Koston 28b400f942 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:25:28 -05:00
J. Nick Koston 3280248778 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:25:26 -05:00
J. Nick Koston 81ffa42c66 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:25:24 -05:00
J. Nick Koston d7d236c6bc Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:25:22 -05:00
J. Nick Koston de00530c0e Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:25:20 -05:00
J. Nick Koston acf5ce718c Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 16:25:18 -05:00
J. Nick Koston 5904928f0c Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 16:25:16 -05:00
J. Nick Koston dceeee69d3 Restore the size summary to its dev shape
The defensive spiral (#18668, closed) guarded inputs that cannot occur:
gen_esp32part validates partitions.csv before a build can succeed, and
esp_idf_size.json's realistic failures do not produce the handled
shapes. This PR's real change stands alone again: the bar moves to
build_helpers as print_size_line, with dev behavior everywhere else.
2026-08-23 16:25:11 -05:00
J. Nick Koston f1d270198c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:18:01 -05:00
J. Nick Koston a95f992430 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:17:59 -05:00
J. Nick Koston a8af46341a Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:17:57 -05:00
J. Nick Koston 2b617cd691 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:17:55 -05:00
J. Nick Koston 983c63f7e5 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:17:53 -05:00
J. Nick Koston af2d71e673 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:17:51 -05:00
J. Nick Koston 9fd0b47b39 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:17:49 -05:00
J. Nick Koston 03c7d3b343 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:17:47 -05:00
J. Nick Koston d405db1268 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:17:45 -05:00
J. Nick Koston 8cac10d319 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 16:17:43 -05:00
J. Nick Koston 030a3b7ab3 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 16:17:41 -05:00
J. Nick Koston dfc26e9f09 Mirror the named-file arm and tightened checks 2026-08-23 16:17:37 -05:00
J. Nick Koston 008555d600 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:12:15 -05:00
J. Nick Koston 1ec7e7b285 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:12:13 -05:00
J. Nick Koston 997024a4e3 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:12:11 -05:00
J. Nick Koston 076db937e1 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:12:09 -05:00
J. Nick Koston e27bbd25e7 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:12:07 -05:00
J. Nick Koston e369a9a647 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:12:05 -05:00
J. Nick Koston 034a872e21 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:12:03 -05:00
J. Nick Koston 4f9941decb Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:12:01 -05:00
J. Nick Koston 385681121f Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:11:59 -05:00
J. Nick Koston c395861fa3 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 16:11:57 -05:00
J. Nick Koston 30b2bbfe3a Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 16:11:55 -05:00
J. Nick Koston 3af17d5c92 Mirror the named missing-table raise 2026-08-23 16:11:52 -05:00
J. Nick Koston ccf7da5414 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:10:02 -05:00
J. Nick Koston 869bc2c99a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:10:00 -05:00
J. Nick Koston b05a2c6592 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:09:58 -05:00
J. Nick Koston 412959f11a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:09:56 -05:00
J. Nick Koston 78d294ed86 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:09:54 -05:00
J. Nick Koston c04eb4128f Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:09:52 -05:00
J. Nick Koston 934e53298a Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:09:50 -05:00
J. Nick Koston 72d6864938 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:09:48 -05:00
J. Nick Koston 89ffacaffb Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:09:46 -05:00
J. Nick Koston 6eff668dba Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 16:09:44 -05:00
J. Nick Koston 350202efa6 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 16:09:42 -05:00
J. Nick Koston 14388c859a Mirror the backstop-ownership trim from the standalone 2026-08-23 16:09:26 -05:00
J. Nick Koston 78468d7172 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 16:07:02 -05:00
J. Nick Koston fc8953d9cc Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 16:07:00 -05:00
J. Nick Koston f102abef57 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 16:06:58 -05:00
J. Nick Koston 57c63ee3fd Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 16:06:56 -05:00
J. Nick Koston 6284a701d8 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 16:06:54 -05:00
J. Nick Koston 5d352d090b Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 16:06:52 -05:00
J. Nick Koston 36c652473a Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 16:06:50 -05:00
J. Nick Koston 7061bd7e70 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 16:06:48 -05:00
J. Nick Koston fe274653bd Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 16:06:46 -05:00
J. Nick Koston 7beb0078c2 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 16:06:44 -05:00
J. Nick Koston e26dbb6d75 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 16:06:42 -05:00
J. Nick Koston 7aa0f30ceb Mirror the unreachable-arm removal from the standalone 2026-08-23 16:06:38 -05:00
J. Nick Koston 38c5e4f997 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 15:59:15 -05:00
J. Nick Koston 612545b9a8 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 15:59:13 -05:00
J. Nick Koston b24481cda6 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 15:59:11 -05:00
J. Nick Koston 9c3c2823c9 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 15:59:09 -05:00
J. Nick Koston dd52c519de Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 15:59:08 -05:00
J. Nick Koston 691be52c88 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 15:59:06 -05:00
J. Nick Koston cfbaef1d8d Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 15:59:03 -05:00
J. Nick Koston 438a4ddc14 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 15:59:01 -05:00
J. Nick Koston 5a749c4b5d Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 15:58:59 -05:00
J. Nick Koston 3de58dae99 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 15:58:57 -05:00
J. Nick Koston fd2971bd70 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 15:58:55 -05:00
J. Nick Koston 8a9bb7741a Mirror the truncated-size-report classification 2026-08-23 15:58:52 -05:00
J. Nick Koston 1b28c3eadb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 15:52:45 -05:00
J. Nick Koston ee431eb723 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 15:52:43 -05:00
J. Nick Koston 219532ce01 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 15:52:41 -05:00
J. Nick Koston 8b76e62be1 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 15:52:39 -05:00
J. Nick Koston 6dbd89054b Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 15:52:37 -05:00
J. Nick Koston f93fa22de8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 15:52:35 -05:00
J. Nick Koston fd15a22c94 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 15:52:33 -05:00
J. Nick Koston 393dabadf8 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 15:52:30 -05:00
J. Nick Koston 56dc9124ab Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 15:52:28 -05:00
J. Nick Koston 92b655c5a0 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 15:52:26 -05:00
J. Nick Koston c474421399 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 15:52:24 -05:00
J. Nick Koston ca611a3159 Mirror the size-summary visibility refinements from the standalone
Corrupt shapes at any level warn as malformed while a simply-absent
DRAM/DIRAM region stays at debug, the backstop warning carries its
traceback, and the image_size warning names its file.
2026-08-23 15:51:30 -05:00
J. Nick Koston 1cdaddad4f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 15:46:01 -05:00
J. Nick Koston a8e71f125a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 15:45:59 -05:00
J. Nick Koston cb62f892c7 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 15:45:56 -05:00
J. Nick Koston 2283fafc9b Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 15:45:54 -05:00
J. Nick Koston 115ef50090 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 15:45:52 -05:00
J. Nick Koston 48d353926e Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 15:45:50 -05:00
J. Nick Koston abb0f9e56a Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 15:45:48 -05:00
J. Nick Koston 6dbef0d0bb Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 15:45:46 -05:00
J. Nick Koston 832c6feecc Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 15:45:44 -05:00
J. Nick Koston 41b0fe6747 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 15:45:42 -05:00
J. Nick Koston e580e267ce Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 15:45:40 -05:00
J. Nick Koston d3590ffd7c Port the standalone size-summary hardening into the chain copy
The full #18668 state, adapted to the shared bar: _ram_bar/_flash_bar
return validated (used, total) pairs printed through print_size_line,
the partition parser returns None for legitimate absence and raises
only for a broken table, skips follow the warn/debug visibility rule,
and run_compile passes the table path unconditionally. Ported now so
the merge-time conflict resolves itself; the chain-only exact-format
and RAM-vs-Flash isolation tests stay.
2026-08-23 15:45:36 -05:00
J. Nick Koston de4e395715 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 15:33:44 -05:00
J. Nick Koston f955c59fe4 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 15:33:42 -05:00
J. Nick Koston 9cbdfa07cb Require bodies on the MMU segment sizes, split driver link flags, warn on a stuck note
A bare -DMMU_IRAM_SIZE would preprocess to len = 1 and fail far away in
ld (or as a misleading testing-mode message), so MMU_CUSTOM requires a
body on both segment sizes before the shape check. -fuse-ld=/-specs=/
--specs= are driver options with no -Wl, spelling, so they get their
own rejection instead of advice that would make things worse. An
unremovable stale stderr note now warns with the clean hint, since its
consequence is a permanently unstamped cache.
2026-08-23 15:33:37 -05:00
J. Nick Koston 5c9d73c1e2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 15:27:53 -05:00
J. Nick Koston eea31bf571 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 15:27:51 -05:00
J. Nick Koston db2ea1b935 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 15:27:49 -05:00
J. Nick Koston f7a3e4fabf Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 15:27:47 -05:00
J. Nick Koston fc9037b2b5 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 15:27:44 -05:00
J. Nick Koston ebc6f83053 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 15:27:42 -05:00
J. Nick Koston 8c96e50b46 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 15:27:40 -05:00
J. Nick Koston 54429bcdfb Name the ldscript key, warn when a pre-2.4.2 core cannot honor it, pin the rule
KEY_LDSCRIPT replaces the bare literal at both the table entry and the
lookup, so a typo cannot silently fall back to the layout-moving
default; the regeneration recipe notes that overrides must survive a
refresh; a board pinning an override on an Arduino core <= 2.4.2 warns
that the layout cannot be honored; and board_ld_script gains the test
pinning d1_wroom_02's shipped layout and the size defaults.
2026-08-23 15:27:36 -05:00
J. Nick Koston 8018a0d930 Cover the bar-less logging guard and the uncancelled backoff slice 2026-08-23 15:25:29 -05:00
J. Nick Koston 63d061bc1d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 15:09:19 -05:00
J. Nick Koston 65793b0eb7 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 15:09:18 -05:00
J. Nick Koston 317b81b3ff Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 15:09:15 -05:00
J. Nick Koston a3c93fb8ea Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 15:09:13 -05:00
J. Nick Koston 720f113f25 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 15:09:11 -05:00
J. Nick Koston 9b403279cb Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 15:09:09 -05:00
J. Nick Koston 17ba07d6fe Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 15:09:07 -05:00
J. Nick Koston 20920e0971 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 15:09:05 -05:00
J. Nick Koston 81be569a85 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 15:09:03 -05:00
J. Nick Koston 641c80b193 Use the caplog fixture where the deleted helper was 2026-08-23 15:09:00 -05:00
J. Nick Koston 21a3509634 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 15:06:58 -05:00
J. Nick Koston 91f0554a2c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 15:06:56 -05:00
J. Nick Koston 67bf5f9a21 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 15:06:54 -05:00
J. Nick Koston c46860bf57 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 15:06:52 -05:00
J. Nick Koston 66d0358d03 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 15:06:50 -05:00
J. Nick Koston 7c8f352ab1 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 15:06:48 -05:00
J. Nick Koston e563ad3724 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 15:06:46 -05:00
J. Nick Koston 8170cd3d96 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 15:06:44 -05:00
J. Nick Koston e2eae002e6 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 15:06:42 -05:00
J. Nick Koston 065867f815 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 15:06:40 -05:00
J. Nick Koston 5aebd7cb41 Match SCons' remaining CPPDEFINES spellings, drop dead test scaffolding
A bare 2-tuple is one name=value pair (not -DFOO -D1), a dict maps
names to values, and a None value is a bare define, per processDefines.
The unused caplog_at_info helper and the progress kwarg the download
stubs declared ahead of their PR are gone.
2026-08-23 15:05:43 -05:00
J. Nick Koston d0e27bd174 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 14:42:33 -05:00
J. Nick Koston 5d4a18f9e5 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 14:42:31 -05:00
J. Nick Koston c12e652acf Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 14:42:29 -05:00
J. Nick Koston 94dc7eccc3 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 14:42:27 -05:00
J. Nick Koston 96f8c021bd Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 14:42:25 -05:00
J. Nick Koston 8a8ae69639 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 14:42:23 -05:00
J. Nick Koston fb14f2f052 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 14:42:21 -05:00
J. Nick Koston 6497ca1496 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 14:42:19 -05:00
J. Nick Koston 759ddfc91d Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 14:42:17 -05:00
J. Nick Koston 062c542c36 Give worker log records their own line, harden the cancellation sentinel
A logging filter installed for the batch's duration ends a partial bar
row (under the bar's lock) before any record is emitted, so a mirror
retry warning from a worker is no longer overwritten by the next CR
frame. The Ctrl-C sentinel derives from BaseException so a broad
except Exception in the download layers cannot convert an abort into a
retry, an abandoned job is reported like a failure instead of reading
as a completed download, and the mirror-sweep backoff sleeps through
the cancellation tick so a Ctrl-C during a retry window aborts at the
boundary instead of after it. The docstring states the parked-socket
worst case.
2026-08-23 14:42:00 -05:00
J. Nick Koston f0ed1ac8ba Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 14:31:41 -05:00
J. Nick Koston 718157d37f Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 14:31:39 -05:00
J. Nick Koston a5c7757c4f Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 14:31:36 -05:00
J. Nick Koston f54f0bf60f Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 14:31:34 -05:00
J. Nick Koston f4321dbf17 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 14:31:32 -05:00
J. Nick Koston 46f36409ce Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 14:31:30 -05:00
J. Nick Koston b18e7997f1 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 14:31:28 -05:00
J. Nick Koston d23e9a205a Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 14:31:26 -05:00
J. Nick Koston 03a443c2b7 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 14:31:24 -05:00
J. Nick Koston 0c97e2b354 Route single-archive waves through the batch runner
A dependency chain (api -> noise-c -> libsodium) discovers one archive
per wave, so the <2 gate sent every chained download through the legacy
per-file path. Sized registry archives now always use the batch runner:
one download method, one bar; the per-file path remains only for
unknown-size, git, and local sources.
2026-08-23 14:31:18 -05:00
J. Nick Koston 6ae81d49b9 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 14:17:42 -05:00
J. Nick Koston 5166e1b207 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 14:17:40 -05:00
J. Nick Koston b6695239eb Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 14:17:38 -05:00
J. Nick Koston 24681da5e0 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 14:17:35 -05:00
J. Nick Koston cf3eac109c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 14:17:33 -05:00
J. Nick Koston 55323596a9 Resolve registry metadata once, canonicalize the ccache knob, disable on an empty value
registry_download memoizes per process (failures uncached), so the
prefetch and the install share one metadata round-trip per package.
The idf ccache env always hands idf.py exactly one canonical spelling:
the no-ccache path exports 0 so an unparsable inherited value or a
probe-rejected shim cannot enable it, the enabled path exports 1
whatever accepted spelling arrived, and forced-on still runs the
resolver for its no-binary warning. An empty env value keeps its
historical disable meaning instead of falling to the default policy.
2026-08-23 14:17:29 -05:00
J. Nick Koston a429721472 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 14:06:14 -05:00
J. Nick Koston a80b5a9dd0 Cover the flash-mode rejection and src-flag pass-through 2026-08-23 14:06:11 -05:00
J. Nick Koston b0b52bec81 Ungate the build_src_flags producer for the native generator
The generator now reads build_src_flags instead of hardcoding the
throw_stubs force-include, so the option must be set on both toolchains;
gated, the native build silently lost the include (+168 bytes of
libstdc++ throw strings). Verified byte-identical again.
2026-08-23 14:01:34 -05:00
J. Nick Koston 9e623309b4 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 13:57:24 -05:00
J. Nick Koston 1ccd3cdee8 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:57:22 -05:00
J. Nick Koston 14d8e5dbfe Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:57:20 -05:00
J. Nick Koston 3bb8b667fe Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 13:57:19 -05:00
J. Nick Koston ea270ae2a1 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:57:17 -05:00
J. Nick Koston 87a01b7ed9 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 13:57:15 -05:00
J. Nick Koston f8957a94f1 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 13:57:13 -05:00
J. Nick Koston 4803a92554 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 13:57:11 -05:00
J. Nick Koston 3a35c75ec1 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 13:57:09 -05:00
J. Nick Koston 8536d54998 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 13:57:07 -05:00
J. Nick Koston 10bccf3fc0 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-converter-hardening 2026-08-23 13:57:05 -05:00
J. Nick Koston b070d1631c Merge remote-tracking branch 'origin/dev' into esp8266-native-idedata-helpers 2026-08-23 13:57:03 -05:00
J. Nick Koston 350a2a84cc Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/components/esp8266/__init__.py
2026-08-23 13:56:47 -05:00
J. Nick Koston 4cc3012d98 Read build_src_flags from its producer, share the ldscript rule, shape-check flash_mode
The throw_stubs force-include now comes from the build_src_flags option
esp8266/__init__ pins, collapsing the two spellings to one source of
truth; -include paths resolve against the source root. The ldscript
fallback consumes boards.board_ld_script instead of duplicating the
per-board rule, flash_mode is checked against its closed set before
landing unquoted in the elf2bin command, and the board-gate comment no
longer names a nonexistent validator.
2026-08-23 13:56:27 -05:00
J. Nick Koston 39f6425170 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:54:27 -05:00
J. Nick Koston 7cf3ed848e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:54:26 -05:00
J. Nick Koston ad7d8eeeea Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 13:54:26 -05:00
J. Nick Koston 5e54e2e9ba Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:54:26 -05:00
J. Nick Koston 14a9a903c8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 13:54:26 -05:00
J. Nick Koston fba56787e7 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 13:54:26 -05:00
J. Nick Koston abcfaa1810 Share the per-board ldscript rule via boards.board_ld_script
One source of truth for the PlatformIO pinning and the native
generator's fallback, so the per-board rule cannot drift.
2026-08-23 13:54:22 -05:00
J. Nick Koston 6b5b13c17e Pin the LOW_MEMORY lwIP fall-through, veto the stamp on a stuck stale note
LOW_MEMORY is upstream's else branch, so the default variant stands in
for it and every listed knob wins -- pinned for the ordinary SNTP
multi-server config where esp8266's HIGHER_BANDWIDTH_LOW_FLASH must
prevail. A stale warn note that cannot be removed now vetoes the stamp
(mirror of the lost-note case), and the unreadable-cached-note warning
names its cause.
2026-08-23 13:51:54 -05:00
J. Nick Koston c822b80c95 Cover env access warnings and the unmodelled-subscript degrade 2026-08-23 13:49:03 -05:00
J. Nick Koston 51384f9743 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 13:37:27 -05:00
J. Nick Koston 4e37acdc01 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:37:24 -05:00
J. Nick Koston 9766f6e911 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:37:22 -05:00
J. Nick Koston 463a86be3c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
#	tests/unit_tests/test_platformio_library.py
2026-08-23 13:37:08 -05:00
J. Nick Koston 8011be1f61 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:36:14 -05:00
J. Nick Koston 713550ad7b Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 13:36:12 -05:00
J. Nick Koston 74a4bffb3d Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 13:36:10 -05:00
J. Nick Koston ae8aa3fee9 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 13:36:08 -05:00
J. Nick Koston ce0a0da42a Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 13:36:06 -05:00
J. Nick Koston 2199fcc851 Restore the malformed-manifest raises lost in the merge resolution 2026-08-23 13:35:52 -05:00
J. Nick Koston 84dc92f5ae Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:35:15 -05:00
J. Nick Koston ba58435d5f Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 13:35:13 -05:00
J. Nick Koston 9233f0f2f1 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 13:35:11 -05:00
J. Nick Koston 554e19ccdb Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 13:35:09 -05:00
J. Nick Koston 9662fea8b9 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 13:35:07 -05:00
J. Nick Koston b4031dc53a Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter
# Conflicts:
#	esphome/platformio/library.py
2026-08-23 13:35:04 -05:00
J. Nick Koston eb958bd0a0 Quote CPPDEFINES, warn on env access, degrade unmodelled subscripts, realify InvalidLibrary
CPPDEFINES joins the quoted buckets (a spaced define no longer splits
across tokens) and its tuple branch validates the pair elements. The
fake env warns on attribute access rather than call, so hasattr/
truthiness branches are diagnosable, with dunder probes excluded; an
unmodelled subscript warns and returns '' instead of a KeyError
discarding the whole capture. Malformed platforms/frameworks values
raise plain InvalidLibrary, giving the non-platform warning branches a
real producer, and their tests use real manifests instead of
monkeypatched raisers. The version-less dependency drop moves to debug:
bundled names (Wire, SPI) made it per-build noise nobody can act on.
2026-08-23 13:34:19 -05:00
J. Nick Koston 79fae3b709 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 13:19:31 -05:00
J. Nick Koston 93b0bdff2b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:19:29 -05:00
J. Nick Koston 38c9eb7568 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:19:27 -05:00
J. Nick Koston 87ed752797 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 13:19:25 -05:00
J. Nick Koston 55b3eb4e0d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:19:23 -05:00
J. Nick Koston f2eeebc3a1 Type the prefetch tracker 2026-08-23 13:19:19 -05:00
J. Nick Koston b2d0af3316 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 13:18:31 -05:00
J. Nick Koston 5aa61235e4 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:18:29 -05:00
J. Nick Koston b97ee5f939 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:18:27 -05:00
J. Nick Koston 68deff0851 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 13:18:25 -05:00
J. Nick Koston 0557d7c816 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:18:23 -05:00
J. Nick Koston b797c582ef Name the pending-archive tuple 2026-08-23 13:18:19 -05:00
J. Nick Koston c92b734bb9 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 13:17:28 -05:00
J. Nick Koston b805d73c07 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:17:26 -05:00
J. Nick Koston f03c8265ec Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:17:24 -05:00
J. Nick Koston 9013a6e6ad Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 13:17:22 -05:00
J. Nick Koston 4c8fdbb65b Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:17:20 -05:00
J. Nick Koston 7eb6de0c32 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 13:17:18 -05:00
J. Nick Koston f0be047453 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 13:17:16 -05:00
J. Nick Koston 2da0319eaa Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 13:17:14 -05:00
J. Nick Koston c376d32db4 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 13:17:12 -05:00
J. Nick Koston 59fc108aa7 Cover the prefetch blanket guard 2026-08-23 13:17:08 -05:00
J. Nick Koston 7af97902d2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 13:12:53 -05:00
J. Nick Koston 34456bc283 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:12:53 -05:00
J. Nick Koston f5ae74a25b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:12:53 -05:00
J. Nick Koston b582fa2257 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 13:12:53 -05:00
J. Nick Koston bc44803b5b Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:12:53 -05:00
J. Nick Koston 81e1774b18 Adapt the package prefetch to the folded batch-download API 2026-08-23 13:12:41 -05:00
J. Nick Koston 36c5e39371 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 13:10:39 -05:00
J. Nick Koston fd61eda4a2 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 13:10:39 -05:00
J. Nick Koston 8d45edbb3e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 13:10:39 -05:00
J. Nick Koston 2d44dacbed Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-23 13:10:36 -05:00
J. Nick Koston dc00335707 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 13:09:54 -05:00
J. Nick Koston 485725d734 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 13:09:54 -05:00
J. Nick Koston 0b598d18dc Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 13:09:53 -05:00
J. Nick Koston a272ca9e17 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 13:09:53 -05:00
J. Nick Koston e40537cc34 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 13:09:53 -05:00
J. Nick Koston 9d761102e5 Size the prefetch from the registry, fold the batch API, guard the prefetch
The registry response already carries each package file's size, so the
combined bar is sized from URLSource instead of a HEAD sweep; the probe,
its all-or-nothing fallback, and its duplicate Content-Length parsing are
gone, and archives without a reported size simply stay on the sequential
path. run_batch_downloads now takes (name, size, fetch) jobs and builds
the (now private) progress bar itself, collecting failures from future
results instead of a shared list; both call sites use functools.partial
instead of lambda factories. The prefetch touches only URLSource, so the
progress parameter comes off Source/Git/Local/ConvertedLibrary, and the
wave prefetch is wrapped best-effort like its ESP-IDF twin, which also
dedupes by dest only after the verifiability check. ProgressBar.done()
itself now skips the newline when no frame was drawn or the 100% frame
already ended the line, collapsing the batch wrapper's guard and fixing
the stray blank line after OTA uploads.
2026-08-23 13:08:32 -05:00
J. Nick Koston 1372ec8ad2 Trim the shape-key comment 2026-08-23 13:07:33 -05:00
J. Nick Koston c4ddad0237 Trim comments and docstrings 2026-08-23 12:57:59 -05:00
J. Nick Koston 6d4d9aa1ce Trim comments and docstrings 2026-08-23 12:57:17 -05:00
J. Nick Koston caff71c17a Trim comments and docstrings 2026-08-23 12:56:31 -05:00
J. Nick Koston 8e4c9c31e6 Merge branch 'esp8266-native-converter-hardening' into esp8266-native-library-converter 2026-08-23 12:55:57 -05:00
J. Nick Koston a478ae4a46 Trim comments and docstrings 2026-08-23 12:55:52 -05:00
J. Nick Koston 9c9ddea00c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 12:34:10 -05:00
J. Nick Koston 33c010e1b0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 12:34:08 -05:00
J. Nick Koston 7155d5446b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 12:34:06 -05:00
J. Nick Koston 590605c417 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 12:34:03 -05:00
J. Nick Koston dcd76ec9de Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 12:34:01 -05:00
J. Nick Koston 36ea8a2c17 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 12:33:59 -05:00
J. Nick Koston 7c7deba4e4 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 12:33:57 -05:00
J. Nick Koston bd69eab7fb Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 12:33:55 -05:00
J. Nick Koston 5adaee5408 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 12:33:53 -05:00
J. Nick Koston b903c884fd Absorb the converter-hardening split (#18685); this PR keeps only the download parallelization 2026-08-23 12:33:21 -05:00
J. Nick Koston 9731c9527a Harden the shared library converter
Split out of #18662: the converter/manifest hardening without the
download parallelization, which stays there.

The PIO extra-script shim moves from espidf/ to platformio/ and gains
type checks for every manifest field, capture of the Append variants and
CPPPATH, warn-once diagnostics for unmodelled env reads, and uniform
shlex quoting so captured values survive the lex_build_flags round-trip.
The dependency walk normalizes every spelling PIO accepts, splits the
routine cross-platform skip (IncompatiblePlatform) from real manifest
problems, validates manifest shape once, and the shared flag lexer
warns and drops trailing or empty glued arguments.
2026-08-23 12:32:44 -05:00
J. Nick Koston 8d0eab9111 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 12:19:24 -05:00
J. Nick Koston 9f6d66a2e7 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-23 12:18:51 -05:00
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 49bdd061b8 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 12:15:20 -05:00
J. Nick Koston 88cc355293 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 12:15:19 -05:00
J. Nick Koston 25b429de5d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 12:15:19 -05:00
J. Nick Koston 65f116eaf8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 12:15:19 -05:00
J. Nick Koston 9bb4fedc98 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 12:15:19 -05:00
J. Nick Koston f595a32434 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 12:15:19 -05:00
J. Nick Koston 1959913347 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 12:15:18 -05:00
J. Nick Koston 035555b24c Drop an empty glued flag argument at the lex funnel
shlex.split('-D ""') left a bare -D that gcc resolves by eating the
next flag; the funnel now warns and drops it for every consumer, which
also retires raise_on_empty_arg_flags, whose staged ESP8266 caller no
longer has anything to catch.
2026-08-23 12:15:04 -05:00
J. Nick Koston 1b255b429f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 12:05:21 -05:00
J. Nick Koston 15727692e0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 12:05:19 -05:00
J. Nick Koston 244e275dfb Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 12:05:17 -05:00
J. Nick Koston d53356a2b0 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 12:05:15 -05:00
J. Nick Koston 92ab6b7581 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 12:05:13 -05:00
J. Nick Koston 187df36971 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 12:05:11 -05:00
J. Nick Koston 353ce8a3a2 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 12:05:09 -05:00
J. Nick Koston f8de6fe0d1 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 12:05:07 -05:00
J. Nick Koston 5137c3f16b Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 12:05:05 -05:00
J. Nick Koston ea3ff0e372 Abort in-flight batch downloads on Ctrl-C, make the deferral test hermetic
cancel_futures only drops queued jobs, and the non-daemon workers are
joined at interpreter exit, so a Ctrl-C during the ESP-IDF toolchain
fetch waited out every in-flight archive. The tracker each job reports
through now checks a cancellation flag set when the wait raises, so
downloads abort at their next progress tick and the resumable .part
files keep the bytes already fetched.

The wave-deferral test stubs _content_lengths instead of issuing real
HEAD requests that passed only by failing, the dead hasattr branch in
the HEAD-probe test is gone, and the .C suffix comment names the SCons
divergence instead of claiming parity.
2026-08-23 12:04:49 -05:00
J. Nick Koston cf7c6151e7 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 11:37:10 -05:00
J. Nick Koston 23c1527cf0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 11:37:08 -05:00
J. Nick Koston bcc1004b5d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 11:37:06 -05:00
J. Nick Koston 3ea83b12f5 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 11:37:04 -05:00
J. Nick Koston 6b35e082bf Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 11:37:02 -05:00
J. Nick Koston 8a10914d8d Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 11:37:00 -05:00
J. Nick Koston af195eb1fc Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 11:36:58 -05:00
J. Nick Koston 1157189b36 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 11:36:56 -05:00
J. Nick Koston dd7a25b302 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 11:36:54 -05:00
J. Nick Koston 7c0e03f309 Capture the Append variants, warn on unmodelled env reads, quote every lexed bucket
Prepend/AppendUnique/PrependUnique write the same captured keys and now
alias Append instead of no-op'ing away a link directory. env.get on an
unmodelled var warns once so a script taking the default branch is
diagnosable. LIBS/LINKFLAGS/CPPFLAGS entries are shlex-quoted like the
path buckets, since each is one argv token in SCons and re-lexing must
not split a spaced value. The HEAD probes follow the happy-eyeballs
convention, and the tool-prefetch backstop keeps its traceback at debug.
2026-08-23 11:36:36 -05:00
J. Nick Koston 412bc4be7f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 10:48:54 -05:00
J. Nick Koston acc919e993 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 10:48:54 -05:00
J. Nick Koston 610d630cd4 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 10:48:54 -05:00
J. Nick Koston 34e2a82d8d Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 10:48:54 -05:00
J. Nick Koston 13eed46d28 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 10:48:54 -05:00
J. Nick Koston e660c126f8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 10:48:53 -05:00
J. Nick Koston 326b3bf3ee Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 10:48:53 -05:00
J. Nick Koston 4e172a5774 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 10:48:53 -05:00
J. Nick Koston e4a54b27ed Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 10:48:53 -05:00
J. Nick Koston 7b3330d5fe Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-library-converter 2026-08-23 10:48:53 -05:00
J. Nick Koston e681c441d9 Close the residual idedata and size-summary silent-failure findings
A list-of-non-dicts compile DB now raises by name inside the best-effort
tuple. The launcher rejection moved into parse_entry itself so no caller
can record ccache as the compiler, and the shape key includes the entry's
directory since relative includes resolve against it. format_bar raises
on a non-positive total so every consumer must handle the meaningless
bar; the espidf summary validates the RAM region by name (a malformed
region can no longer suppress a computable Flash line) and the blanket
backstop logs the traceback at debug. A new test pins that the CI
trigger paths exist on disk, so a rename fails loudly.
2026-08-23 10:48:39 -05:00
J. Nick Koston af08a45afe Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 10:37:31 -05:00
J. Nick Koston 2e97689afb Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 10:37:29 -05:00
J. Nick Koston 055b3ed198 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 10:37:27 -05:00
J. Nick Koston 115f8f6e4f Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 10:37:25 -05:00
J. Nick Koston f23b6072a9 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 10:37:23 -05:00
J. Nick Koston 0e28f0e399 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 10:37:21 -05:00
J. Nick Koston ec11e95b84 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 10:37:19 -05:00
J. Nick Koston 8cbb83a06d Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 10:37:16 -05:00
J. Nick Koston bac6530203 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 10:37:14 -05:00
J. Nick Koston 355d4788b8 Assert lexed tokens, not raw flag strings
shlex.quote wraps backslash paths on Windows, so the raw emitted strings
are platform-varying; lexing like the consumer does pins the behavior
that matters and passes on both separators.
2026-08-23 10:37:11 -05:00
J. Nick Koston caf758eaed Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-23 10:33:03 -05:00
J. Nick Koston 5bdb886190 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 10:33:03 -05:00
J. Nick Koston 8df7bc57de Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-23 10:33:03 -05:00
J. Nick Koston df71e76ce2 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-23 10:33:03 -05:00
J. Nick Koston ee4b38eb4c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 10:33:03 -05:00
J. Nick Koston e39738f2fd Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 10:33:02 -05:00
J. Nick Koston d34d112a43 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 10:33:02 -05:00
J. Nick Koston b8dac2dc89 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 10:33:02 -05:00
J. Nick Koston 585d818e7a Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 10:33:02 -05:00
J. Nick Koston 80b492f638 Quote emitted -I/-L paths so spaced directories survive re-lexing
lex_build_flags shlex-splits build.flags, so an unquoted spaced path
became two garbage tokens; shlex.quote at the emit site round-trips it
back to one.
2026-08-23 10:31:59 -05:00
J. Nick Koston 33aac54c8f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/components/esp32/__init__.py
2026-08-23 10:17:28 -05:00
J. Nick Koston d6df22f7fa Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-23 10:17:10 -05:00
J. Nick Koston 707a9fc893 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec
# Conflicts:
#	esphome/helpers.py
#	tests/unit_tests/test_helpers.py
2026-08-23 10:17:07 -05:00
J. Nick Koston 759c6aecc9 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-23 10:16:36 -05:00
J. Nick Koston 33e66a3a14 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-23 10:16:08 -05:00
J. Nick Koston 61fb0fdb6e Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-23 10:16:08 -05:00
J. Nick Koston 75f9007b77 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-23 10:16:07 -05:00
J. Nick Koston 692bb2a810 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-23 10:16:07 -05:00
J. Nick Koston 4a874a374a Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-23 10:16:06 -05:00
J. Nick Koston 54cd17591d Type-check extraScript, capture CPPPATH, surface version-less dependency drops
A non-string extraScript now fails naming the library instead of an opaque
TypeError, matching the hardening on every other manifest field. CPPPATH
joins the captured keys and translates to -I flags anchored like LIBPATH,
since the pipeline already routes -I to include dirs. Version-less
dependency drops log at INFO until the arduino-backend reconciliation
lands, and the wave-deferral comment now claims only what the guard
actually saves.
2026-08-23 10:15:52 -05:00
J. Nick Koston 98b595c95d Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-library-converter 2026-08-23 10:13:22 -05:00
J. Nick Koston e16cfded5d Merge remote-tracking branch 'origin/dev' into esp8266-native-idedata-helpers 2026-08-23 10:12:45 -05:00
J. Nick Koston 746b294ed7 Harden idedata against non-list compile DBs and stale caches, blanket the size summary
A compile DB that parses as valid JSON but is not a list now raises
EsphomeError inside IDEDATA_BEST_EFFORT_ERRORS instead of a TypeError that
fails an already-linked build. Cached idedata is validated on read against
the write path's guarantees (dict shape, no launcher as compiler, include
union present) so caches from older versions regenerate instead of serving
degraded data, and the served copy is re-stamped with the current ELF path.
Response-file shape sentinels key on the output object rather than the
source file, so two objects built from one source keep both include sets.

The size summary mirrors the standalone hardening PR: a blank partition
size cell raises by name, and a blanket guard keeps unexpected nested
shapes from raising past a build that already linked.
2026-08-23 10:12:40 -05:00
J. Nick Koston 2a2710d752 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 23:41:58 -05:00
J. Nick Koston c0be436a07 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 23:41:58 -05:00
J. Nick Koston 897ae28a19 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 23:41:58 -05:00
J. Nick Koston d2022c2ed9 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 23:41:57 -05:00
J. Nick Koston 230b6926ab Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 23:41:57 -05:00
J. Nick Koston 4f315ae8ba Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 23:41:57 -05:00
J. Nick Koston 4e88823faf Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 23:41:57 -05:00
J. Nick Koston ec6123e0ef Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 23:41:57 -05:00
J. Nick Koston da3c6dec7f Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-22 23:41:56 -05:00
J. Nick Koston cfac36c647 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-library-converter 2026-08-22 23:41:56 -05:00
J. Nick Koston d179f43e7c Correct the zero-partition comment: the skip fails CI extraction loudly, it does not feed it 2026-08-22 23:41:55 -05:00
J. Nick Koston c7772c384e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 23:23:43 -05:00
J. Nick Koston 7248e59ca3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 23:23:43 -05:00
J. Nick Koston 8ec4393e3f Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 23:23:41 -05:00
J. Nick Koston e842af8acb Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 23:23:41 -05:00
J. Nick Koston ad2a3e120a Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 23:23:41 -05:00
J. Nick Koston e5fcaf3892 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 23:23:40 -05:00
J. Nick Koston af16c444d4 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 23:23:40 -05:00
J. Nick Koston 327630523c Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 23:23:40 -05:00
J. Nick Koston 0e4f4237fd Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-22 23:23:40 -05:00
J. Nick Koston 96a74cd217 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-library-converter 2026-08-22 23:23:40 -05:00
J. Nick Koston dc64c93f39 [core] Register the OTA component in dummy_main like its siblings 2026-08-22 23:23:39 -05:00
J. Nick Koston 005aedd3a6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 23:21:08 -05:00
J. Nick Koston e25b6c4085 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 23:21:08 -05:00
J. Nick Koston 7bebe94e1c Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 23:21:07 -05:00
J. Nick Koston a3beb8fb3d Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 23:21:07 -05:00
J. Nick Koston d5e3d44fd4 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 23:21:07 -05:00
J. Nick Koston 32097fcb00 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 23:21:07 -05:00
J. Nick Koston 4bb0fa8761 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 23:21:07 -05:00
J. Nick Koston 1b109518f7 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 23:21:06 -05:00
J. Nick Koston 5793a5f08a Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-22 23:21:06 -05:00
J. Nick Koston 9d0d1b42d5 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-library-converter 2026-08-22 23:21:06 -05:00
J. Nick Koston 8230c16f12 Order the launcher strip before the empty guard, never dedupe rsp commands, harden the size summary 2026-08-22 23:21:04 -05:00
J. Nick Koston 3624ff6b19 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 23:10:58 -05:00
J. Nick Koston 57b5bb1b82 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 23:10:58 -05:00
J. Nick Koston dcc927f047 Mirror the damaged-file recovery tests into the chain 2026-08-22 23:10:58 -05:00
J. Nick Koston 505f4dee03 Mirror the damaged-file recovery tests into the chain 2026-08-22 23:10:37 -05:00
J. Nick Koston 1e5f7fe102 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 23:02:22 -05:00
J. Nick Koston ade226456e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 23:02:22 -05:00
J. Nick Koston bf547cd171 Recover only on decode errors; an OSError may hide an intact file 2026-08-22 23:02:20 -05:00
J. Nick Koston 6d3c78b5bc Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 23:00:19 -05:00
J. Nick Koston f326f7b527 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 23:00:19 -05:00
J. Nick Koston c6bd323b56 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 23:00:18 -05:00
J. Nick Koston 26941ef953 Capture INFO for the depends= visibility note 2026-08-22 23:00:03 -05:00
J. Nick Koston b302f4cb9a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 22:58:49 -05:00
J. Nick Koston fd077062c9 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 22:58:48 -05:00
J. Nick Koston a1d0713a54 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 22:58:48 -05:00
J. Nick Koston d37ebd5cd7 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 22:58:48 -05:00
J. Nick Koston e881502a25 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 22:58:48 -05:00
J. Nick Koston ef007e00d1 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 22:58:48 -05:00
J. Nick Koston 9e96d53868 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 22:58:47 -05:00
J. Nick Koston 905c806009 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 22:58:47 -05:00
J. Nick Koston 42f59f94c9 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-22 22:58:47 -05:00
J. Nick Koston 35bb8388a2 Defer superseded wave downloads, dedupe tool dests, validate captured buckets, right-size the log levels 2026-08-22 22:58:44 -05:00
J. Nick Koston 4b317deea3 Reconcile the provides() promise after resolving; name the double-warning invariant's pinning test 2026-08-22 22:54:56 -05:00
J. Nick Koston 1543709ddd Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 22:40:59 -05:00
J. Nick Koston c2c6cf9398 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 22:40:59 -05:00
J. Nick Koston 45617376ef Catch only EsphomeError; read_file wraps the decode error too 2026-08-22 22:40:48 -05:00
J. Nick Koston a424629ab6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 22:39:49 -05:00
J. Nick Koston b2111b5070 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 22:39:49 -05:00
J. Nick Koston a41dc7dfff Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 22:39:49 -05:00
J. Nick Koston 99ec278c67 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 22:39:48 -05:00
J. Nick Koston 6b7a56be67 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 22:39:48 -05:00
J. Nick Koston 6a0e7dc595 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 22:39:48 -05:00
J. Nick Koston 6fda5b9a07 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 22:39:48 -05:00
J. Nick Koston 9adba2ac06 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 22:39:48 -05:00
J. Nick Koston 5ac6e2b3c6 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-22 22:39:47 -05:00
J. Nick Koston b08026e413 Trigger the IDF infra job on the extraScript shim now that it exists 2026-08-22 22:39:34 -05:00
J. Nick Koston f6c6708f24 Merge branch 'esp8266-native-idedata-helpers' into esp8266-native-library-converter 2026-08-22 22:39:33 -05:00
J. Nick Koston 48c6948ae8 Guard empty compile commands, refuse a compile DB with no ESPHome TU, share the launcher rejection 2026-08-22 22:39:16 -05:00
J. Nick Koston d1299430bb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 22:32:38 -05:00
J. Nick Koston a75ea8225c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 22:32:38 -05:00
J. Nick Koston e10339a35e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 22:32:38 -05:00
J. Nick Koston 7445b47648 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 22:32:38 -05:00
J. Nick Koston f65aa87450 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 22:32:37 -05:00
J. Nick Koston 2dfa23f5e5 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 22:32:37 -05:00
J. Nick Koston e4911b4cc2 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 22:32:37 -05:00
J. Nick Koston e714ef4dfc Reconcile BOARDS with the generated table: d1_wroom_02 joins with its shipped flash layout 2026-08-22 22:32:26 -05:00
J. Nick Koston 538942153d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/components/esp8266/__init__.py
2026-08-22 22:30:05 -05:00
J. Nick Koston cd3cdde87c Preserve d1_wroom_02's shipped flash layout, refuse plain linker unflags, pin the real spaced-override outcome 2026-08-22 22:29:21 -05:00
J. Nick Koston 013a27bee9 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 22:17:28 -05:00
J. Nick Koston 4577d69ca9 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-08-22 22:17:26 -05:00
J. Nick Koston 5a256abd65 Give the lwIP variants named fields 2026-08-22 22:17:02 -05:00
J. Nick Koston dce5185cef Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 22:11:45 -05:00
J. Nick Koston a7e5ac9dea Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 22:11:44 -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 476852c84f Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-08-22 22:11:14 -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 4146f23ba3 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 22:05:04 -05:00
J. Nick Koston f0203528f5 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 22:05:04 -05:00
J. Nick Koston cd291fb35b Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 22:05:04 -05:00
J. Nick Koston d2ed17b688 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 22:05:04 -05:00
J. Nick Koston e9466ff738 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-22 22:05:03 -05:00
J. Nick Koston b9317de2e8 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 22:05:03 -05:00
J. Nick Koston 4d6300b400 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 22:05:03 -05:00
J. Nick Koston 030e79fa5a Keep the empty-argument flag check next to the lexer that leaves the bare token 2026-08-22 22:04:47 -05:00
J. Nick Koston da9c0bdd14 Merge branch 'esp8266-native-library-converter' into esp8266-native-shared-helpers 2026-08-22 21:59:57 -05:00
J. Nick Koston a1e6370e8b [core] Harden the shared library converter and download registry archives in parallel 2026-08-22 21:59:19 -05:00
J. Nick Koston dada0f2c2b [core] Extract the shared idedata and size-summary helpers into build_helpers 2026-08-22 21:58:41 -05:00
J. Nick Koston 9fe10af350 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 21:55:44 -05:00
J. Nick Koston a5947beb07 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 21:55:44 -05:00
J. Nick Koston 9624c918e7 Hoist the invariant framework and arch define groups 2026-08-22 21:55:42 -05:00
J. Nick Koston 2fe3eaf97d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 21:50:50 -05:00
J. Nick Koston 2bfbc72147 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-08-22 21:50:38 -05:00
J. Nick Koston 4803ced57d Reunite the SDK-table comment with its table 2026-08-22 21:50:08 -05:00
J. Nick Koston 2c44df9efa Hoist the common linker-script names 2026-08-22 21:49:45 -05:00
J. Nick Koston aadc10944c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-08-22 21:49:06 -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 24ea73a626 Gate the zero-test guard behind a flag, keep the upload path import-free, verify all artifacts, regenerate a stale compile DB 2026-08-22 21:47:03 -05:00
J. Nick Koston 9d4df93676 Assert the launcher string verbatim; Path normalization diverged on Windows 2026-08-22 21:42:53 -05:00
J. Nick Koston 390ca116bc Name the idedata consumers in the arduino backend's warning too 2026-08-22 21:42:15 -05:00
J. Nick Koston 2d325a9eee Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 21:42:14 -05:00
J. Nick Koston fbe5a02d6f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 21:42:14 -05:00
J. Nick Koston 9e3c84ff1b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 21:42:13 -05:00
J. Nick Koston c7d7a7ba75 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 21:41:58 -05:00
J. Nick Koston a5e87d3c8f Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 21:41:57 -05:00
J. Nick Koston ba1ad765ea Name the probe failure cause in the tool-version warning 2026-08-22 21:41:50 -05:00
J. Nick Koston 767bb61a14 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 21:41:28 -05:00
J. Nick Koston 21abf1692b Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 21:41:27 -05:00
J. Nick Koston a22c2a9768 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 21:41:27 -05:00
J. Nick Koston 18206967a1 Validate captured CPPDEFINES, warn on empty idedata includes, name the idedata consumers 2026-08-22 21:40:57 -05:00
J. Nick Koston beceab6327 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 21:30:41 -05:00
J. Nick Koston 822bb1d88f Drop the stale ccache_path patch from the write_project test 2026-08-22 21:29:50 -05:00
J. Nick Koston 9487cf6b7c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 21:29:33 -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 70765dd52a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 21:28:28 -05:00
J. Nick Koston 32a0fff6b8 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 21:28:28 -05:00
J. Nick Koston 586bc114fa Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 21:28:28 -05:00
J. Nick Koston 2f0ad8a57d Surface unexpected prefetch failures; restore the dropped cache-path rationales 2026-08-22 21:28:18 -05:00
J. Nick Koston 75150fda52 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 21:27:39 -05:00
J. Nick Koston 791e2b8204 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 21:27:39 -05:00
J. Nick Koston ce52b93249 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 21:27:39 -05:00
J. Nick Koston d9e18ee982 Support subscript env reads in extra scripts; make the INFO-capture fixture real 2026-08-22 21:27:31 -05:00
J. Nick Koston a003fb848a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 21:24:08 -05:00
J. Nick Koston e465839d17 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 21:24:08 -05:00
J. Nick Koston 319fdf6deb Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 21:24:08 -05:00
J. Nick Koston 13d1933873 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 21:24:07 -05:00
J. Nick Koston 44d447ada0 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 21:24:07 -05:00
J. Nick Koston f49a5879c3 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 21:24:07 -05:00
J. Nick Koston 918444ecbb Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 21:24:07 -05:00
J. Nick Koston d26d3fdc33 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 21:24:06 -05:00
J. Nick Koston 227f5c67e2 Merge remote-tracking branch 'origin/dev' into esp8266-native-shared-helpers
# Conflicts:
#	tests/unit_tests/test_main.py
2026-08-22 21:23:40 -05:00
J. Nick Koston d43770b6d4 Drop a stale ccache_path patch from the write_project test 2026-08-22 21:22:41 -05:00
J. Nick Koston cc73c0c67e Dispatch esptool flashing via the backend hook, share the native trigger files, gate the probe, cache the closure 2026-08-22 21:21:25 -05:00
J. Nick Koston ff84e53ff1 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 21:19:00 -05:00
J. Nick Koston 0f3ac3b0e3 Point the board-check comment at the validator that now exists 2026-08-22 21:18:58 -05:00
J. Nick Koston aa63eb9734 Move the resolve-for-me ccache sentinel to its one consumer 2026-08-22 21:18:48 -05:00
J. Nick Koston 9144ae462d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 21:17:55 -05:00
J. Nick Koston ec3f7fb411 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 21:17:54 -05:00
J. Nick Koston aa5700d150 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 21:17:54 -05:00
J. Nick Koston c15df918f5 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-22 21:17:37 -05:00
J. Nick Koston 3d540b1597 Require a resolved ccache, dedupe the package specs, use the shared cache spec 2026-08-22 21:16:27 -05:00
J. Nick Koston ca79cb1a20 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer
# Conflicts:
#	esphome/writer.py
2026-08-22 21:14:48 -05:00
J. Nick Koston e557e84468 Route the registry prefetch through the shared downloader; register tools caches in one table 2026-08-22 21:14:18 -05:00
J. Nick Koston 5c30acfe5b Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 21:12:39 -05:00
J. Nick Koston cc27854fb2 Point the consumed-options comment at its now-real consumer 2026-08-22 21:12:37 -05:00
J. Nick Koston 044d593f09 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 21:12:36 -05:00
J. Nick Koston 68e04f5982 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 21:12:36 -05:00
J. Nick Koston d6d80ee323 Consolidate the batch-download scaffold, share the idedata error set, dedupe compdb tokenizing 2026-08-22 21:12:20 -05:00
J. Nick Koston 64d0137ab8 Verify build artifacts and surface probe diagnostics; fail on a zero-test CI run 2026-08-22 20:49:02 -05:00
J. Nick Koston 53cfdc92ba Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 20:26:38 -05:00
J. Nick Koston 13ae59378d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 20:26:38 -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 1b0d20e72e Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 20:13:48 -05:00
J. Nick Koston 72b37a0bf2 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 20:13:48 -05:00
J. Nick Koston 378d5f53e3 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 20:13:48 -05:00
J. Nick Koston fa5d1c57f9 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 20:13:48 -05:00
J. Nick Koston 2218743c4a Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 20:13:47 -05:00
J. Nick Koston de709dec71 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 20:13:47 -05:00
J. Nick Koston 2e3dc3c514 Note the consumed-options export is unused until the backend lands 2026-08-22 20:13:45 -05:00
J. Nick Koston 0dfe029863 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 20:01:32 -05:00
J. Nick Koston 7460f8df1a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 20:01:32 -05:00
J. Nick Koston eeb26a375f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 20:01:32 -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 149ca8c954 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 20:01:31 -05:00
J. Nick Koston 45c4a9b143 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 20:01:31 -05:00
J. Nick Koston bf0a4ea40f Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 20:01:31 -05:00
J. Nick Koston 0d33c3bf07 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 20:01:31 -05:00
J. Nick Koston 2acba9b364 Materialize the tracker mock before the prefetch threads race its creation 2026-08-22 20:01:13 -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 4fa3ad4381 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 19:55:34 -05:00
J. Nick Koston 19bb36c7ff Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 19:55:34 -05:00
J. Nick Koston f9e3caeeff Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 19:55:34 -05:00
J. Nick Koston 36b0b62a8f Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 19:55:33 -05:00
J. Nick Koston a174c306d8 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 19:55:33 -05:00
J. Nick Koston 35f3087fcc Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 19:55:33 -05:00
J. Nick Koston 8475a4bf09 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 19:55:33 -05:00
J. Nick Koston 715a7ab58f Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 19:55:33 -05:00
J. Nick Koston f4bc7dda35 Fault the cache read directly so the unreadable-cache test holds on Windows 2026-08-22 19:55:16 -05:00
J. Nick Koston a80db169a4 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 19:46:47 -05:00
J. Nick Koston 93ce8ac58e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 19:46:46 -05:00
J. Nick Koston eff99be8fa Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 19:46:46 -05:00
J. Nick Koston 3e4ace6b84 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 19:46:46 -05:00
J. Nick Koston d72e2f1c60 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 19:46:46 -05:00
J. Nick Koston 5ba4dc7704 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 19:46:46 -05:00
J. Nick Koston cbbc0a8fa9 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 19:46:45 -05:00
J. Nick Koston 1f0fa0ef8b Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 19:46:45 -05:00
J. Nick Koston 7d246893be Surface prefetch failures, harden the idedata and build-info cache reads 2026-08-22 19:46:42 -05:00
J. Nick Koston cf5fd1f36a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 19:32:13 -05:00
J. Nick Koston 84376f0da6 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 19:32:13 -05:00
J. Nick Koston a401567f08 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 19:32:13 -05:00
J. Nick Koston 225c3f4cdb Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 19:32:13 -05:00
J. Nick Koston ce3f90d377 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 19:32:13 -05:00
J. Nick Koston 3697401bc7 Serialize prefetch downloads on the install lock; export the canonical ccache off spelling 2026-08-22 19:32:10 -05:00
J. Nick Koston 4aafc96ef7 Pin the analyze-memory ELF guard in tests 2026-08-22 19:18:13 -05:00
J. Nick Koston 2af06e3b53 Use the exported consumed-options set, guard the analyze-memory ELF, trigger on the cache action 2026-08-22 19:16:50 -05:00
J. Nick Koston c26f77fe62 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 19:15:09 -05:00
J. Nick Koston c3eeb3fa2a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-22 19:15:07 -05:00
J. Nick Koston c7efd89a3d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 19:14:41 -05:00
J. Nick Koston c3297c2663 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 19:14:41 -05:00
J. Nick Koston 7be255b9ba Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 19:14:41 -05:00
J. Nick Koston c3129d598c Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 19:14:41 -05:00
J. Nick Koston 82b20313b0 Export the consumed platformio_options set so the ignored-option warning cannot drift 2026-08-22 19:14:32 -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 b5219d3c60 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 17:24:38 -05:00
J. Nick Koston 050aa1ea21 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 17:24:38 -05:00
J. Nick Koston 09d349882e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 17:24:38 -05:00
J. Nick Koston 2a1af47cef Normalize git tails in external short names; surface the name-match suppressions 2026-08-22 17:24:26 -05:00
J. Nick Koston 7e8b033860 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 17:10:24 -05:00
J. Nick Koston a7fe085e87 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 17:10:24 -05:00
J. Nick Koston aa3330071a Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 17:10:24 -05:00
J. Nick Koston 27aef88077 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 17:10:23 -05:00
J. Nick Koston a5fde9429d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 17:10:23 -05:00
J. Nick Koston e63d995d1f Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 17:10:23 -05:00
J. Nick Koston ad0859c5bd Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 17:10:23 -05:00
J. Nick Koston 385e2a92d2 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 17:10:23 -05:00
J. Nick Koston bff8bea83e Degrade garbage Content-Length probes; never prefetch an unverifiable tool archive 2026-08-22 17:10:19 -05:00
J. Nick Koston aaf27d0e90 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 16:59:09 -05:00
J. Nick Koston a143d192c5 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 16:59:09 -05:00
J. Nick Koston beb605a2d7 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 16:59:09 -05:00
J. Nick Koston f3ae985f67 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 16:59:09 -05:00
J. Nick Koston 0c5586c7dc Download the Arduino core and toolchain archives in parallel 2026-08-22 16:59:07 -05:00
J. Nick Koston 4ece0da68c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 16:58:37 -05:00
J. Nick Koston 712ee229e5 Prefetch pending registry packages in parallel under one combined bar 2026-08-22 16:58:24 -05:00
J. Nick Koston b5fbb767c2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 16:41:54 -05:00
J. Nick Koston e9c2363a38 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 16:41:53 -05:00
J. Nick Koston 727197d07a Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 16:41:53 -05:00
J. Nick Koston 0df7736d75 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 16:41:53 -05:00
J. Nick Koston 80c9c4cef3 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 16:41:53 -05:00
J. Nick Koston bc98ba3b46 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 16:41:52 -05:00
J. Nick Koston 3974a810bc Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 16:41:52 -05:00
J. Nick Koston dcf921d5f6 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 16:41:52 -05:00
J. Nick Koston 49d060fdfd Correct the _content_lengths contract docs and pin the unknown-size fallback 2026-08-22 16:41:40 -05:00
J. Nick Koston e3d731b1df Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 16:38:32 -05:00
J. Nick Koston 39d18e7411 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 16:38:31 -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 53fb66616c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 16:16:23 -05:00
J. Nick Koston 0ace5d0415 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 16:16:23 -05:00
J. Nick Koston 8f3e9f97c0 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 16:16:23 -05:00
J. Nick Koston f1c751c3b4 Rename the link-field guard to match its raising behavior 2026-08-22 16:16:14 -05:00
J. Nick Koston 3219f02e23 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/__main__.py
2026-08-22 16:10:47 -05:00
J. Nick Koston b024fd53dd Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 16:10:10 -05:00
J. Nick Koston 466d67788e Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 16:10:09 -05:00
J. Nick Koston f2f5ea127e Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 16:10:09 -05:00
J. Nick Koston a4c1c89e67 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 16:10:09 -05:00
J. Nick Koston ebafc439ac Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 16:10:09 -05:00
J. Nick Koston 2acde317d2 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 16:10:08 -05:00
J. Nick Koston d1d2f186ab Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 16:10:08 -05:00
J. Nick Koston f2ff1cc986 Keep per-file bars when sizes are unknown; harden the prefetch probes
An unknown Content-Length (probe failure, non-2xx, or a CDN omitting it
on HEAD) now skips the parallel prefetch so the sequential downloads
keep their per-file bars, instead of a silent multi-MB batch; the HEAD
helper returns None for unknown, distinct from a genuine zero, and
catches only RequestException. The cache probe logs its failure at
debug. The espidf tool prefetch reads sizes with .get so a missing size
only drops the bar instead of aborting the resumable prefetch. The
idedata warning logs its traceback at debug for parser regressions, and
framework_helpers joins the ESP-IDF infra CI triggers it is imported
by.
2026-08-22 16:10:03 -05:00
J. Nick Koston 5681890f74 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 15:58:12 -05:00
J. Nick Koston 7d51911102 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 15:58:11 -05:00
J. Nick Koston 792685facf Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 15:58:11 -05:00
J. Nick Koston 77704c0909 Refuse unsupported manifest features by name; drop the dead warn branch
A bundled manifest relying on an extraScript, or any manifest declaring
precompiled/ldflags, now raises naming the library instead of warning
into a link failure far from the cause. The backend-side usability
re-check logs all InvalidLibrary causes at debug with an accurate
comment: the walk runs dependency_is_usable on every versioned entry
before the provides() skip, so the fault always warns there first (a
real-converter test pins the once-only warning). build_tool handles a
missing subcommand with its named error instead of an IndexError.
2026-08-22 15:57:30 -05:00
J. Nick Koston 5ae3009791 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 15:51:43 -05:00
J. Nick Koston 11964b86a8 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 15:51:42 -05:00
J. Nick Koston 3f006545c1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 15:51:42 -05:00
J. Nick Koston 1a64f03994 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 15:51:42 -05:00
J. Nick Koston f8484158ad Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 15:51:42 -05:00
J. Nick Koston a7777e4589 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 15:51:41 -05:00
J. Nick Koston 4e6a8e297e Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 15:51:41 -05:00
J. Nick Koston 2315f54f2e Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 15:51:41 -05:00
J. Nick Koston 86ac8f661b Fold the dependency-entry validation into one helper
The name and version checks were duplicated across the dict-shorthand
and list spellings with four identical warnings; _valid_dependency_entry
carries them once.
2026-08-22 15:51:38 -05:00
J. Nick Koston a97479105f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 15:47:13 -05:00
J. Nick Koston a2e4664e87 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 15:47:12 -05:00
J. Nick Koston 9d38ac8d6c Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 15:47:12 -05:00
J. Nick Koston 7694ffb5ac Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-22 15:47:09 -05:00
J. Nick Koston 7f6aaeb46c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 15:46:47 -05:00
J. Nick Koston 7a938af0f8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 15:46:47 -05:00
J. Nick Koston 689861ffc9 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 15:46:47 -05:00
J. Nick Koston 776b3844f9 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 15:46:47 -05:00
J. Nick Koston eec01ea793 Diagnosable prefetch failures, Ctrl-C-safe pool, typed dependency versions
The library prefetch pool now cancels queued futures on interrupt like
the espidf pool it mirrors, prefetch and HEAD failures log their cause
at debug (a suppressed bar is traceable), and non-2xx HEAD statuses read
as unknown size. normalize_dependencies rejects a non-string version in
both spellings (a container would raise from set.add(); an int fails
opaquely in the registry), and the walk's version-less skip logs the
dependency at debug until the arduino-backend reconciliation lands.
2026-08-22 15:46:38 -05:00
J. Nick Koston b888d41cb9 Diagnosable prefetch failures, Ctrl-C-safe pool, typed dependency versions
The library prefetch pool now cancels queued futures on interrupt like
the espidf pool it mirrors, prefetch and HEAD failures log their cause
at debug (a suppressed bar is traceable), and non-2xx HEAD statuses read
as unknown size. normalize_dependencies rejects a non-string version in
both spellings (a container would raise from set.add(); an int fails
opaquely in the registry), and the walk's version-less skip logs the
dependency at debug until the arduino-backend reconciliation lands.
2026-08-22 15:46:06 -05:00
J. Nick Koston 3635c05fa5 Non-destructive platform_version check, honest compdb errors, missing-binutils refusal
The platform_version pop defaults to the schema spec so a second
validation pass over an already-validated dict cannot warn about a key
the user never set. An unparsable compile database now fails naming the
parse error and the offending output instead of blaming renamed ninja
rules. analyze-memory validates the native objdump/readelf exist and
fails by tool name rather than silently analyzing with host binutils.
The shared smoke-test helper is renamed _toolchain_components_to_test
(it serves the esp32 PlatformIO job too), and the decode-dedup state is
cleared by an autouse fixture instead of by hand.
2026-08-22 15:36:49 -05:00
J. Nick Koston 51ae50cb27 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 15:33:41 -05:00
J. Nick Koston 77915bd03e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 15:33:41 -05:00
J. Nick Koston 160299a41e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 15:33:41 -05:00
J. Nick Koston 8b76d61e8f Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 15:33:40 -05:00
J. Nick Koston 8bcf42921a Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 15:33:40 -05:00
J. Nick Koston b3f058613c Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 15:33:40 -05:00
J. Nick Koston 97701122be Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 15:33:40 -05:00
J. Nick Koston f1d043c840 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 15:33:40 -05:00
J. Nick Koston 1eda5a8534 Skip already-cached archives in the download prefetch
The wave logged 'Downloading N libraries' before checking the
extraction markers, so a warm build announced downloads it never made.
URLSource gains an is_cached probe (best-effort in the prefetch) and a
fully warm wave stays silent.
2026-08-22 15:33:37 -05:00
J. Nick Koston 0910604166 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 15:25:48 -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 3641621b0e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 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 1652088009 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 15:21:04 -05:00
J. Nick Koston ff8f9786e9 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 15:21:04 -05:00
J. Nick Koston 4cbfdd3200 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra
# Conflicts:
#	tests/unit_tests/test_framework_helpers.py
2026-08-22 15:21:01 -05:00
J. Nick Koston 520bf3f63b Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 15:20:42 -05:00
J. Nick Koston 1f2b532394 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 15:20:42 -05:00
J. Nick Koston 1cf5df3d59 Merge the espidf parallel-prefetch branch and give library downloads its combined bar
Brings in #18513 (BatchDownloadProgress and the download_with_resume
progress callback) and extends the plumbing one level:
download_from_mirrors passes a progress callback to both target kinds,
Source/ConvertedLibrary.download thread it through, and the library
wave prefetch draws one combined bar sized by parallel HEAD requests
(no sizes, no bar). The thread-local bar suppression this replaces is
removed; a batch caller passing a tracker also owns the messaging, so
the per-file Downloading line only prints for solo downloads.
2026-08-22 15:19:58 -05:00
J. Nick Koston e8dea9b07f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 15:10:17 -05:00
J. Nick Koston 2e570bdc02 Correct the board-check comment; note the override behavior of get_flash_ld_path 2026-08-22 15:10:14 -05:00
J. Nick Koston e00229d22c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 15:06:32 -05:00
J. Nick Koston 7c47cbdb73 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-08-22 15:06:30 -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 ae38e587fa Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 15:03:22 -05:00
J. Nick Koston a2a93cc186 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 15:03:21 -05:00
J. Nick Koston ae141a4712 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 15:03:21 -05:00
J. Nick Koston 6171561b70 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 15:03:21 -05:00
J. Nick Koston b29fbe5839 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 15:03:21 -05:00
J. Nick Koston 58eea37e10 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 15:03:21 -05:00
J. Nick Koston 91836a8c69 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 15:03:20 -05:00
J. Nick Koston 35af304911 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 15:03:20 -05:00
J. Nick Koston f4482275cb Pin sortedness on a nested fixture in the comment-order test 2026-08-22 15:03:07 -05:00
J. Nick Koston 298c78ff09 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:54:58 -05:00
J. Nick Koston 4aba6c4670 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:54:58 -05:00
J. Nick Koston 5f2d0b9e93 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 14:54:58 -05:00
J. Nick Koston 4ebdd88d7b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:54:58 -05:00
J. Nick Koston 241e804879 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:54:58 -05:00
J. Nick Koston d653a550bb Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 14:54:57 -05:00
J. Nick Koston f599e37375 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:54:57 -05:00
J. Nick Koston 6f79518ee2 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 14:54:57 -05:00
J. Nick Koston fd7e340e81 Type-hint the to_code test stub 2026-08-22 14:54:39 -05:00
J. Nick Koston 84a8ac3772 Use a docstring instead of pass in the to_code test stub 2026-08-22 14:54:24 -05:00
J. Nick Koston 2c6cbdef4d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:52:41 -05:00
J. Nick Koston 961bff4790 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:52:40 -05:00
J. Nick Koston 469fd5b2c4 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 14:52:40 -05:00
J. Nick Koston 9f64d54e50 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:52:40 -05:00
J. Nick Koston 9be1a67400 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:52:40 -05:00
J. Nick Koston cb02e15184 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 14:52:40 -05:00
J. Nick Koston 910147139a Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:52:39 -05:00
J. Nick Koston ab49aff931 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 14:52:39 -05:00
J. Nick Koston 4a459e3d0d Lift the remaining function-local imports in test_main to top level 2026-08-22 14:52:38 -05:00
J. Nick Koston 612775908e Never substitute a URL-pinned dependency; rename the header-suffix set; warn on real bundled suppression
A dependency whose version is a repository URL names one specific
source, so it is now detected before the backend-provided skip and
resolves as git instead of being replaced by the bundled copy. The
library header-suffix set becomes LIBRARY_HEADER_SUFFIXES so it cannot
shadow esphome.const's narrower HEADER_FILE_EXTENSIONS. Suppressing a
genuinely bundled name on an external short-name match warns (an
accidental collision would surface as link errors), a converted library
with no sources and no headers warns by name, and the walk's
unreachable nameless-dependency check is gone.
2026-08-22 14:52:07 -05:00
J. Nick Koston 680753dbef Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-22 14:50:04 -05:00
J. Nick Koston 8a4ade10e6 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:49:42 -05:00
J. Nick Koston 8cffd44ffd Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 14:49:42 -05:00
J. Nick Koston e16008fc58 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 14:49:42 -05:00
J. Nick Koston 35a1136bea Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:49:41 -05:00
J. Nick Koston 3b091676bf Drop the unreachable nameless-dependency check in the walk
normalize_dependencies guarantees every entry carries a non-empty
string name, so only the version can be absent.
2026-08-22 14:49:39 -05:00
J. Nick Koston 4d9da7284e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:44:18 -05:00
J. Nick Koston fd82f0f4bf Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:44:18 -05:00
J. Nick Koston 0883b6e5aa Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:44:18 -05:00
J. Nick Koston ef93ebb67b Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 14:44:17 -05:00
J. Nick Koston 622be18709 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:44:17 -05:00
J. Nick Koston ade6dbabae Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 14:44:17 -05:00
J. Nick Koston 182dc7f636 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 14:44:17 -05:00
J. Nick Koston d7af5f37b6 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:44:17 -05:00
J. Nick Koston 121795fa8d Trim comment and docstring essays 2026-08-22 14:44:12 -05:00
J. Nick Koston 28107bf966 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:41:35 -05:00
J. Nick Koston 594cc89b38 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:41:34 -05:00
J. Nick Koston 8fb771eec8 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:41:34 -05:00
J. Nick Koston 38be558603 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 14:41:34 -05:00
J. Nick Koston 4e48764bbe Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:41:34 -05:00
J. Nick Koston deecfade13 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 14:41:34 -05:00
J. Nick Koston ec237a2d06 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 14:41:33 -05:00
J. Nick Koston a2267eb686 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:41:33 -05:00
J. Nick Koston dbd6f323c0 Extract the build-info staleness check so its branches are testable
copy_src_tree is always mocked in the writer tests, so the new
missing/stale/unreadable debug branches were unreachable; the decision
moves into _build_info_stale with a test covering every branch.
2026-08-22 14:41:30 -05:00
J. Nick Koston 23bc88355b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:38:09 -05:00
J. Nick Koston 342b61ef84 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:38:09 -05:00
J. Nick Koston 2903aa7c3e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:38:09 -05:00
J. Nick Koston e4cb1d4f27 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 14:38:09 -05:00
J. Nick Koston 62a4cb3fe4 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:38:09 -05:00
J. Nick Koston d3eaac6f47 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 14:38:08 -05:00
J. Nick Koston 2eec194d87 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing
# Conflicts:
#	tests/unit_tests/test_main.py
2026-08-22 14:38:04 -05:00
J. Nick Koston 3a9a6edc0e Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:37:46 -05:00
J. Nick Koston 11875ec040 Dump the main.cpp config comment with sorted keys
voluptuous fills schema defaults in set-iteration order, so the
validated dict's key order changes with the process hash seed; the
unsorted dump churned the comment block in main.cpp and relinked the
firmware on every esphome run for any config using a defaults-heavy
action (logger.log in a button's on_press was enough). Affects the
PlatformIO path identically.
2026-08-22 14:37:42 -05:00
J. Nick Koston 42134329e3 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:31:40 -05:00
J. Nick Koston f9f642b81d Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:31:39 -05:00
J. Nick Koston 2e9ba5fa2d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:31:39 -05:00
J. Nick Koston eddb5981da Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 14:31:39 -05:00
J. Nick Koston 51221688f6 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:31:39 -05:00
J. Nick Koston f695e9dceb Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 14:31:39 -05:00
J. Nick Koston d8f6368716 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 14:31:38 -05:00
J. Nick Koston a97b836012 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:31:38 -05:00
J. Nick Koston afeb1a5ea1 Name the changed source when the writer flags a rebuild
Every sources_changed site now logs which file (or which build-info
staleness) triggered it, so a config that relinks on every run can be
diagnosed from one -v compile instead of diffing the build tree.
2026-08-22 14:31:36 -05:00
J. Nick Koston 57248d3d6f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:21:11 -05:00
J. Nick Koston 007cd61fe4 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:21:11 -05:00
J. Nick Koston b435bb9d4f Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:21:11 -05:00
J. Nick Koston 557ba9953d Fail by name on a missing libraries dir; single frameworks warning; fix a vacuous test
A framework tree without libraries/ now raises naming the path instead
of silently rerouting every bundled name to the registry, matching the
empty-bundled-dir error. check_library_data accepts framework=None to
skip the framework check (mirroring platform=None), so the backend-side
platform re-check no longer re-fires the frameworks-mismatch warning
the walk already emitted. The platform-rejection-is-debug test patched
the wrong module and asserted nothing; it now patches the backend's
import and asserts the dependency is absent from the resolved set.
2026-08-22 14:21:08 -05:00
J. Nick Koston 1d88a5a92b Keep no-op rebuilds quiet
A -n dry-run probe answers 'no work to do' without the real ninja spawn,
and running with cwd instead of -C drops the 'Entering directory' banner
on real builds too.
2026-08-22 14:14:37 -05:00
J. Nick Koston 3985ca5d51 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 14:12:57 -05:00
J. Nick Koston b247df7692 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 14:12:57 -05:00
J. Nick Koston 0e1c7cbb7e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 14:12:57 -05:00
J. Nick Koston a890527ab3 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-22 14:12:54 -05:00
J. Nick Koston 2d2750e031 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 14:11:40 -05:00
J. Nick Koston 0d508ccbc0 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra
# Conflicts:
#	tests/unit_tests/test_framework_helpers.py
2026-08-22 14:11:26 -05:00
J. Nick Koston bf7a617934 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 14:11:02 -05:00
J. Nick Koston 803eef7de6 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 14:11:02 -05:00
J. Nick Koston fb06b4d631 Download a wave of registry libraries in parallel
The walk now drains its frontier, prefetches the wave's registry
archives with a small thread pool (deduped by URL, progress bars
suppressed per thread since parallel bars would interleave), and then
processes the wave sequentially; the sequential download() call stays
authoritative so failures surface with resume exactly as before. Same
approach as the espidf tool prefetch in #18513.
2026-08-22 14:10:40 -05:00
J. Nick Koston eb62957b66 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 13:51:48 -05:00
J. Nick Koston 2a86ae572d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 13:51:48 -05:00
J. Nick Koston 7fe793da17 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 13:51:48 -05:00
J. Nick Koston 447a411d45 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 13:51:48 -05:00
J. Nick Koston ae2893992a Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 13:51:47 -05:00
J. Nick Koston 6b46e9fd03 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 13:51:47 -05:00
J. Nick Koston 2f053371ce Guard the honored board_build branch against the empty-list form
voluptuous accepts [] for [cv.string], so vals[-1] could raise an
IndexError at codegen time; an empty list now falls through to the
ignored-option warning.
2026-08-22 13:51:35 -05:00
J. Nick Koston 47e87d7eb2 Dedupe the rejection warning and make bundled-name membership case-exact
The backend-side bundled filter now checks compatibility silently (the
shared walk owns the warning), so one manifest fault warns once instead
of twice. Bundled-name membership uses the exact on-disk directory
names instead of a per-name is_dir() probe, so a case-insensitive
filesystem cannot match a case-mismatched dependency and build the same
bundled library twice.
2026-08-22 13:50:29 -05:00
J. Nick Koston 255ca06325 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 13:16:00 -05:00
J. Nick Koston 893ec5d3f5 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 13:16:00 -05:00
J. Nick Koston a4a566eac2 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 13:15:59 -05:00
J. Nick Koston 3bd4cdb760 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 13:15:59 -05:00
J. Nick Koston 9533c09b69 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 13:15:59 -05:00
J. Nick Koston 2ea5c87e99 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 13:15:59 -05:00
J. Nick Koston 2dac9112be Pin the scalar shape for the honored board_build options; note the dispatch coupling
The schema permits the list form, so the routing now stores the last
value (like a later platformio.ini line) and the generator always sees a
scalar. The using_native_toolchain docstring points at write_cpp_file's
dispatch so NATIVE_TOOLCHAINS membership and the project-writing branch
flip together.
2026-08-22 13:15:47 -05:00
J. Nick Koston e8ceb241e1 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 13:10:55 -05:00
J. Nick Koston c8dd9dd483 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 13:10:55 -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 ac227b552c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 12:52:53 -05:00
J. Nick Koston efe2dc481d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 12:52:53 -05:00
J. Nick Koston aa2cd99a9b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 12:52:53 -05:00
J. Nick Koston 478584354e Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 12:52:52 -05:00
J. Nick Koston 53228c183a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 12:52:52 -05:00
J. Nick Koston 9c7f68b813 Hoist the boolean spelling tables to helpers so cv.boolean and the env parser share one source
cv.boolean's inline tuples and the ccache env tables were two copies of
the same spellings; TRUTHY_BOOL_STRINGS/FALSY_BOOL_STRINGS now live in
esphome/helpers.py, cv.boolean consumes them, and parse_enable_env
derives its tables by adding the 1/0 env convention.
2026-08-22 12:52:38 -05:00
J. Nick Koston fe357106df Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 12:48:21 -05:00
J. Nick Koston 751914c47f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 12:48:21 -05:00
J. Nick Koston f4f7492f37 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 12:48:21 -05:00
J. Nick Koston ef6c609e93 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	tests/unit_tests/test_platformio_library.py
2026-08-22 12:47:48 -05:00
J. Nick Koston b62d59ca26 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 12:47:07 -05:00
J. Nick Koston e52703617e Name the env boolean spelling tables like device-builder does
parse_enable_env's inline tuples become TRUTHY_ENV_STRINGS and
FALSY_ENV_STRINGS frozensets mirroring cv.boolean's spellings (enable
and disable included) plus the 1/0 env convention, matching
device-builder's TRUTHY_BOOL_STRINGS pattern.
2026-08-22 12:47:05 -05:00
J. Nick Koston 57cbadbe9f Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 12:46:30 -05:00
J. Nick Koston a6ca775a48 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 12:46:29 -05:00
J. Nick Koston 315f41e884 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 12:46:29 -05:00
J. Nick Koston 65609bb94b Move the backend-agnostic library hardening down from the arduino backend PR
The typed IncompatiblePlatform exception, dependency_is_usable,
warn_properties_depends, the lex_build_flags helper (espidf switches to
it), the normalize_dependencies validation, the manifest shape check,
the component-level drop-warning split, and the SCons case-sensitive
.C/.C++ suffixes all harden the shared converter independently of the
arduino backend, so they belong in this PR; the provides hook and the
version-less reconciliation stay with the backend that needs them.
2026-08-22 12:46:16 -05:00
J. Nick Koston 09a875f359 Refactor the library backend into focused functions
build_tool gains one function per mode plus a shared rspfile reader.
_library_info becomes an orchestrator over _resolve_src_dir,
_resolve_lib_archive, _classify_build_flags, _resolve_include_dirs, and
_collect_lib_sources. The version-less reconciliation moves into
_warn_unsatisfied_versionless. _is_safe_library_name switches from a
character denylist to a filename-plain allowlist, which excludes
separators, drive colons, and dot-only names by shape.
2026-08-22 12:43:04 -05:00
J. Nick Koston 43411106bb Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 12:26:39 -05:00
J. Nick Koston e107747643 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 12:26:39 -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 e41440b16b Tilde-expand the install prefix before the CI cache-path assertion
The job env carries a literal ~ that Python's expanduser and
actions/cache both resolve; the assertion compared the raw string and
failed the native toolchain job.
2026-08-22 12:23:24 -05:00
J. Nick Koston 19d8f832b9 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	esphome/components/esp8266/__init__.py
2026-08-22 12:16:27 -05:00
J. Nick Koston d7edb52c7b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 12:15:40 -05:00
J. Nick Koston 4a1138820d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 12:15:39 -05:00
J. Nick Koston 2ab0dc4e4f Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 12:15:39 -05:00
J. Nick Koston bbcc9f690a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 12:15:39 -05:00
J. Nick Koston 7c07276c71 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 12:15:38 -05:00
J. Nick Koston 60cf44de3b Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 12:15:38 -05:00
J. Nick Koston 072b65c0e2 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 12:15:38 -05:00
J. Nick Koston f71867ed2d Merge remote-tracking branch 'origin/dev' into esp8266-native-shared-helpers 2026-08-22 12:15:30 -05:00
J. Nick Koston 8b7d199ff9 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 12:08:57 -05:00
J. Nick Koston e7aa269346 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 12:08:57 -05:00
J. Nick Koston 3037ed0a28 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 12:08:57 -05:00
J. Nick Koston c206f83528 Make the remaining silent drops visible across backends
The depends=-without-dependencies warning moves into the shared walk so
espidf builds report it too; the arduino backend keeps it only for
bundled libraries the walk never sees. Version-less dependencies now
pass the platform filter before the reconciliation records them, so a
platform-excluded entry no longer draws a spurious drop warning.

A converted library whose matched files all fall through the source
suffix map warns instead of silently producing an empty archive, and
unhonored precompiled/ldflags properties fields warn by library name.
The ar rspfile parser undoes ninja's POSIX inner-quote escape and the
module docstring records the one-object-per-line contract. The
includeDir comment now states that warn-and-drop is intended.
2026-08-22 12:08:46 -05:00
J. Nick Koston b002a37987 Fail fast on empty compile databases and unsupported analyze-memory toolchains; degrade a missing size tool
ninja -t compdb exits 0 with an empty list when the rule names drift, so
the compile database is now parsed and an empty result fails the build
and drops the stale file. analyze-memory refuses an unsupported
toolchain before paying for the compile. A missing size binary warns
instead of discarding an already-linked build, _parse_app_size returns
explicitly from its not-found branch, and the CI cache action asserts
the caller's install prefix matches the cached path. The esp8266
run_compile dispatch hook and copy_files early-return gain direct
tests.
2026-08-22 12:06:38 -05:00
J. Nick Koston 583f47034f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 12:02:36 -05:00
J. Nick Koston 10a22d7d74 Quote an overridden ldscript name on the link line; note the deliberate board-derived --flash_size
The -T script name was the one user-controlled token on the link line
that skipped shell_token, so a space or dollar sign in a
board_build.ldscript override corrupted the emitted linkflags. The
elf2bin comment now records that --flash_size deliberately stays
board-derived, matching PlatformIO (which reads upload.maximum_size,
not the ldscript).
2026-08-22 12:02:33 -05:00
J. Nick Koston 905b056756 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
2026-08-22 12:01:44 -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 b597a4f02f Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 11:55:59 -05:00
J. Nick Koston 0c64ce7a8c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 11:55:59 -05:00
J. Nick Koston ba521acdab Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 11:55:59 -05:00
J. Nick Koston 9676e0c0f0 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 11:55:58 -05:00
J. Nick Koston cedecf1f83 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 11:55:58 -05:00
J. Nick Koston e7d3c1b92b Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-22 11:55:58 -05:00
J. Nick Koston f28be76c84 Fix comment drift: conditional cache refresh, future-tense generator consumer 2026-08-22 11:55:15 -05:00
J. Nick Koston fcc7bb8c44 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 11:49:37 -05:00
J. Nick Koston 3e646470ef Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 11:49:36 -05:00
J. Nick Koston ec9200912d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 11:49:36 -05:00
J. Nick Koston 3242196f9c Validate shorthand dependencies, honor lib_ignore for version-less deps, warn on non-platform component drops
The dict-shorthand dependency form now runs the same name validation as
the list form, so an empty key or a spec overriding name with a
non-string warns instead of raising a bare TypeError from the key
builder. A lib_ignore'd version-less dependency is deliberately excluded
and no longer draws the reconciliation warning. The walk's
component-level InvalidLibrary handler mirrors dependency_is_usable:
cross-platform skips stay at debug, any other cause warns. A malformed
libArchive/dot_a_linkage value now fails naming the library like the
sibling build fields, and the suffix map gains SCons's case-sensitive .C
and .C++ so those sources compile as C++ instead of silently dropping
out of the archive.
2026-08-22 11:49:25 -05:00
J. Nick Koston 4866ef97f0 Trim comment essays and hoist function-local test imports 2026-08-22 11:46:49 -05:00
J. Nick Koston 7e675233c6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 11:44:16 -05:00
J. Nick Koston 512a31b3fc Trim comment essays and hoist function-local test imports 2026-08-22 11:44:09 -05:00
J. Nick Koston 3134239d52 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 11:43:02 -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 fc8a48d70b Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/espidf/component.py
2026-08-22 11:40:11 -05:00
J. Nick Koston cdde9dd230 Trim comment essays and hoist function-local test imports 2026-08-22 11:39:54 -05:00
J. Nick Koston 935db6a63c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-22 11:38:49 -05:00
J. Nick Koston 90b29e231d Trim comment essays and hoist function-local test imports 2026-08-22 11:38:46 -05:00
J. Nick Koston 315abf21f8 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-22 11:37:21 -05:00
J. Nick Koston 24e5b1800f Trim comment essays and hoist function-local test imports 2026-08-22 11:37:16 -05:00
J. Nick Koston 11eca53a18 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-22 11:35:41 -05:00
J. Nick Koston f08e06f574 Trim comment essays and hoist function-local test imports 2026-08-22 11:35:35 -05:00
J. Nick Koston 27f4db8458 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-22 11:34:57 -05:00
J. Nick Koston e99e0cc8b8 Trim comment essays and hoist function-local test imports 2026-08-22 11:34:32 -05:00
J. Nick Koston 9304c74de5 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 11:24:58 -05:00
J. Nick Koston 538d52c6bc Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 11:24:58 -05:00
J. Nick Koston d1db0cb63e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 11:24:58 -05:00
J. Nick Koston 3b2fc9f59a Close the owner-qualified drop gap and the duplicate-archive gap in the library backend
An owner-qualified version-less dependency was skipped by both the
arduino backend (owner set) and the reconciliation (provides() knew the
short name), so nothing logged the drop; provides() now only satisfies
owner-less names, mirroring the walk's backend-provided guard. A dict
dependency entry with no name at all now warns in the normalizer like
any other malformed entry.

Bundled dependency additions are deferred until conversion finishes and
skipped when a converted library's manifest already provides the name,
so a name that is both bundled and registry-resolved cannot build twice.
External short names come from the request spec (custom Name=url form
included) instead of the URL tail. The empty-bundled-library probe now
walks the whole library tree against a shared header-suffix constant,
and the dead versioned-dependency branch is folded into the surviving
check.
2026-08-22 11:24:49 -05:00
J. Nick Koston 266f67ef13 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 11:04:48 -05:00
J. Nick Koston ee218bdc7d Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 11:04:47 -05:00
J. Nick Koston 5dea42d28a Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 11:04:47 -05:00
J. Nick Koston 57e738adf8 Simplify the library backend: share the dependency filter, drop the request-key drop diff, dedupe test scaffolding
Validate manifest shape once in the converter (every backend dereferences
data/build), share the InvalidLibrary filter as dependency_is_usable(),
and let the walk's reconciliation own version-less drop reporting so the
arduino backend's request-key diff, owner-no-version warning, and
node_key plumbing all go away. One memoized _provided() predicate now
answers bundled-name checks at all three sites. Tests gain shared
scaffold helpers and lose the assertions that pinned deleted messages.
2026-08-22 11:04:35 -05:00
J. Nick Koston 70b8573110 Move version-less drop reconciliation into the walk, harden the name guards
The shared walk now defers every version-less skip and reconciles after
emit against the final resolution set (request keys, resolved manifest
names, and backend.provides(name) per name), so drop visibility is
correct for every backend by construction instead of by a comment-level
contract, and the arduino backend's duplicate pending_drops pass and its
short-name suppression heuristics are deleted. The provides lambda
applies _is_safe_library_name so an unsafe manifest name is simply not
provided, and the guard also rejects drive-colon names that would
escape the tree on Windows.
2026-08-22 10:46:50 -05:00
J. Nick Koston 772fb65675 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 10:03:46 -05:00
J. Nick Koston 116f7479a3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 10:03:46 -05:00
J. Nick Koston 40c28c3861 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 10:03:45 -05:00
J. Nick Koston 735d4076c1 Keep the top-level suppression total and honest
The check guards URL-ish names before _node_key (a malformed entry
belongs to the drop warning, not a RuntimeError) and matches against
top_level_keys so the message says exactly what it verifies; a
transitive-only node can still fail compatibility later and must not
suppress the drop report.
2026-08-22 10:03:43 -05:00
J. Nick Koston 00549813ab Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 09:41:49 -05:00
J. Nick Koston c2e920d769 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 09:41:49 -05:00
J. Nick Koston 69ab07ec41 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 09:41:49 -05:00
J. Nick Koston a48fbd1cd1 Suppress the top-level-requested false positive, guard names once, fail empty bundled libraries
The walk's version-less warning stays quiet for a name the config also
requests top-level, and the provides-backend debug level carries the
ownership rationale (the arduino backend defers drops and suppresses
walk-resolved names this layer cannot know yet). _is_safe_library_name
guards both the top-level bundled check and manifest dependencies, so a
YAML libraries entry of '.' or a backslash name cannot join under the
framework tree. The drop suppression strips only the sanitized owner
prefix, keeping a library's own double underscores. An empty bundled
directory raises naming the fix instead of warning into an unlinkable
build, and the second real-converter test pins ESPHOME_DATA_DIR.
2026-08-22 09:41:35 -05:00
J. Nick Koston ccce5e9ab2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 09:30:02 -05:00
J. Nick Koston 3b9a026fd4 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 09:30:02 -05:00
J. Nick Koston a4d99a8ee9 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 09:30:02 -05:00
J. Nick Koston e47ec9acad Cover the routine version-less skip through the real walk 2026-08-22 09:29:49 -05:00
J. Nick Koston 685409cf83 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 09:21:11 -05:00
J. Nick Koston bff4b7d870 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 09:21:11 -05:00
J. Nick Koston 965557ee11 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 09:21:10 -05:00
J. Nick Koston 8e6af6aa8c Name the manifest in every dependency diagnostic, warn where no backend can recover
normalize_dependencies' parameter is manifest_name (the dict branch
already binds owner to a package owner), and the arduino call site
passes the library's name so its unrecognized-entry warning stops
saying 'of manifest'. A version-less dependency warns when the backend
declares no provides tree (espidf/zephyr/nrf52 have no post-emit
pickup), and the shared walk mirrors the typed IncompatiblePlatform
branch: routine platform skips stay at debug, any other InvalidLibrary
cause warns naming the component. The two real-converter tests pin
ESPHOME_DATA_DIR to tmp_path so an ambient data dir cannot leak in.
2026-08-22 09:20:57 -05:00
J. Nick Koston 7c91407835 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 00:48:41 -05:00
J. Nick Koston 33c6b3161b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 00:48:41 -05:00
J. Nick Koston 2cedb3d82b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 00:48:41 -05:00
J. Nick Koston 9bb899d8df Never shred a string dependency list, defer and de-duplicate drop warnings
A plain-string dependencies value comma-splits into names instead of
iterating into one-character libraries; entries that normalize to
nothing warn naming the manifest, and the walk's version-less skip logs
at debug for every backend. The not-bundled warning is deferred until
after the walk and stays quiet for names resolved transitively, so a
false skipping message cannot teach users to ignore the real one. An
explicitly requested bundled library that resolves to no sources and no
headers warns that the install may be incomplete.
2026-08-22 00:48:30 -05:00
J. Nick Koston 76a80bd346 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-22 00:18:46 -05:00
J. Nick Koston 7ab66de38b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-22 00:18:46 -05:00
J. Nick Koston 0bd66b8e9b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-22 00:18:46 -05:00
J. Nick Koston 35c77165ca Surface every dependency-drop path the walk can take
The converted path warns for a properties-only depends= spelling (the
walk reads the JSON key). A dependency name is validated before
becoming a path component: non-strings and separator names are
malformed entries, never joined (apply_extra_script already guards the
same shape). normalize_dependencies coerces PIO's bare string-list form
to name dicts instead of dropping it before every visibility warning. A
non-* version pin discarded for a backend-provided bundled copy warns
naming the substitution. The -I global-include promotion and the
start-group link-order contract are documented.
2026-08-22 00:18:35 -05:00
J. Nick Koston 0f885b4037 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 21:27:59 -05:00
J. Nick Koston 09518f4032 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 21:27:59 -05:00
J. Nick Koston 7732b688f5 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 21:27:59 -05:00
J. Nick Koston 44b14d8655 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 21:27:59 -05:00
J. Nick Koston 4eb31c45da Isolate the preresolved-ccache test from ambient CCACHE_DIR, future-tense the sentinel comment 2026-08-21 21:27:49 -05:00
J. Nick Koston 8b21fa620d Cover the pre-resolved ccache branch of get_idedata 2026-08-21 21:20:58 -05:00
J. Nick Koston 116b4ce444 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 21:11:22 -05:00
J. Nick Koston 91cf9be5eb Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 21:11:21 -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 eecdf3e68d Drop the components-graph memo; it defeats the tested disk-cache semantics
The in-process cache served a stale graph across mtime and version
changes, which the script test suite pins; the saved re-parse was tens
of milliseconds.
2026-08-21 21:11:11 -05:00
J. Nick Koston c0a605c1b9 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 21:01:48 -05:00
J. Nick Koston 227522364a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 21:01:47 -05:00
J. Nick Koston 4bea2dd058 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 21:01:47 -05:00
J. Nick Koston a9994c6895 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 21:01:47 -05:00
J. Nick Koston fab8af6c88 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 21:01:47 -05:00
J. Nick Koston db0e52a36b Cover shell_token's Windows branch on the coverage-uploading runner 2026-08-21 21:01:37 -05:00
J. Nick Koston 9fe9d8da1b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 20:56:38 -05:00
J. Nick Koston 897713cbcb Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 20:56:38 -05:00
J. Nick Koston a05a392fdd Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 20:56:37 -05:00
J. Nick Koston 6a963ba794 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 20:56:37 -05:00
J. Nick Koston a029338f3d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 20:56:37 -05:00
J. Nick Koston cbf9e0ab14 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-21 20:56:37 -05:00
J. Nick Koston a527b21761 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-21 20:56:36 -05:00
J. Nick Koston 4d63564cdd Phrase the board-table regen comment imperatively 2026-08-21 20:56:27 -05:00
J. Nick Koston 8b9f5503df Drop the now-inlined pio_options module 2026-08-21 20:55:58 -05:00
J. Nick Koston 17f718e8c9 Simplify the native dispatch and CI cache wiring
A cache-arduino8266 composite action mirrors cache-esp-idf (one key
resolver, dev-writes/PR-restores) and both jobs pin
ESPHOME_ARDUINO8266_PREFIX so YAML and Python agree on the path by
construction. esp32 provides the native_toolchain_module hook, so the
shared dispatcher never names a backend and the unclaimed-native raise
loses its esp-idf carve-out; the esp8266 decode and run_compile hooks
resolve through the same seam. run_compile resolves ccache once and
threads it to the generator, env, and idedata; the compdb rule names
follow the shared kinds; the pio-options warner inlines into the driver
and derives its consumed set from the core routing constant; the
per-toolchain CI narrowing shares one body; create_components_graph is
memoized per run; the decode rate-limit drops its math sentinel.
2026-08-21 20:55:27 -05:00
J. Nick Koston 39f11815ed Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 20:55:19 -05:00
J. Nick Koston 42e255c1e5 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 20:55:19 -05:00
J. Nick Koston efad21d335 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 20:55:19 -05:00
J. Nick Koston 16bc83032d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 20:55:19 -05:00
J. Nick Koston 012b571a2e Make the ccache sentinel public; sibling modules pass it as a default 2026-08-21 20:55:07 -05:00
J. Nick Koston ff0298c66a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 20:51:57 -05:00
J. Nick Koston a1d59049b4 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 20:51:57 -05:00
J. Nick Koston c838d11bf4 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 20:51:57 -05:00
J. Nick Koston 814109df47 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 20:51:57 -05:00
J. Nick Koston 4a16365f13 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-21 20:51:56 -05:00
J. Nick Koston 587873a2da Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 20:51:56 -05:00
J. Nick Koston 80a4178f05 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 20:49:32 -05:00
J. Nick Koston 0973044214 Strip the python path for cmd.exe, name rules by kind, take the resolved install
The build.ninja python variable goes through strip_win_long_path_prefix
like every other emitted binary path (the NSIS launcher's extended
prefix cannot be spawned by cmd.exe). Compile rules are named by the
shared source kinds directly, retiring the identity translation table
and its drift test. write_project takes the caller's resolved ccache,
get_flash_ld_path reads the InstalledPaths the ninja file linked
against instead of re-resolving the version, the board backstop checks
the one table it indexes with an honest comment, and cc/cxx/ar paths go
through the shared toolchain_tool accessor (gaining the Windows
suffix).
2026-08-21 20:49:30 -05:00
J. Nick Koston d628bc3aae Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-21 20:47:42 -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 aad89cd939 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 20:46:18 -05:00
J. Nick Koston 67f6812f78 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 20:46:18 -05:00
J. Nick Koston 4101ad4fb1 One owner for the toolchain tool layout, thread a pre-resolved ccache
toolchain_tool carries the bin/xtensa-lx106-elf-<name> pattern and the
Windows suffix that four call sites previously spelled out (only one of
which handled the suffix). ccache_env and get_build_env accept the
already-resolved ccache path so run_compile can resolve once instead of
paying the PATH scan and runnability probe three times per build.
2026-08-21 20:46:10 -05:00
J. Nick Koston 048025e9dd Form the local-library URL with as_uri so the test passes on Windows 2026-08-21 20:44:49 -05:00
J. Nick Koston e9d6132c61 Name the honored native-arduino pio options once
NATIVE_ARDUINO_PIO_OPTIONS is the single list the routing reads; the
backend's ignored-option warning consumes it too, so honoring a new key
is one edit instead of two synchronized ones.
2026-08-21 20:43:43 -05:00
J. Nick Koston 9268f52b9e Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 20:38:33 -05:00
J. Nick Koston df91523ce3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 20:38:33 -05:00
J. Nick Koston e779df14cb Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 20:38:32 -05:00
J. Nick Koston 8ad1ed98b7 Skip backend-provided dependencies in the graph walk, validate manifests before extra scripts
The dict-shorthand bundled preference ran after convert_libraries had
already resolved the dependency through the registry, so a real
{"Wire": "*"} manifest still fetched or failed on a registry Wire (the
mocked test hid it). LibraryBackend gains an optional provides hook the
walk consults for owner-less dependencies; the arduino backend answers
from the framework tree and the bundled copy is added after emit. A
real-converter test with a local library pins that the registry is
never touched. _emit also validates the manifest shape by name before
apply_extra_script dereferences it.
2026-08-21 20:38:23 -05:00
J. Nick Koston f2a878cb25 Stop warning about the now-honored f_cpu and ldscript overrides 2026-08-21 20:31:12 -05:00
J. Nick Koston c9a40e550c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 20:30:32 -05:00
J. Nick Koston 5474ba2ca1 Honor board_build.ldscript for the native flash linker script
Published configs override it to reserve a filesystem region or correct
a board's assumed flash size; the routed value replaces the BOARDS
default, and a path is rejected since the name resolves via -L.
2026-08-21 20:30:30 -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 7298eed5b3 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-21 20:27:43 -05:00
J. Nick Koston 78a1e88915 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 20:27:43 -05:00
J. Nick Koston b87875881e Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 20:27:43 -05:00
J. Nick Koston e97388ce00 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 20:27:43 -05:00
J. Nick Koston d8c02221cc Route board_build.ldscript through to the native ESP8266 generator too
Published configs override it to reserve a filesystem region
(SmartIntercom's eagle.flash.4m2m.ld) or to correct a board's assumed
flash size (2 MB ESP8285 plugs pinning eagle.flash.2m.ld); dropping it
changes the flash layout under them.
2026-08-21 20:27:33 -05:00
J. Nick Koston 8cefacd7b6 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 20:25:33 -05:00
J. Nick Koston 76d8c9eb46 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-21 20:25:32 -05:00
J. Nick Koston a703acf85f Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 20:25:32 -05:00
J. Nick Koston 7beda110d4 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 20:25:32 -05:00
J. Nick Koston 7fb18f395f Honor board_build.f_cpu under the native ESP8266 Arduino toolchain
Dropping it was a real regression: many published ESP8266 configs pin
board_build.f_cpu: 160000000L for timing-sensitive integrations
(MHI-AC-Ctrl documents the 160 MHz requirement in its example), and the
warn-and-drop left those devices at 80 MHz. The option now routes into
CORE.platformio_options under toolchain: arduino for the generator to
consume; other native toolchains keep the warning.
2026-08-21 20:25:23 -05:00
J. Nick Koston 6070941771 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 20:22:05 -05:00
J. Nick Koston d78083f9f2 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 20:22:05 -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 dc0fddd349 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 19:59:57 -05:00
J. Nick Koston 44db267a2c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-21 19:59:54 -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 26ea560139 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 19:24:21 -05:00
J. Nick Koston 4cec2e119c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 19:24:20 -05:00
J. Nick Koston 7c4dfe8c08 Best-effort stderr-note re-emit, name the unreadable-header cause, state the quoting contract
The cached-diagnostic read follows the same regenerate-never-abort rule
as the other cache reads (a damaged note must not fail an incremental
build). The unreadable-header path warns naming the header and the
clean-all fix instead of leaving an inexplicably uncached build at
debug level. _project_flags' docstring states which return values are
pre-quoted and which the caller owns.
2026-08-21 19:24:10 -05:00
J. Nick Koston f3395afae1 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 18:56:03 -05:00
J. Nick Koston 69f558d83d Pin the board-table equality, note the flash_freq audit
write_project rejects a board missing from either table, so a new test
asserts the two stay exactly equal (the subset check is how d1_wroom_02
went missing). The hardcoded --flash_freq 40 carries the audit note:
all 45 supported boards ship 40 MHz, and a platform bump adding one
that does not must revisit it.
2026-08-21 18:55:52 -05:00
J. Nick Koston 6b56def2bf Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-21 18:55:40 -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 f451de062a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 17:45:05 -05:00
J. Nick Koston 923e293537 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 17:45:05 -05:00
J. Nick Koston f92386b3cc Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 17:45:04 -05:00
J. Nick Koston c1a7c87a64 Cover the non-dict bundled-manifest branch 2026-08-21 17:44:57 -05:00
J. Nick Koston 88e6471a4b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 17:38:34 -05:00
J. Nick Koston 9fd323e7d9 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 17:38:33 -05:00
J. Nick Koston 4e830241d0 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 17:38:33 -05:00
J. Nick Koston d96ddf3612 Catch the depends= spelling, warn on bundled extraScripts, trust top-level requests
The bundled-dependency visibility warning also reads the
library.properties depends= key the shared parser returns raw, since
properties is the format bundled libraries actually ship. A bundled
manifest declaring an extraScript warns that it never runs (a new
Known-deviations entry). A version-less manifest dependency the config
separately requests as a top-level library is already in the build, so
the skipping warning no longer fires for it and cannot teach users to
ignore the real drop.
2026-08-21 17:38:25 -05:00
J. Nick Koston daea0cc9f3 Warn on missing decode tools on both toolchains, fail the CI key resolver loudly
The PlatformIO branch of _decode_pc now routes through the same
rate-limited warning as the native one; raw undecoded crash addresses
with no stated reason were undiagnosable at default log level. The CI
cache key uses the assignment form so errexit catches a resolver
failure instead of echo swallowing it into a degenerate key, with a
non-empty check, and the cache comments stop claiming a ccache store
the seed job never populates (it saves before any compile runs).
2026-08-21 17:26:11 -05:00
J. Nick Koston cb409e276a Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 17:19:09 -05:00
J. Nick Koston d0a3392c46 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 17:19:09 -05:00
J. Nick Koston 978d7fc2e7 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 17:19:09 -05:00
J. Nick Koston e18852e084 Fail on dropped requests, guard the last manifest fields, parse dot_a_linkage strictly
A top-level library the converter dropped always makes the firmware
wrong, so resolve_libraries raises naming the missing requests instead
of warning toward link errors, and a resolved component without its
node_key fails as a converter bug rather than silently substituting the
mismatched canonical name. includeDir and srcFilter join srcDir and
flags in raising a named error on malformed values, and dot_a_linkage
parses through the same strict table as libArchive so a typo warns and
keeps the archive default instead of flipping link semantics.
2026-08-21 17:19:01 -05:00
J. Nick Koston 27b80f895b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 17:04:13 -05:00
J. Nick Koston e2cc4e825f Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 17:04:12 -05:00
J. Nick Koston 496d705dc7 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 17:04:12 -05:00
J. Nick Koston 1f868d22fb Expose request_key as the public pair of ConvertedLibrary.node_key
The arduino backend consumed the private _node_key across packages to
reconstruct the request-side key; the thin public wrapper keeps both
sides of the contract on the same API surface.
2026-08-21 17:04:03 -05:00
J. Nick Koston 3e56619cd6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 16:52:50 -05:00
J. Nick Koston 84d98a3593 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 16:52:50 -05:00
J. Nick Koston bf3972cbf6 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 16:52:50 -05:00
J. Nick Koston 2ecf7af416 Name malformed manifests, diff drop-warnings by node key, surface bundled deps
A non-dict manifest or build section raises an EsphomeError naming the
library instead of an AttributeError. ConvertedLibrary remembers the
request-side node key it resolved from, so the converter-drop warning
diffs requests against those keys; a bare name resolving to a canonical
owner__pkg is no longer falsely listed missing. A bundled library whose
manifest declares dependencies warns that the walk never runs for it (a
no-op on the ESP8266 core, not on every core this module serves).
2026-08-21 16:52:32 -05:00
J. Nick Koston 7a99e65853 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 16:07:41 -05:00
J. Nick Koston 5622a7b851 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 16:07:40 -05:00
J. Nick Koston 659211b8bd Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 16:07:40 -05:00
J. Nick Koston 91a4eb0f57 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 16:07:40 -05:00
J. Nick Koston 97ed253c38 Say the floor's config-validation guard is future wiring, not present
Nothing at this commit enforces MIN_FRAMEWORK_VERSION during
validation; the native backend's validator arrives with the wiring PR.
The comment no longer invites skipping it.
2026-08-21 16:07:30 -05:00
J. Nick Koston 0127b483b0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 15:34:01 -05:00
J. Nick Koston 114302b518 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 15:34:01 -05:00
J. Nick Koston e2d0ebbd6e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 15:34:01 -05:00
J. Nick Koston be2395da66 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 15:34:00 -05:00
J. Nick Koston cbf1241401 Resolve the ccache path on every call, matching the espidf backend
functools.cache froze the ESPHOME_CCACHE_ENABLE/PATH decision for the
process lifetime, which a long-lived host like device-builder never
restarts, and forced a cache_clear fixture in the tests. The docstring
and test now pin the uncached delegation.
2026-08-21 15:33:51 -05:00
J. Nick Koston 98f574c251 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 15:19:11 -05:00
J. Nick Koston 568885f80d Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 15:19:11 -05:00
J. Nick Koston 17a251d062 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 15:19:10 -05:00
J. Nick Koston ce87ca2e11 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 15:19:10 -05:00
J. Nick Koston 33aea420ac Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 15:19:10 -05:00
J. Nick Koston e3d29e9fff Name a non-list registry system field instead of a TypeError
file["system"] normalized None and str but let an int or dict fall
through to the in test, where an int raises TypeError and a dict
becomes a key test; both now raise the same Unexpected-response error
as the other shape guards.
2026-08-21 15:18:54 -05:00
J. Nick Koston dbae5246e6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 14:50:47 -05:00
J. Nick Koston 2fba991b51 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 14:50:47 -05:00
J. Nick Koston 92356804c6 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 14:50:47 -05:00
J. Nick Koston 03bf037cb8 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 14:50:47 -05:00
J. Nick Koston 4dc2d34399 State the encoder's real registry parity and why the 3.1.1 floor exists
The docstring claimed exact registry names for every core above 2.6.2;
2.6.3, 3.0.0 and 3.0.1 ship with non-zero trailing components the
formula cannot produce. Name them, say which callers are safe (the ~
range on the PlatformIO path, the floored check_and_install), and
credit the floor with covering 3.0.0/3.0.1 as well as the absent 3.1.0.
2026-08-21 14:50:36 -05:00
J. Nick Koston b131f51788 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 14:32:37 -05:00
J. Nick Koston ccaa2a8f0d Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 14:32:37 -05:00
J. Nick Koston a2b28a8f8d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 14:32:37 -05:00
J. Nick Koston e9f8233f67 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 14:32:37 -05:00
J. Nick Koston c07a5a8da4 Match the encoder's lower bound to the PlatformIO era guard, drop the unused logger
<= 2.6.2 instead of < 2.6.3: a 2.6.2 pre-release sorts above 2.6.2 and
belongs to the package-major-3 encoding, so the helper now describes
the same set as _format_framework_arduino_version and a 2.6.2-b1 pin
formats as it does on dev. The module never logged, so its _LOGGER and
logging import go.
2026-08-21 14:32:27 -05:00
J. Nick Koston 0097ce892c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 14:12:34 -05:00
J. Nick Koston a3b2954321 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 14:12:33 -05:00
J. Nick Koston d07ed5b397 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 14:12:33 -05:00
J. Nick Koston b4514e5af2 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 14:12:33 -05:00
J. Nick Koston 93a768531d Anchor the 4.x error to the version key, bound the encoder, build PATH without empty entries
cv.Invalid now carries path=[CONF_VERSION] so the rejection lands on
the framework version line the comment promised, matching the esp32
convention. framework_package_version raises for cores before 2.6.3
instead of encoding them wrongly for a caller that skipped the
PlatformIO path's era guard. get_build_env joins PATH from filtered
parts so an absent PATH cannot leave a trailing separator that the
shell reads as the current directory.
2026-08-21 14:12:20 -05:00
J. Nick Koston 9fbc996d52 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 13:33:19 -05:00
J. Nick Koston 046c7e5eb0 Lex build flags once in write_project, warn on unflags that match nothing
The pre-lexed tokens feed both _flag_defines and _project_flags so a
malformed entry warns once per generation. An unflag that hits nothing
in the user flags or any framework set (a typo, or -DUSE_FOO against
-DUSE_FOO=1) is named instead of silently leaving the flag in force.
2026-08-21 13:33:11 -05:00
J. Nick Koston c0cd64cd76 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 13:32:21 -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 c92b3cc49a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 13:13:16 -05:00
J. Nick Koston 4898dc0800 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 13:13:15 -05:00
J. Nick Koston e3cf2407ca Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 13:13:15 -05:00
J. Nick Koston 82d1ffebf2 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 13:13:15 -05:00
J. Nick Koston bfeb27cd2a Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 13:13:15 -05:00
J. Nick Koston 45cbe0aa4b Parse IDF_CCACHE_ENABLE strictly through the shared helper, fix the ccache docstrings
parse_enable_env carries the 1/true/yes/on and 0/false/no/off table for
both knobs, so IDF_CCACHE_ENABLE=off disables instead of reading as
truthy and suppressing the shared opt-out. The ccache module docstring
and the ESP-IDF _ccache_env docstring now describe the precedence this
PR actually ships, and the probe test duplicated by the helper move is
dropped from the PlatformIO toolchain tests.
2026-08-21 13:12:57 -05:00
J. Nick Koston c3c27dc744 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 13:07:04 -05:00
J. Nick Koston 9153f03c83 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-21 13:07:03 -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 6974a67626 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 12:57:46 -05:00
J. Nick Koston 937c69e420 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 12:57:45 -05:00
J. Nick Koston e9409f46db Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 12:57:45 -05:00
J. Nick Koston 211889cfb6 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 12:57:45 -05:00
J. Nick Koston debfff005b Check the elf2bin inputs at generation, quote cxx flags, add d1_wroom_02 to BOARDS
elf2bin.py and eboot.elf join the existence checks so a half-extracted
package fails by name before the compile instead of at the
second-to-last edge. get_project_cxx_compile_flags() values go through
_shell_token like every other flag source. d1_wroom_02 (2 MB, in
ESP8266_BOARD_BUILD and buildable under PlatformIO) joins BOARDS so the
native board guard stops rejecting it, and the guard comment states
what config validation actually checks.
2026-08-21 12:57:36 -05:00
J. Nick Koston 523150a4c9 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-21 12:55:51 -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 4af70c3a4d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 12:53:46 -05:00
J. Nick Koston 0cb307aea5 Type the platform rejection, prefer bundled deps, parse manifests strictly
check_library_data's platform filter raises IncompatiblePlatform (an
InvalidLibrary subclass) so the arduino backend branches on the type
instead of substring-matching the message. The {"Wire": "*"} dict
shorthand resolves to the bundled library like PIO's
process_dependencies instead of a registry lookup. libArchive parses
booleans and true/false strings and warns on anything else (bool(str)
made "false" archive). A declared-but-falsy srcDir raises instead of
silently probing. The converter-drop warning names the missing requests,
and the bundled-walk comment states what PIO actually does.
2026-08-21 12:53:39 -05:00
J. Nick Koston 1f1cab9c37 Anchor the 4.x rejection to the framework version line, isolate the ccache env test
The installer's EsphomeError becomes cv.Invalid at the config
validator, and test_ccache_env clears the ambient environment so a
developer's exported CCACHE_DIR cannot fail it.
2026-08-21 12:51:09 -05:00
J. Nick Koston 4936ec0de6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 12:28:19 -05:00
J. Nick Koston afe12061d2 Track the per-platform shell quoting in the emission drift tests
The asm -D/-I filter also strips a leading single quote now that POSIX
tokens are single-quoted.
2026-08-21 12:28:11 -05:00
J. Nick Koston 2d89ca3dd0 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-21 12:26:46 -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 6d23a2c9e5 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 12:25:14 -05:00
J. Nick Koston f12cb4350a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 12:25:14 -05:00
J. Nick Koston 3e218e43cd Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 12:25:14 -05:00
J. Nick Koston e12795c285 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 12:25:14 -05:00
J. Nick Koston 85335de839 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 12:25:13 -05:00
J. Nick Koston 0f7cd3fada Single-quote POSIX shell tokens, share the tool probe, harden registry checks
shell_token now picks the quoting style per platform: single quotes on
POSIX (sh expands nothing inside them, so backslash runs, $VAR, and
backticks reach the compiler exactly as lexed, matching SCons's
no-shell spawn) and the CreateProcess argv rule on Windows. A test
round-trips every case through a real /bin/sh.

The ninja and ccache runnability probes collapse into one
tool_version_runs helper in framework_helpers. The registry names a
non-dict top-level payload like the inner guards, and the expect layout
check also runs on marker hits so a marked install that later lost
files fails by name. The ESP-IDF ccache gate defers to
resolve_ccache_path so ESPHOME_CCACHE_ENABLE=0 disables ccache there
too, with IDF_CCACHE_ENABLE still taking precedence.
2026-08-21 12:25:03 -05:00
J. Nick Koston c8722421b1 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 11:14:36 -05:00
J. Nick Koston 78a41161cb Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 11:14:35 -05:00
J. Nick Koston 6093f3f1ce Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 11:14:35 -05:00
J. Nick Koston 01600d0abd Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 11:14:35 -05:00
J. Nick Koston 653f9e8f2a Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 11:14:35 -05:00
J. Nick Koston 510f667bd1 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-21 11:14:35 -05:00
J. Nick Koston c93cf55967 Skip the cache refresh when the CLI toolchain differs from the compile's
Platforms normalize toolchain-sensitive keys differently (the esp32
board name, for one), so a config validated under a mismatching
--toolchain must not overwrite the cache while the sidecar keeps the
compile's toolchain. The guard lives in _refresh_sidecar where the old
sidecar is already loaded; legacy sidecars without the field are
unaffected.
2026-08-21 11:14:26 -05:00
J. Nick Koston 9ff0198865 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 09:58:45 -05:00
J. Nick Koston 9bd83e5d2d Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 09:58:44 -05:00
J. Nick Koston 2ee1d89e04 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 09:58:44 -05:00
J. Nick Koston 3a2bd29c15 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 09:58:44 -05:00
J. Nick Koston f3f6fe8a7d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 09:58:44 -05:00
J. Nick Koston efe1b0e744 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-21 09:58:44 -05:00
J. Nick Koston 6cb446baf8 State what the cache refresh actually writes
The comment claimed the refresh's sidecar records the CLI toolchain;
_refresh_sidecar returns early when a compile-written sidecar exists,
so the compile's toolchain stands. Reword the comment and the test
docstring to match.
2026-08-21 09:58:32 -05:00
J. Nick Koston 0fa081cd80 Name malformed registry elements, parse ESPHOME_CCACHE_ENABLE strictly, require a package layout check
Registry version and file entries that are not dicts now raise the same
Unexpected-response error as the other shape guards instead of an
AttributeError traceback. install_package rejects an empty expect so
every install is layout-validated before the marker is written.
ESPHOME_CCACHE_ENABLE values outside 1/true/yes/on and 0/false/no/off
warn and are treated as unset instead of bool(str) flipping them to
enabled. The strip_win_long_path_prefix test moved next to the function
in test_framework_helpers, and a stale comment naming its old module is
fixed.
2026-08-21 09:58:16 -05:00
J. Nick Koston 503e3ca724 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-21 09:36:01 -05:00
J. Nick Koston b8ce65282e Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 09:36:00 -05:00
J. Nick Koston 3a49955b45 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 09:36:00 -05:00
J. Nick Koston 5587e34a8c Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 09:36:00 -05:00
J. Nick Koston 8fd8766167 Sandbox ESPHOME_ARDUINO8266_PREFIX in the writer test isolation fixture
The autouse fixture pinned the idf and sdk-nrf prefixes but not the new
arduino8266 one, so running the suite with that env var exported deleted
the pointed-to install. Also adds the clean_all removal test the other
two native installs already have.
2026-08-21 09:35:53 -05:00
J. Nick Koston e5cfb1bdac Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	tests/unit_tests/test_main.py
2026-08-21 01:06:06 -05:00
J. Nick Koston 225c62dbf1 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-21 01:05:51 -05:00
J. Nick Koston bb77ad01eb Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-21 01:05:51 -05:00
J. Nick Koston 71c2381c60 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-21 01:05:51 -05:00
J. Nick Koston 2da961f560 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-21 01:05:51 -05:00
J. Nick Koston 0b0194cf41 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-21 01:05:51 -05:00
J. Nick Koston 8b9773c4bd Gate only the cache read on an explicit CLI toolchain, keep the refresh
The upload/logs cache split: an explicit --toolchain still skips the
read and runs the per-platform validators, but the freshly validated
config is saved again so a later plain run keeps the fast path (the
sidecar records the resolved toolchain). check_supported_toolchain is
module-private now since it has no caller outside config_validation,
and require_platformio_toolchain's docstring describes what actually
happens when another platform's toolchain is passed.
2026-08-21 01:05:38 -05:00
J. Nick Koston aae5538fd5 Gate uploads on a built firmware, refuse unclaimed native builds, seed the CI toolchain cache from dev
The upload path now checks CORE.firmware_bin exists before invoking
esptool and names the fix (compile first) instead of failing inside
esptool. compile_program raises when a native toolchain resolved but no
platform backend claimed the build rather than falling through to a
mis-configured PlatformIO project. The addr2line failure warning now
includes the exception so the cause is visible without debug logging.

CI: the native toolchain cache is restore-only on PRs and seeded by a
new dev-push job, mirroring seed-apt-cache; the key resolves the pinned
core and toolchain versions from code instead of hashing framework.py.
determine-jobs main() output tests now pin the esp8266_native pair.
2026-08-21 00:05:23 -05:00
J. Nick Koston 01923ff22a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 23:58:42 -05:00
J. Nick Koston 5a5a379444 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-20 23:58:18 -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 e5a7243b7b Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 23:55:47 -05:00
J. Nick Koston 662978c402 Name dropped requests and non-platform dependency rejections, correct the dot_a_linkage attribution 2026-08-20 23:55:38 -05:00
J. Nick Koston e6bf3e0e8f Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 23:55:19 -05:00
J. Nick Koston 078bcba473 Backend-neutral unsupported-core message, pin the PIO source formatter 2026-08-20 23:55:15 -05:00
J. Nick Koston 85acafb646 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 23:54:17 -05:00
J. Nick Koston 18a2aa2097 Probe the PATH ninja, chain import errors, harden registry payload checks, honest ccache docstring 2026-08-20 23:53:40 -05:00
J. Nick Koston f8d3df8196 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	tests/unit_tests/test_main.py
2026-08-20 23:48:20 -05:00
J. Nick Koston 21dfa0846e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 23:47:51 -05:00
J. Nick Koston d18b778462 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 23:47:51 -05:00
J. Nick Koston d58291945c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 23:47:51 -05:00
J. Nick Koston 88f1c4474f Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 23:47:51 -05:00
J. Nick Koston 6ed01b06c3 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 23:47:51 -05:00
J. Nick Koston 24eb6354f9 Run validators when a CLI toolchain is given on the cache fast path, cover every LibreTiny family 2026-08-20 23:47:47 -05:00
J. Nick Koston 5311be5c91 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 22:08:44 -05:00
J. Nick Koston 553adf6d24 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 22:08:44 -05:00
J. Nick Koston e220109c20 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 22:08:44 -05:00
J. Nick Koston d8bdf2fc5b Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 22:08:43 -05:00
J. Nick Koston 355d02ee6a Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 22:08:43 -05:00
J. Nick Koston f5ac480dff Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 22:08:43 -05:00
J. Nick Koston 19555e8eaf Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 22:08:43 -05:00
J. Nick Koston d47dc0d992 Pin fingerprint stability and sensitivity behaviorally, note the platform pairing 2026-08-20 22:08:41 -05:00
J. Nick Koston 6e56d19615 Mirror the LookupError tolerance in the native post-build guard 2026-08-20 21:09:56 -05:00
J. Nick Koston 3e21c35e3e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 21:09:44 -05:00
J. Nick Koston 5b42eb3460 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 21:09:44 -05:00
J. Nick Koston 40c99b9c72 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 21:09:43 -05:00
J. Nick Koston c448174ea9 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 21:09:43 -05:00
J. Nick Koston 6a363c1746 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 21:09:43 -05:00
J. Nick Koston b0a214830a Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 21:09:43 -05:00
J. Nick Koston 38744e4222 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 21:09:43 -05:00
J. Nick Koston 9624abcd57 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 21:09:42 -05:00
J. Nick Koston 2c229debe8 Best-effort bad encodings, dedupe append warnings, tolerate structurally odd compile DBs 2026-08-20 21:09:38 -05:00
J. Nick Koston 58911dc8bc Cover the missing-hook raise and the analyze-memory refusal 2026-08-20 21:01:14 -05:00
J. Nick Koston a242624ea6 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 20:53:32 -05:00
J. Nick Koston d4031bf207 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 20:53:32 -05:00
J. Nick Koston 170a180458 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 20:53:32 -05:00
J. Nick Koston 5857bfcf52 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 20:53:32 -05:00
J. Nick Koston a17300a4bb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 20:53:32 -05:00
J. Nick Koston 378a01a838 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 20:53:31 -05:00
J. Nick Koston e266a449e0 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 20:53:31 -05:00
J. Nick Koston 6a0ce046fd Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 20:53:31 -05:00
J. Nick Koston 6b6344b454 Cover the healthy post-compile idedata path 2026-08-20 20:53:30 -05:00
J. Nick Koston f0e3fb48c3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 20:48:33 -05:00
J. Nick Koston 64835cbf88 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 20:48:33 -05:00
J. Nick Koston f9d71398d5 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 20:48:33 -05:00
J. Nick Koston 51f477e2c7 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 20:48:32 -05:00
J. Nick Koston a0e82cd000 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 20:48:32 -05:00
J. Nick Koston a56c465d6d Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 20:48:32 -05:00
J. Nick Koston b3d908d10e Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 20:48:32 -05:00
J. Nick Koston 09fd3fb53b Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 20:48:32 -05:00
J. Nick Koston 73ab04330e Treat sys.exit(0) as script success, fail on an unreadable declared script 2026-08-20 20:48:30 -05:00
J. Nick Koston d22a941b24 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 20:46:31 -05:00
J. Nick Koston 4f1c08d3a4 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 20:46:31 -05:00
J. Nick Koston a997b306ea Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 20:46:31 -05:00
J. Nick Koston d883ed5f8a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 20:46:31 -05:00
J. Nick Koston a255f3b07c Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 20:46:31 -05:00
J. Nick Koston 57b69cae81 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 20:46:30 -05:00
J. Nick Koston 9fccf1ce33 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 20:46:30 -05:00
J. Nick Koston b8bb4453e0 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 20:46:30 -05:00
J. Nick Koston 91eed262c8 Repr zero-arg script exceptions, surface a None idedata after an IDF build 2026-08-20 20:46:15 -05:00
J. Nick Koston 1ab13c4291 Cache the native toolchain install and ccache store in CI 2026-08-20 20:45:02 -05:00
J. Nick Koston 1d6a62a8a5 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 20:44:26 -05:00
J. Nick Koston 611aa76f48 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 20:44:26 -05:00
J. Nick Koston 1ce0a456c9 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 20:44:26 -05:00
J. Nick Koston ee9045f021 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 20:44:26 -05:00
J. Nick Koston c1a0ed0d46 Reject only unknown package majors: 2.6.3+ cores share the package-major-3 encoding 2026-08-20 20:44:24 -05:00
J. Nick Koston 3f96590567 Backend-agnostic dispatch guards, positive native polarity, warn on dropped upload_speed 2026-08-20 20:44:08 -05:00
J. Nick Koston 77e9a1d991 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 20:42:44 -05:00
J. Nick Koston fe5325b007 Honor lib_archive, guard unknown boards by name, quote archive names, fix the asm flag filter 2026-08-20 20:42:23 -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 84a10031ee Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 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 eb0cb06951 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 20:39:33 -05:00
J. Nick Koston 4969d9bf4a Pin the lx106 layout, reject non-3.x cores, pin installer args, delegate ccache policy tests 2026-08-20 20:39:20 -05:00
J. Nick Koston 1c5441b69e Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 20:38:30 -05:00
J. Nick Koston ec8437fea2 Quote empty tokens, honest docstrings, strict registry payloads, required layout checks, honest patch targets 2026-08-20 20:38:09 -05:00
J. Nick Koston 8513dfeebd Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 20:36:32 -05:00
J. Nick Koston b42babf749 Route platformio build_unflags natively, correct the gate and fallback comments 2026-08-20 20:35:49 -05:00
J. Nick Koston e1c4984498 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 20:34:25 -05:00
J. Nick Koston 3063b9067a State what the fingerprint test actually pins 2026-08-20 20:34:24 -05:00
J. Nick Koston cbdfb37470 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 19:51:31 -05:00
J. Nick Koston 687291d92c Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 19:51:31 -05:00
J. Nick Koston 48c5570784 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 19:51:31 -05:00
J. Nick Koston 5b56867c71 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 19:51:31 -05:00
J. Nick Koston a73180e073 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 19:51:30 -05:00
J. Nick Koston b7a3181d13 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 19:51:28 -05:00
J. Nick Koston 1958746ae0 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 19:51:28 -05:00
J. Nick Koston 62c27826ee Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 19:51:27 -05:00
J. Nick Koston c95e0b90f5 Raise on a traversing extraScript, survive sys.exit in vendored scripts, fix the caveats wording 2026-08-20 19:51:26 -05:00
J. Nick Koston 339f0c3092 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 19:29:29 -05:00
J. Nick Koston f1bd58c222 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 19:29:29 -05:00
J. Nick Koston fc26bc081b Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 19:29:29 -05:00
J. Nick Koston 2a09cd81d3 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 19:29:29 -05:00
J. Nick Koston cc3f9be805 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 19:29:29 -05:00
J. Nick Koston b05efb0811 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 19:29:29 -05:00
J. Nick Koston 321bc3b459 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 19:29:28 -05:00
J. Nick Koston 84a3c39562 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 19:29:28 -05:00
J. Nick Koston 5cf2135038 Cover the warn-once dedup branch 2026-08-20 19:29:27 -05:00
J. Nick Koston 7aaa874150 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	tests/unit_tests/test_main.py
2026-08-20 19:26:19 -05:00
J. Nick Koston 5838111107 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 19:25:46 -05:00
J. Nick Koston 3466285547 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 19:25:46 -05:00
J. Nick Koston 5da6a2abeb Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 19:25:46 -05:00
J. Nick Koston b3afd951fe Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 19:25:46 -05:00
J. Nick Koston 8dd065997f Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 19:25:46 -05:00
J. Nick Koston 13e84e9bff Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 19:25:45 -05:00
J. Nick Koston 7ad97697b2 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 19:25:45 -05:00
J. Nick Koston 5bd328e6c4 Fail on a declared-but-absent extraScript, warn once per unsupported env method, split and widen tests 2026-08-20 19:25:33 -05:00
J. Nick Koston c9dbf79970 Widen the post-build idedata guard the same way 2026-08-20 19:03:14 -05:00
J. Nick Koston bed3389faf Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 19:02:47 -05:00
J. Nick Koston 6825996e32 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 19:02:47 -05:00
J. Nick Koston 4990093540 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 19:02:47 -05:00
J. Nick Koston 878883bb67 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 19:02:47 -05:00
J. Nick Koston 5bdd387c2a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 19:02:47 -05:00
J. Nick Koston 8c671ae8ea Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 19:02:46 -05:00
J. Nick Koston ac1160de25 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 19:02:46 -05:00
J. Nick Koston 5cec72020f Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 19:02:46 -05:00
J. Nick Koston ef2f16713a Widen the post-compile idedata guard to every failure the comment promises 2026-08-20 19:02:35 -05:00
J. Nick Koston 406d5c87ed Warn instead of failing when the post-build idedata is unusable 2026-08-20 18:41:38 -05:00
J. Nick Koston 8e63fa3c2a Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain
# Conflicts:
#	tests/unit_tests/test_main.py
2026-08-20 18:41:07 -05:00
J. Nick Koston fec60a7ff8 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 18:40:47 -05:00
J. Nick Koston 604ceb3de3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 18:40:47 -05:00
J. Nick Koston 5605d079d4 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 18:40:46 -05:00
J. Nick Koston 0268abc1e4 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 18:40:46 -05:00
J. Nick Koston c103e4d974 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 18:40:46 -05:00
J. Nick Koston 06fc234b12 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 18:40:46 -05:00
J. Nick Koston 12f8b14418 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 18:40:46 -05:00
J. Nick Koston 790c6d6353 Drop the never-hitting parse memo, guard the post-compile idedata refresh, pin the kind map 2026-08-20 18:40:29 -05:00
J. Nick Koston 0186a0568b Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 18:28:28 -05:00
J. Nick Koston d342d0a246 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 18:28:28 -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 a397fcf373 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 18:18:29 -05:00
J. Nick Koston b0b3017d78 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 18:18:29 -05:00
J. Nick Koston 294fc2dd54 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 18:18:29 -05:00
J. Nick Koston 0ae75b01d8 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 18:18:29 -05:00
J. Nick Koston fdd2920dbc Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 18:18:29 -05:00
J. Nick Koston 47780fec6e Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra
# Conflicts:
#	esphome/platformio/toolchain.py
2026-08-20 18:18:26 -05:00
J. Nick Koston c3e7d37d29 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 18:18:07 -05:00
J. Nick Koston 77fa411f04 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 18:18:07 -05:00
J. Nick Koston bc6b997350 Restore the lazy shlex import, pin the probe convention, assert the shim diagnostics 2026-08-20 18:17:56 -05:00
J. Nick Koston 949a45b29d Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 17:54:09 -05:00
J. Nick Koston 6437a676b8 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 17:54:09 -05:00
J. Nick Koston 0c0f482acf Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 17:54:08 -05:00
J. Nick Koston 1bdddcc55e Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 17:54:08 -05:00
J. Nick Koston 73cd9f75b4 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 17:54:08 -05:00
J. Nick Koston a5a1a017d0 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra
# Conflicts:
#	esphome/platformio/toolchain.py
2026-08-20 17:53:57 -05:00
J. Nick Koston 9f3df90dba Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 17:52:58 -05:00
J. Nick Koston e20c43520b Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 17:52:57 -05:00
J. Nick Koston 9b12934307 Reject a launcher compile DB by name before the probe, discard partial script captures, log dropped env keys 2026-08-20 17:52:54 -05:00
J. Nick Koston 63da361100 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 17:30:37 -05:00
J. Nick Koston cff6871bd7 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 17:30:37 -05:00
J. Nick Koston 38cab9a775 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 17:30:37 -05:00
J. Nick Koston b6ea116b16 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	tests/unit_tests/test_platformio_library.py
2026-08-20 17:30:36 -05:00
J. Nick Koston eb38afb569 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 17:30:00 -05:00
J. Nick Koston 60896b3533 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 17:30:00 -05:00
J. Nick Koston 46baef5231 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 17:29:59 -05:00
J. Nick Koston f93d46e684 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 17:29:59 -05:00
J. Nick Koston d33a097152 Name every skipped size line, best-effort script compile, unusable idedata returns None 2026-08-20 17:29:47 -05:00
J. Nick Koston ee27ba64c0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 17:12:52 -05:00
J. Nick Koston 53c07a2bb5 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 17:12:52 -05:00
J. Nick Koston e8482a3030 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 17:12:52 -05:00
J. Nick Koston b2452fe397 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	tests/unit_tests/test_platformio_library.py
2026-08-20 17:12:49 -05:00
J. Nick Koston 14a58b788d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 17:12:32 -05:00
J. Nick Koston 454f299cd2 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 17:12:31 -05:00
J. Nick Koston 70a3880c9f Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 17:12:31 -05:00
J. Nick Koston 8008eda57f Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 17:12:31 -05:00
J. Nick Koston 466f890e1f Clean errors for non-string flags, visible size-summary skips, partial extra-script capture 2026-08-20 17:12:19 -05:00
J. Nick Koston badf21e7b0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:56:37 -05:00
J. Nick Koston a59b0bfcf8 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:56:37 -05:00
J. Nick Koston f91b1bc84e Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:56:37 -05:00
J. Nick Koston 88a5cdb53c Bare flags in the manifest fixture join within an entry, as ParseFlags does 2026-08-20 16:56:36 -05:00
J. Nick Koston ab81ae8aec Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:55:09 -05:00
J. Nick Koston 6aec54d8c9 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:55:09 -05:00
J. Nick Koston 3943f24e55 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:55:09 -05:00
J. Nick Koston 70cf20640c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/espidf/component.py
2026-08-20 16:54:55 -05:00
J. Nick Koston 8af1b9a523 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:54:39 -05:00
J. Nick Koston 9c543c9776 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:54:39 -05:00
J. Nick Koston fd47d5bcd2 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 16:54:39 -05:00
J. Nick Koston 57b7f03e42 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 16:54:39 -05:00
J. Nick Koston 4ab2a7ba98 Join flag args per entry like ParseFlags, pin the launcher strip log, record the asm merge decision 2026-08-20 16:54:28 -05:00
J. Nick Koston ab7faccf2c Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:51:31 -05:00
J. Nick Koston b3927e0845 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:51:30 -05:00
J. Nick Koston 25e145362c Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:51:30 -05:00
J. Nick Koston 370f83769c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:51:30 -05:00
J. Nick Koston 96aabe428a Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:51:30 -05:00
J. Nick Koston cb2dfddf17 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:51:30 -05:00
J. Nick Koston 20f0e37f43 Cover the unresolved-toolchain ordering guard 2026-08-20 16:51:29 -05:00
J. Nick Koston ba569e72ec Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:46:52 -05:00
J. Nick Koston bb5c0ff930 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:46:52 -05:00
J. Nick Koston 5fa5b93201 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:46:52 -05:00
J. Nick Koston 8e25bfddb2 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:46:52 -05:00
J. Nick Koston f4eefa111d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:46:52 -05:00
J. Nick Koston 2bbca6229a Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:46:51 -05:00
J. Nick Koston a50c4db187 Type the toolchain factories, guard the legacy libretiny stub, tighten the gate comments 2026-08-20 16:46:48 -05:00
J. Nick Koston 71fffcf410 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:34:32 -05:00
J. Nick Koston b82cc8be65 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:34:32 -05:00
J. Nick Koston d1889d09da Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:34:32 -05:00
J. Nick Koston e918d37aa8 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:34:31 -05:00
J. Nick Koston 1ecbb57b24 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:34:31 -05:00
J. Nick Koston 2e0b330366 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:34:31 -05:00
J. Nick Koston aea97d1022 Cover the arduino toolchain predicate 2026-08-20 16:34:21 -05:00
J. Nick Koston 301e7efad5 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:30:27 -05:00
J. Nick Koston 1bc9312ed7 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:30:27 -05:00
J. Nick Koston 41cb973eee Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:30:27 -05:00
J. Nick Koston 6392620f6c Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:30:27 -05:00
J. Nick Koston 65f5c302c5 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 16:30:26 -05:00
J. Nick Koston 16be3b1bbb Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:30:26 -05:00
J. Nick Koston 84940f1726 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:30:26 -05:00
J. Nick Koston 519ea38d73 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 16:30:26 -05:00
J. Nick Koston a0f0ad8729 Restore the underscore in test_parse_library_json 2026-08-20 16:30:13 -05:00
J. Nick Koston 5d10240521 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:25:49 -05:00
J. Nick Koston 137f58f00e Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:25:49 -05:00
J. Nick Koston d80bfb39d2 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:25:49 -05:00
J. Nick Koston 7f033fd993 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:25:49 -05:00
J. Nick Koston 51af18cdfb Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 16:25:48 -05:00
J. Nick Koston efacdd57ac Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:25:48 -05:00
J. Nick Koston 2280d3352d Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:25:48 -05:00
J. Nick Koston 0fad14be59 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 16:25:48 -05:00
J. Nick Koston 57a9c71da8 Cover the malformed build.flags rejection 2026-08-20 16:25:47 -05:00
J. Nick Koston baedceb8b6 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:24:56 -05:00
J. Nick Koston 5f09bf868d Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 16:24:56 -05:00
J. Nick Koston 2579c11889 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:24:56 -05:00
J. Nick Koston 04422a0437 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend
# Conflicts:
#	esphome/platformio/library.py
2026-08-20 16:24:54 -05:00
J. Nick Koston 3d8a3c6527 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 16:24:32 -05:00
J. Nick Koston e618c99f7d Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:24:32 -05:00
J. Nick Koston 89df2787f2 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:24:32 -05:00
J. Nick Koston 53f1cc116a Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 16:24:32 -05:00
J. Nick Koston 1483b7c10b Detect launchers by a closed denylist instead of guessing compiler names 2026-08-20 16:24:21 -05:00
J. Nick Koston f747322bc0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:21:04 -05:00
J. Nick Koston 6eaa43a7b2 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-20 16:21:03 -05:00
J. Nick Koston 1576a592e2 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:20:45 -05:00
J. Nick Koston e121fd3a37 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:20:45 -05:00
J. Nick Koston c8e816bf48 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:20:45 -05:00
J. Nick Koston 53935615f1 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:20:45 -05:00
J. Nick Koston 360c51329c Cover the native-toolchain predicate 2026-08-20 16:20:37 -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 2cb5e8d818 Warn on a failing addr2line on the PlatformIO path too 2026-08-20 16:15:42 -05:00
J. Nick Koston 0f40f23ec4 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:15:16 -05:00
J. Nick Koston 5c36fefe21 Drop the escaping test duplicated by the shared ninja module tests 2026-08-20 16:15:15 -05:00
J. Nick Koston e12bad27bb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 16:14:26 -05:00
J. Nick Koston c3f7ce7a02 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-20 16:14:24 -05:00
J. Nick Koston 57561e5a4d Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:14:04 -05:00
J. Nick Koston 10b13558c3 Line-oriented rspfile expansion, adopt the public manifest parser, document the dependency policy 2026-08-20 16:13:55 -05:00
J. Nick Koston 2e183f262b Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:13:21 -05:00
J. Nick Koston d82c2eaeb1 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:13:21 -05:00
J. Nick Koston 37de984df5 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 16:13:20 -05:00
J. Nick Koston c96c05eea4 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-build-infra 2026-08-20 16:13:20 -05:00
J. Nick Koston 2cf4087e2f Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 16:13:20 -05:00
J. Nick Koston 7fe0847e5c Update espidf test to the public parse_library_json name 2026-08-20 16:13:19 -05:00
J. Nick Koston 80815f1dc7 Make parse_library_json public alongside its properties sibling 2026-08-20 16:12:52 -05:00
J. Nick Koston 252422c706 Match ASPPCOM flag routing, quote manifest link tokens, split the src-dir error, pin the change contract 2026-08-20 16:12:28 -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 5b19c139cb Force-quote shell metacharacters outside the safe token set 2026-08-20 16:09:09 -05:00
J. Nick Koston c629e4a94c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission
# Conflicts:
#	esphome/build_gen/arduino8266.py
#	tests/unit_tests/build_gen/test_arduino8266.py
2026-08-20 16:07:57 -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 e187522490 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer 2026-08-20 16:06:32 -05:00
J. Nick Koston 6982cfeb9a Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:06:32 -05:00
J. Nick Koston 57c956dfc3 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:06:32 -05:00
J. Nick Koston 79b8bf2657 Carry the ninja escaping and quoting helpers with tests 2026-08-20 16:06:30 -05:00
J. Nick Koston e95869c656 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 16:05:20 -05:00
J. Nick Koston f9705772bb Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 16:05:19 -05:00
J. Nick Koston e36b8c5446 Point the ccache probe patch at its new module 2026-08-20 16:04:43 -05:00
J. Nick Koston 9c52c349d6 Merge branch 'esp8266-native-build-infra' into esp8266-native-framework-installer
# Conflicts:
#	esphome/components/nrf52/framework.py
#	esphome/espidf/framework.py
#	esphome/framework_helpers.py
#	esphome/platformio/toolchain.py
2026-08-20 16:04:05 -05:00
J. Nick Koston d4861d89b0 Add the shared registry, ninja, ccache, and tools-cache infrastructure for native toolchains 2026-08-20 16:03:38 -05:00
J. Nick Koston 3166136db0 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 16:02:03 -05:00
J. Nick Koston 8f5f349e1b Pin the decoy anchor, guard unselected segments, fingerprint the module source 2026-08-20 16:01:06 -05:00
J. Nick Koston 83b4da1777 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 15:59:10 -05:00
J. Nick Koston 12c1b15578 Reject malformed build.flags by name and pin the idedata cache-hit path 2026-08-20 15:59:03 -05:00
J. Nick Koston 15f21342d0 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 15:55:02 -05:00
J. Nick Koston 1aece78707 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 15:55:02 -05:00
J. Nick Koston 219bf6ff71 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 15:55:02 -05:00
J. Nick Koston 7796911837 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 15:55:02 -05:00
J. Nick Koston e6debb980d Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-framework-installer 2026-08-20 15:55:01 -05:00
J. Nick Koston b3d5fccba5 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 15:55:01 -05:00
J. Nick Koston 6a84d67786 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 15:55:01 -05:00
J. Nick Koston ed48f36fa8 Route native dispatch through a platform hook, hoist the pio-options warner, adopt shared toolchain factories 2026-08-20 15:53:58 -05:00
J. Nick Koston b3a0856afd Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 15:49:05 -05:00
J. Nick Koston aa4dd3d0a1 Hoist the ninja quoting helpers, type the installed paths, format flash size from board data 2026-08-20 15:48:56 -05:00
J. Nick Koston 8f40b00fc3 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 15:46:56 -05:00
J. Nick Koston 6476fcbe1c Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 15:46:48 -05:00
J. Nick Koston d4e3603a19 Drop the dead name injection and pass board_mcu lazily 2026-08-20 15:46:39 -05:00
J. Nick Koston e032f37e04 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 15:46:18 -05:00
J. Nick Koston b90aeb17e3 Hoist find_ninja to build_helpers, type the installed paths, dedupe espidf ccache env 2026-08-20 15:46:07 -05:00
J. Nick Koston 3a51514fc1 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-framework-installer 2026-08-20 15:44:34 -05:00
J. Nick Koston 6ad3e0d8ad Add toolchain validator factories and a native-toolchain predicate 2026-08-20 15:44:23 -05:00
J. Nick Koston 7a3f700206 Act on bad-compiler detection, atomic logged idedata cache, memoized entry parsing, callable board_mcu 2026-08-20 15:41:39 -05:00
J. Nick Koston cbd5e08aa9 Adopt the shared size line printer and cover the moved modules in the native CI triggers 2026-08-20 15:30:03 -05:00
J. Nick Koston d736b0d1eb Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 15:29:04 -05:00
J. Nick Koston ea429ffdb6 Derive the suffix rule map, dedupe quoting and unflag filtering, adopt the moved library backend 2026-08-20 15:28:55 -05:00
J. Nick Koston a46a8f4832 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 15:27:10 -05:00
J. Nick Koston 4ef65315de Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 15:27:09 -05:00
J. Nick Koston 857bcaef4d Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 15:27:09 -05:00
J. Nick Koston 5a5496f7f7 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-framework-installer
# Conflicts:
#	esphome/platformio/toolchain.py
2026-08-20 15:26:58 -05:00
J. Nick Koston 9d9953ea47 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 15:26:39 -05:00
J. Nick Koston 7d9c18a330 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 15:26:38 -05:00
J. Nick Koston ca47309a36 Move the Arduino library backend to esphome/arduino and close_fds the ar shim 2026-08-20 15:26:17 -05:00
J. Nick Koston 113259275c Move the PlatformIO registry installer to esphome.platformio.registry and transliterate get_systype 2026-08-20 15:25:12 -05:00
J. Nick Koston 5a4337c240 Share the size line format, derive source extensions from a kind map, close_fds on the ccache probe 2026-08-20 15:21:31 -05:00
J. Nick Koston 8043767460 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 15:13:09 -05:00
J. Nick Koston e981e6014d Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 15:13:08 -05:00
J. Nick Koston 1094e3e085 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 15:13:08 -05:00
J. Nick Koston 2508899cad Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 15:13:08 -05:00
J. Nick Koston 1c7b4275ad Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 15:12:49 -05:00
J. Nick Koston 7dca5da948 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 15:12:49 -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 38b6f222b5 Use a host table and the shared downloader for registry metadata 2026-08-20 15:12:37 -05:00
J. Nick Koston 5d173d851e Cover the idedata failure warning after a successful build 2026-08-20 14:53:58 -05:00
J. Nick Koston 2c883a2c26 Toolchain-suffixed idedata cache, surfaced idedata failures, and per-dump decode warnings 2026-08-20 14:48:18 -05:00
J. Nick Koston 258417d7d3 Merge branch 'esp8266-native-library-backend' into esp8266-arduino-toolchain 2026-08-20 14:47:14 -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 976a5ed988 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 14:44:21 -05:00
J. Nick Koston c72de504fd Hard install lock, ninja-first install order, enforced floor, backoff, and by-name host failures everywhere 2026-08-20 14:43:48 -05:00
J. Nick Koston ff167e5193 Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-framework-installer 2026-08-20 14:41:55 -05:00
J. Nick Koston 2861cbb749 Harden the shared toolchain check and pin every platform family's rejection 2026-08-20 14:41:23 -05:00
J. Nick Koston 8bf699cf79 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 14:39:21 -05:00
J. Nick Koston 375cf95240 Anchor the segment regex, reject unknown segments, and pin real-script fixtures 2026-08-20 14:38:25 -05:00
J. Nick Koston d6a9fd5238 Adopt the shared toolchain check, dedupe the native-module dispatch, and complete the trigger set 2026-08-20 14:32:31 -05:00
J. Nick Koston 421f648a07 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 14:30:15 -05:00
J. Nick Koston a0d56d02d0 Tighten the emission half: shared srcflags, single escapes, one testing-name derivation 2026-08-20 14:29:54 -05:00
J. Nick Koston b384483fdc Merge branch 'esp8266-native-framework-installer' into esp8266-arduino-toolchain 2026-08-20 14:24:43 -05:00
J. Nick Koston 796172ce1a Merge branch 'esp8266-native-framework-installer' into esp8266-native-build-spec 2026-08-20 14:24:42 -05:00
J. Nick Koston f5fc145dd3 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 14:24:42 -05:00
J. Nick Koston d330d6ff99 Merge branch 'esp8266-native-framework-installer' into esp8266-native-ninja-emission 2026-08-20 14:24:42 -05:00
J. Nick Koston f44398b09e Fix the remaining ccache probe patch target 2026-08-20 14:24:28 -05:00
J. Nick Koston 0f56a37242 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 14:22:17 -05:00
J. Nick Koston 866c59384c Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 14:22:05 -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 102973524e Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 14:14:47 -05:00
J. Nick Koston 1307cc25c5 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 14:14:44 -05:00
J. Nick Koston 353ef2dee1 Merge branch 'esp8266-native-build-surgery' into esp8266-native-framework-installer 2026-08-20 14:14:44 -05:00
J. Nick Koston 18e3eac419 Export a surgery fingerprint for linker-script cache stamps 2026-08-20 14:14:32 -05:00
J. Nick Koston e77102e9a8 Merge branch 'esp8266-native-framework-installer' into esp8266-arduino-toolchain 2026-08-20 14:07:49 -05:00
J. Nick Koston 83d9351925 Merge branch 'esp8266-native-framework-installer' into esp8266-native-ninja-emission 2026-08-20 14:07:48 -05:00
J. Nick Koston b3faae60f2 Merge branch 'esp8266-native-framework-installer' into esp8266-native-build-spec 2026-08-20 14:07:48 -05:00
J. Nick Koston 18f39a0e53 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 14:07:48 -05:00
J. Nick Koston d9cc72c650 Point the ccache tests at the shared helpers 2026-08-20 14:07:34 -05:00
J. Nick Koston 5aecdd9c7a Point the ccache tests at the shared helpers 2026-08-20 14:06:43 -05:00
J. Nick Koston b584085af2 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 14:05:09 -05:00
J. Nick Koston d4c4424587 Merge branch 'esp8266-native-framework-installer' into esp8266-native-ninja-emission 2026-08-20 14:04:54 -05:00
J. Nick Koston 87276a8ca5 Merge branch 'esp8266-native-framework-installer' into esp8266-native-build-spec 2026-08-20 14:04:53 -05:00
J. Nick Koston f0f9af2ad6 Merge branch 'esp8266-native-framework-installer' into esp8266-native-library-backend 2026-08-20 14:04:53 -05:00
J. Nick Koston 0fe9d87124 Share the ccache and tools-path helpers across the native backends 2026-08-20 14:04:38 -05:00
J. Nick Koston 5398ca98eb Merge branch 'esp8266-native-toolchain-plumbing' into esp8266-native-framework-installer 2026-08-20 13:59:14 -05:00
J. Nick Koston bbf2788684 Share one unsupported-toolchain check across platforms 2026-08-20 13:58:46 -05:00
J. Nick Koston c7e1d044a3 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 13:57:53 -05:00
J. Nick Koston 0620ce81c3 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 13:57:51 -05:00
J. Nick Koston 2564ad0deb Warn once per non-compiler path, accept versioned compiler names, and pin the trigger table 2026-08-20 13:57:30 -05:00
J. Nick Koston 3f70f11b71 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 13:50:10 -05:00
J. Nick Koston 73132ba852 Merge branch 'esp8266-native-build-spec' into esp8266-native-ninja-emission 2026-08-20 13:49:45 -05:00
J. Nick Koston 0d3333f245 Merge branch 'esp8266-native-library-backend' into esp8266-native-build-spec 2026-08-20 13:49:09 -05:00
J. Nick Koston 03d5b131ca Adopt the relocated extraScript helper and its neutral parameter 2026-08-20 13:48:56 -05:00
J. Nick Koston 0ed4c47b66 Adopt the exact-segments surgery API 2026-08-20 13:48:16 -05:00
J. Nick Koston 3ac8ff1176 Merge branch 'esp8266-native-build-surgery' into esp8266-native-library-backend 2026-08-20 13:44:30 -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 fa45c4a016 Merge branch 'esp8266-native-build-surgery' into esp8266-native-framework-installer 2026-08-20 13:44:29 -05:00
J. Nick Koston 3d7c0eac57 Merge branch 'esp8266-native-build-surgery' into esp8266-native-toolchain-plumbing 2026-08-20 13:44:29 -05:00
J. Nick Koston e3936f500f Patch exactly the named segments and share the segment-line pattern 2026-08-20 13:44:12 -05:00
J. Nick Koston cea86989c9 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 13:42:37 -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 3eec5085da Give the format_bar tests a unique basename 2026-08-20 13:39:46 -05:00
J. Nick Koston 57c8648210 Drop the test package init that collides with script/build_helpers.py on the CI path 2026-08-20 13:38:54 -05:00
J. Nick Koston aa3c15d098 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 13:37:23 -05:00
J. Nick Koston d3524db735 Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 13:35:53 -05:00
J. Nick Koston 340f098872 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-ninja-emission 2026-08-20 13:35:43 -05:00
J. Nick Koston c5afb0b665 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-spec 2026-08-20 13:35:43 -05:00
J. Nick Koston 8f9aca154f Merge branch 'esp8266-native-shared-helpers' into esp8266-native-library-backend 2026-08-20 13:35:42 -05:00
J. Nick Koston 1db7309f4a Merge branch 'esp8266-native-shared-helpers' into esp8266-native-framework-installer 2026-08-20 13:35:42 -05:00
J. Nick Koston 1d0a1d2b38 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-toolchain-plumbing 2026-08-20 13:35:42 -05:00
J. Nick Koston 46fa42fa33 Merge branch 'esp8266-native-shared-helpers' into esp8266-native-build-surgery 2026-08-20 13:35:42 -05:00
J. Nick Koston 9bd548ba92 Move the extraScript machinery into the platformio package and tidy the extraction 2026-08-20 13:35:07 -05:00
J. Nick Koston 5993a5acfa Merge branch 'esp8266-native-ninja-emission' into esp8266-arduino-toolchain 2026-08-20 13:04:59 -05:00
J. Nick Koston 207968f301 Add the ESP8266 native ninja emission 2026-08-20 13:03:50 -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
J. Nick Koston 82c3c1f50a Add the ESP8266 native library backend 2026-08-20 12:59:10 -05:00
J. Nick Koston 3e77654719 Add the ESP8266 Arduino framework and toolchain installer 2026-08-20 12:58:06 -05:00
J. Nick Koston 04ad9524f5 Add the arduino toolchain enum and validate --toolchain on every platform 2026-08-20 12:56:34 -05:00
J. Nick Koston 72da2b1ce2 Add the ESP8266 linker-script surgery and board build metadata 2026-08-20 12:53:50 -05:00
J. Nick Koston 9ddcd6336e Merge branch 'esp8266-native-shared-helpers' into esp8266-arduino-toolchain 2026-08-20 12:51:01 -05:00
J. Nick Koston ab58f1080a Cover the tidy-project idedata assembly and hoist its helper import 2026-08-20 12:50:56 -05:00
J. Nick Koston 898bb78c7b Merge branch 'esp8266-native-shared-helpers' into esp8266-arduino-toolchain 2026-08-20 12:48:03 -05:00
J. Nick Koston 47942fb166 Note the upstream spelling in the format_bar citation 2026-08-20 12:47:54 -05:00
J. Nick Koston c96360d83c Merge branch 'esp8266-native-shared-helpers' into esp8266-arduino-toolchain 2026-08-20 12:46:43 -05:00
J. Nick Koston f326c3f04d Move the shared helpers into a neutral build_helpers package 2026-08-20 12:43:34 -05:00
J. Nick Koston 3b51ec2ae7 Extract the shared native-build helpers from the ESP-IDF backend 2026-08-20 12:36:42 -05:00
J. Nick Koston 96c1b90f19 Merge remote-tracking branch 'origin/dev' into esp8266-arduino-toolchain 2026-08-20 12:32:30 -05:00
J. Nick Koston 100dc04b38 Re-glue spaced -D tokens so knob defines are detected like PlatformIO 2026-08-20 11:37:28 -05:00
J. Nick Koston 7a2eaad9ce Warn when a compile entry does not lead with a compiler and fail on an empty core archive 2026-08-20 10:48:58 -05:00
J. Nick Koston 785260626e Warn once per missing decode tool and document the launcher-free ESP-IDF compile database 2026-08-20 10:45:36 -05:00
J. Nick Koston 1477de24d3 Skip the RAM and Flash summary lines together when the flash budget is unknown 2026-08-20 10:09:57 -05:00
J. Nick Koston 069ae156f9 Strip the exact configured launcher from compile commands instead of guessing by name 2026-08-20 09:55:15 -05:00
J. Nick Koston 0d38e47646 Share the argv quoting core between path and token quoting 2026-08-20 09:42:49 -05:00
J. Nick Koston d614e91753 Cross-platform token quoting, ninja-safe dollar escaping, and a tighter install path 2026-08-20 09:38:44 -05:00
J. Nick Koston a90dd88aa8 Lex every build_flags entry with re-quoted emission and lock the shared cache install 2026-08-20 09:33:49 -05:00
J. Nick Koston 47564d3a74 Merge branch 'dev' into esp8266-arduino-toolchain 2026-08-20 09:06:15 -05:00
J. Nick Koston 4eeceded0d Make the testing-mode require explicit, reject a missing declared srcDir, and validate installs before marking success 2026-08-20 08:08:29 -05:00
J. Nick Koston 0defff2c81 Warn when component-added platformio options are dropped by the native build 2026-08-20 07:53:16 -05:00
J. Nick Koston 0e561d8c1f Surface malformed build flag entries as clean errors 2026-08-20 07:47:54 -05:00
J. Nick Koston 2d93300903 Detect knobs in multi-token build_flags entries and drop a zero flash budget with a warning 2026-08-20 07:39:14 -05:00
J. Nick Koston a005008cfb Retry registry queries and surface failures as clean errors 2026-08-20 07:34:41 -05:00
J. Nick Koston dad9a1175b Reject unsupported toolchains on the PlatformIO-only platforms and warn on empty srcFilter matches 2026-08-20 06:52:54 -05:00
J. Nick Koston 42e9448a50 Cover the YAML toolchain key resolution 2026-08-20 06:48:24 -05:00
J. Nick Koston eaae2e543b Reject unsupported CLI toolchains on every platform and complete the native CI triggers 2026-08-20 06:30:07 -05:00
J. Nick Koston 4520f27d94 Raise the actionable ninja message when the package itself is missing 2026-08-20 06:17:10 -05:00
J. Nick Koston 3f9568eaf0 Fail loudly on hosts with no toolchain build instead of assuming linux_x86_64 2026-08-20 06:02:20 -05:00
J. Nick Koston aa03404319 Close the native CI trigger gap and log the remaining silent library skips 2026-08-20 05:35:17 -05:00
J. Nick Koston 2483117648 Store the native version floor as a Version and tidy the dependency skip 2026-08-20 05:25:25 -05:00
J. Nick Koston ff7161d7eb Surface silently dropped inputs and anchor the platform defaults to shared constants 2026-08-20 05:21:41 -05:00
J. Nick Koston 4f11db4232 Reject framework 3.1.0 (no registry package) and warn when platform_version is ignored 2026-08-20 05:16:51 -05:00
J. Nick Koston 311f610787 Make the link-line and tool-path tests platform-independent 2026-08-20 05:10:58 -05:00
J. Nick Koston 7f2515edf1 Share the PlatformIO flag-lexing helper and flatten the build_flags classifier 2026-08-20 05:03:49 -05:00
J. Nick Koston eb3a64829f Shell-lex -L/-l build_flags entries and generate the compile database before the build 2026-08-20 04:59:27 -05:00
J. Nick Koston 7cb22725e3 Escape object paths once at the source and drop a dead parameter 2026-08-20 04:39:50 -05:00
J. Nick Koston db010d486e Revert ninja command quoting (ninja escapes its own path variables); share the lib_ignore helper 2026-08-20 04:31:01 -05:00
J. Nick Koston c579a2792f Address review: quote ninja command paths, refuse unverified downloads, extend lib_ignore and build_unflags parity 2026-08-20 04:23:14 -05:00
J. Nick Koston 005c01e1e2 Address review: Windows binutils suffix, honor build_unflags against framework flags 2026-08-20 03:51:08 -05:00
J. Nick Koston 59c309083d Address review: include surgery constants in the ld stamp, require size sections, warn on missing extraScript 2026-08-20 03:36:44 -05:00
J. Nick Koston 9cf7ff94ac Resolve bare registry libraries at latest version like PlatformIO; tighten review cleanups 2026-08-20 03:07:07 -05:00
J. Nick Koston 702ef56a88 Address review: route project -L/-l to the link, fail on unresolvable libraries, remove dead ninja constants, tighten diagnostics 2026-08-20 02:54:00 -05:00
J. Nick Koston 7065beaabc Cover the native toolchain dispatch branches in idedata and analyze-memory 2026-08-20 01:53:50 -05:00
J. Nick Koston e331813299 Get ninja from the PyPI wheel instead of hardcoded release URLs and checksums 2026-08-20 01:52:07 -05:00
J. Nick Koston 0c48f749c2 Fix testing-mode segment requirements per linker script; simplify downloads and native command dispatch 2026-08-20 01:45:39 -05:00
J. Nick Koston 3ae229f218 Fix analyze-memory test path expectations on Windows 2026-08-20 01:38:21 -05:00
J. Nick Koston 5df08d36be Address review: wire analyze-memory and idedata for the native toolchain, warn on ignored platformio_options, verify downloads, surface silent failures 2026-08-20 01:34:15 -05:00
J. Nick Koston 60b7b874f1 Address review: route versioned bare libraries to the registry, deterministic MMU order, scoped toolchain branches, diagnostics 2026-08-20 00:00:51 -05:00
J. Nick Koston 66f6f5c004 Address review: cover all source suffixes, pass PIOPLATFORM through, link library -Wl flags 2026-08-19 23:50:16 -05:00
J. Nick Koston 9429243d2b Fix determine-jobs narrowing helper and add esp8266-native tests 2026-08-19 23:19:52 -05:00
J. Nick Koston 3fe9cac1fc Apply review cleanups to the native ESP8266 toolchain 2026-08-19 23:13:30 -05:00
J. Nick Koston 8811224c0e Add full test coverage for the native ESP8266 toolchain 2026-08-19 22:59:05 -05:00
J. Nick Koston 373bee8aca [esp8266] Add native toolchain that builds the Arduino core without PlatformIO 2026-08-19 22:31:46 -05:00
J. Nick Koston 28384673f6 Merge branch 'dev' into espidf_parallel_tool_prefetch 2026-08-19 16:32:48 -05:00
J. Nick Koston b361342bde Do not end a progress bar that never drew a frame 2026-08-19 15:13:04 -05:00
J. Nick Koston d34eed6d2d Merge branch 'dev' into espidf_parallel_tool_prefetch 2026-08-19 14:41:44 -05:00
J. Nick Koston 12238eec3b Log prefetch failures after the bar, assert on the shared progress instance 2026-08-19 13:57:15 -05:00
J. Nick Koston fe53ff6b6b Finish the batch bar, cancel queued archives on Ctrl-C, report known sizes 2026-08-19 13:28:42 -05:00
J. Nick Koston d0f38d7644 [espidf] Download tool archives in parallel during the install prefetch 2026-08-19 12:03:39 -05:00
4453 changed files with 26111 additions and 148293 deletions

No files matched your search

-123
View File
@@ -1,123 +0,0 @@
---
name: hardware-test
description: Test an ESPHome change on real boards over USB. Use this whenever a task asks to test, verify, reproduce, bench, A/B or soak a pull request, a branch or a crash on hardware, or mentions flashing, serial logs, esphome upload, a captive portal or fallback AP test, or results to post on a PR. Covers finding the serial ports, building from the right checkout, flashing each chip family (including the LibreTiny kits that stock tools cannot flash), bounded log capture, proven test flows and how to report results.
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
---
# Hardware testing
The goal of a hardware test is evidence a reviewer can trust: which build ran on which board, what was
driven, what the logs show, and the same flow on a `dev` build when a quirk could be pre-existing.
`$SKILL` below is this directory (`.agents/skills/hardware-test`).
## Ground rules
1. **Serial ports cannot be shared.** One bounded capture per port, stopped before any flash on that
port, never an open-ended `esphome logs`. Stop a capture with `pkill -f "[s]erial_capture.py <port> "`,
naming the port so a capture on another board survives; the bracket keeps the pattern from matching
the shell that runs it. Never run `esphome logs` in a
`while true` loop: the loop respawns it and holds the port.
2. **Credentials stay local.** Put a `secrets.yaml` next to the scratch configs and reference it with
`!secret`. Never paste a config with credentials into a PR, never commit scratch configs or logs.
3. **Build from the tree under test.** `python -m esphome` puts the current directory first on
`sys.path`, so run it with the checkout or worktree as the working directory and pass the yaml by
its absolute path. A venv `esphome` entry point may import an installed snapshot instead of the
checkout. Confirm with `python -c 'import esphome; print(esphome.__file__)'`, and for an A/B grep
the build's `src/` for the change before trusting any number.
4. **PR build and baseline build get different `name:` values.** Builds share
`.esphome/build/<name>`, so the same name means `esphome upload` can flash the wrong binary. Saved
Wi-Fi credentials are keyed by the name too, so a test that must start unprovisioned gets a fresh
name every run.
5. **Flash and RAM deltas are measured against the PR's merge base** (`git merge-base origin/dev HEAD`
checked out in a throwaway worktree), with the baseline commit named in the table. When a delta
looks odd, diff symbol sizes (`nm -S -C --size-sort` from the matching toolchain) before quoting it.
6. **Prove a quirk is pre-existing before blaming the PR:** run the identical flow on a `dev` build in
the same session and say so in the results.
7. **Pipe safely.** Set `PYTHONUNBUFFERED=1` on any `esphome run` or `esphome logs` whose output is
piped, or lines land minutes late. Bound every long command with `timeout` (coreutils) or
`perl -e 'alarm shift; exec @ARGV' <seconds> <command>` on macOS without it.
## Workflow
1. **Find the boards:** `python $SKILL/scripts/ports.py` (any Python with pyserial, for example the
ESPHome venv). Port names follow the USB hub port and change on every replug, so never reuse a name
from an earlier session. CH340 adapters (D1 mini, BW15 kit, BK7238, CB3S) all look the same; tell
them apart with a 10 s capture using `serial_capture.py --reset` (ESP8266 prints its ROM banner at
74880 baud, LibreTiny boards print `[LT]` and ESPHome lines, BK7238 prints its bootloader version).
`ports.py --wait 2e8a` blocks until a Pico re-enumerates.
2. **Make a scratch directory** outside the checkout, with `secrets.yaml` and the templates you need.
One yaml per board per variant, file name equal to `name:`.
3. **Compile** in the right tree:
`(cd <worktree> && PYTHONUNBUFFERED=1 timeout 1500 python -m esphome compile <abs yaml> > <name>-compile.log 2>&1)`.
Keep the RAM and flash lines at the end. Two ESP-IDF or two LibreTiny builds at the same time race
over tool caches; run them one at a time.
4. **Flash** per chip family (table below). Stop the capture on that port first.
5. **Capture** with `serial_capture.py PORT SECONDS OUT` in the background, then poll the file with
`grep` in an `until ... sleep 2` loop with a cap. USB CDC boards (Pico, nRF52, native USB ESP32)
drop the port on reboot; the script reopens it until its deadline.
6. **Drive** the test: a second board running a client config, `curl`, an aioesphomeapi script that
presses a template button and subscribes to logs, MQTT publishes, or `interval:` and `on_boot:`
automations in the config itself.
7. **Analyze** with `grep -a -c` counts over the capture and keep an `-events.txt` extract of the lines
that matter. Decode crashes with the platform's `addr2line` (see `reference/boards.md`).
8. **Report** on the PR as a table: build SHA, board and framework, what was driven, counts, result,
plus the `dev` control row and the exact flow in a `<details>` block. No credentials, no port names,
no IP addresses.
## Flashing by chip family
| Board | Flash | Log |
|---|---|---|
| ESP8266 D1 mini (CH340) | `python -m esphome upload <yaml> --device <port>` | `serial_capture.py` at 115200; `esphome logs` on some CH340s emits garbage after the RTS reset. A failed esptool write can wedge the adapter until the board is replugged. `esptool erase_flash` before a test that needs an unprovisioned device: the preference sector survives a reflash |
| ESP32 devkit (CP2102 or CH340) | `esphome upload --device <port>`, ESP-IDF or Arduino | `serial_capture.py`. Default Wi-Fi light sleep delays API driven actions by seconds; judge timing from device logs. `power_save_mode: none` for OTA overlap tests |
| ESP32-S3, C3, C6, H2 native USB | `esphome upload --device /dev/cu.usbmodem*` | `logger: hardware_uart: USB_SERIAL_JTAG`. The USB console can wedge when the app takes over the console (0 bytes, esptool `No serial data received`); replug, or watch through `esphome logs --device <name>.local` |
| Pico W / Pico 2 W | `esphome upload --device <port>` (1200 baud touch); first flash ever via BOOTSEL and `--device /Volumes/RPI-RP2` or `RP2350` | port re-enumerates after upload: `ports.py --wait 2e8a` then capture |
| BW15 kit (RTL8720CF, rtl87xx) | `~/.platformio/penv/.libretiny/bin/python $SKILL/scripts/flash_rtl87xx_kit.py flash write -d <port> <build>/.pioenvs/<name>/*.uf2`. Plain `esphome upload` and plain ltchiptool time out because opening the port asserts DTR/RTS and holds the chip in reset | `serial_capture.py --released`, never `esphome logs` |
| BK7238 / CB3S (bk72xx, RTS on CEN) | `~/.platformio/penv/.libretiny/bin/python $SKILL/scripts/flash_bk72xx.py flash write -d <port> <uf2>` (about 75 s) | logs are on UART2 by default; `logger: hardware_uart: UART1` puts them on the flashing adapter. Opening the port resets the chip, so keep one capture open for the whole test |
| LN882H | ltchiptool forces 1 Mbaud for writes; weak adapters need `LN882H_YM_BAUDRATE` patched to 115200 in the penv's `ln882htool.py`; short BOOT to GND while the tool connects | OTA after the first flash |
| nRF52840 Dongle (PCA10059) | Nordic `nrfutil nrf5sdk-tools dfu usb-serial` on the bootloader port, or `dfu: true` in the config so the 1200 baud touch pin-resets into the bootloader; adafruit-nrfutil is refused | app has two CDC ports, ESPHome log on the second |
| Adafruit-style nRF52 (UF2 bootloader) | `UF2BOOT` volume or adafruit-nrfutil; `dfu: true` works through GPREGRET | single CDC port |
| Any reachable device | `esphome upload <yaml> --device <ip or name.local>`; `--file <bin>` for a prebuilt image | `esphome logs --device <ip>` bounded with `timeout` |
ESP-IDF OTA image: `.esphome/build/<name>/build/firmware.ota.bin`. LibreTiny OTA port is 8892.
## Scripts in `$SKILL/scripts`
- `ports.py`: list ports with VID:PID, product, serial and a board guess; `--wait VID[:PID]`,
`--product NAME`, `--serial SN` (one specific board, whatever path it comes back under) and
`--serial-of PORT` (the serial number behind a path).
- `serial_capture.py PORT SECONDS OUT [--baud] [--released] [--reset] [--append]`: bounded timestamped
capture, ANSI stripped, `LOG_SECRET` text written as `<secret>`, reopens a vanished port, exits at the
deadline. OUT is truncated unless `--append` is given, so counts over it cover one run.
- `flash_rtl87xx_kit.py`: ltchiptool wrapper for the BW15 kit whose CH340 drives CEN (RTS) and the boot
strap (DTR). `flash read` needs the family `realtek-ambz2`; `flash write` does not.
- `flash_bk72xx.py`: ltchiptool wrapper for BK72xx boards whose RTS drives CEN.
- `wifisave_hammer.sh KIND DUT_PORT DUT_YAML DUT_TREE CLIENT_PORT CLIENT_YAML CLIENT_TREE [SETTLE]`:
the fallback AP plus captive portal hammer end to end (compile, flash, capture, counts) with the
templates below. KIND is `esp`, `pico`, `bw15` or `bk`. It ends with `RESULT PASS` (exit 0),
`RESULT FAIL` (exit 3: a crash, a reboot after the AP came up, or the device never joined the network),
`RESULT INVALID`
(exit 2: a precondition was missed, the stimulus was insufficient, or a capture did not last the run)
or exits 1 when a build, flash or port step failed.
## Templates in `$SKILL/templates`
- `dut-fallback-ap.yaml` (package): a device that never finds its network, falls back to its AP and
serves the captive portal. `example-dut.yaml` is the per-run file with the platform block.
- `client-wifisave.yaml` (package): joins that AP, posts N bogus `/wifisave` requests, then the real
credentials from `!secret`. `example-client.yaml` is the per-run file. `bogus_saves: "1"` gives a
plain provisioning check.
## When something looks wrong
- A capture stopped early or a line is missing: check the timestamps before trusting it.
- The client never joins the AP: another board may still run an AP with the same SSID, or the device
booted with saved credentials because the name was reused. One AP device at a time on the bench.
- Builds come out byte-identical between branches: the wrong tree was imported (rule 3).
- Multicast from the host never arrives on some access points: test it device to device. Broadcast
is lossy under Wi-Fi power save, unicast is not. Throttle UDP floods to a fixed packet rate.
- `api:` reboots a board after 15 min without a client: `reboot_timeout: 0s` on `api:` and `mqtt:` for
soak tests.
`reference/boards.md` has per-chip facts and crash decoding; `reference/recipes.md` has the proven
flows. Add new findings there.
@@ -1,138 +0,0 @@
# Board facts
Ports are not listed on purpose: they follow the USB hub port and change on every replug. Run
`scripts/ports.py`.
## ESP8266 (D1 mini, NodeMCU, CH340 or CP2102)
- Opening the port usually resets the board through DTR, but not always; `serial_capture.py --reset`
pulses RTS to capture from boot. 74880 baud shows the ROM boot messages (`rst cause`, `boot mode`).
- `esphome logs` on some CH340s emits thousands of duplicated garbage lines right after the RTS reset;
a plain pyserial capture at 115200 is reliable.
- A failed esptool write can wedge the adapter (`termios` error 22, or an open that hangs) until replug.
- The preference sector survives a reflash: a provisioned API key or saved Wi-Fi credentials stay
active. `esptool erase_flash` gives a clean device.
- `Panic core_esp8266_main.cpp:191 __yield` with `ctx: sys` means a yield from lwIP context (a web
handler, an lwIP callback). Decode stacks with
`xtensa-lx106-elf-addr2line -e <build>/.pioenvs/<name>/firmware.elf -f -C -i <addr...>` from the
toolchain under `~/.platformio/packages/toolchain-xtensa/bin/` (PlatformIO builds) or the ESPHome
cache directory (native toolchain builds).
- Constant data lives in RAM unless marked `PROGMEM`; with 80 KB of RAM a few hundred bytes are worth a
row in the PR.
- AsyncMqttClient drops inbound topics over 128 characters; topics of 255 or more wrap a counter and
stall the link until the broker drops TCP.
## ESP32 classic devkit
- Takes ESP-IDF and Arduino. Default Wi-Fi light sleep delays API driven actions by up to 6 s; judge
timings from device logs, not from the host. `power_save_mode: none` for OTA overlap tests (an IDF web
upload of 739 KB took 107 s with power save and 45 s without).
- Receives only a few percent of IPv6 multicast on some access points with power save on; a raw lwIP
socket loses the same, so that is the AP or driver, not a PR.
- Decode with `xtensa-esp32-elf-addr2line` from the IDF tools directory against
`<build>/.pioenvs/<name>/firmware.elf` (PlatformIO) or `<build>/build/<name>.elf` (IDF native).
- Clean reboot between runs with the capture stopped: `esptool --after hard_reset chip_id`.
- Trigger a forced crash only after the app is marked valid (45 s after boot is plenty), never on an
image still pending OTA rollback.
- Signed OTA testing: build with `esp32.framework.advanced.signed_ota_verification.verification_keys`
under a different name, sign with `python -m espsecure sign_data --version 2 --keyfile
tests/components/esp32/dummy_signing_key.pem`, upload with `esphome upload --file`. The verifier
refuses unsigned images afterwards, so restore with a signed plain build.
## ESP32-S3, C3, C6, H2 with native USB
- `/dev/cu.usbmodem*`, esptool works, `logger: hardware_uart: USB_SERIAL_JTAG`.
- The USB console can die at the moment the app takes over the console during a reboot (log stops after
`Disabling RNG early entropy source`, then 0 bytes, esptool reports `No serial data received`). Only a
USB replug fixes it. Fallback: `esphome logs --device <name>.local` (API log stream, which drops lines
while Wi-Fi is off).
- The ESP32-P4 before silicon revision 3 is bricked by rev3-only firmware (boot loop at bootloader entry).
## RP2040 / RP2350 (Pico W, Pico 2 W)
- The CDC port re-enumerates after every reboot and after `esphome upload` (1200 baud touch). Re-detect
with `ports.py --wait 2e8a` before capturing; `serial_capture.py` reopens on its own if the port
vanishes mid-capture.
- First flash ever: BOOTSEL, then `esphome upload --device /Volumes/RPI-RP2` (or `RP2350`).
- arduino-pico creates the lwIP netif in `WiFi.begin()`, so any IGMP join during component setup fails;
joins must wait for `network::is_connected()`.
- Parallel Pico builds race on package extraction after a PlatformIO package wipe; one at a time.
- An RTS pulse from pyserial does not reset the board; reboot with `App.safe_reboot()` or the touch.
## BW15 kit (RTL8720CF, LibreTiny rtl87xx)
- The kit's CH340 wires RTS to CEN and DTR to PA00 (boot strap). A plain pyserial open asserts both and
holds the chip in reset, which is why `esphome upload`, plain `ltchiptool` and `esphome logs` all fail
("Timeout while linking", or silence). `scripts/flash_rtl87xx_kit.py` sets DTR high and RTS released
on every open, pulses RTS once so the ROM answers `ping`, and after the command drops DTR and pulses
RTS to boot the app. Run it with the PlatformIO LibreTiny penv Python.
- `flash write -d <port> <uf2>` takes no family argument; `flash read -d <port> -s 0 -l <len>
realtek-ambz2 <out>` does.
- Capture with `serial_capture.py --released`. The ESPHome log is on the flashing UART already.
- The macOS CH340 driver only pushes DTR/RTS to the wire once a session has driven them, so the first
plain open after a replug streams logs and the second is silent; always open with the lines released.
- Driver quirks seen on `dev`: `WiFi.begin` can refuse the real network on the first try after bogus
credentials (it connects after two cooldowns); right after connecting while the AP is still up the
driver can bus-fault in `rtw_is_adapter_up` (`R0 = 0xdeadbeef`) and reboot; the AP restarts on every
STA retry, so stations cannot stay joined; `WiFi.begin` fails synchronously for an absent network and
lands in a cooldown at once; connecting blocks the loop 2.5 to 4.1 s.
- Decode faults with `arm-none-eabi-addr2line -e <build>/.pioenvs/<name>/raw_firmware.elf -f -C -i <PC>`
from `~/.platformio/packages/toolchain-gccarmnoneeabi/bin/` (`raw_firmware.elf`, not `firmware.elf`).
Fault dumps print PC, LR and R0 to R3.
- The AmebaZ2 SDK sets `LWIP_TCPIP_CORE_LOCKING 0`.
## BK7238, WB3S, CB3S (BK7231N) (LibreTiny bk72xx, CH340, RTS on CEN)
- Stock ltchiptool closes and reopens the port after its reset, and pyserial raises both lines on open,
holding CEN low through the BootROM window. `scripts/flash_bk72xx.py` opens with both released and
pulses the reset right before the link checks. A write takes about 75 s. Only a CEN or power reset
reaches the downloader; no software reboot does.
- ESPHome logs on UART2 by default; `logger: hardware_uart: UART1` puts them on the flashing adapter.
- Opening the port resets the chip (bootloader banner on every open, even with DTR/RTS low), so keep one
capture open for the whole test and never reopen mid-phase.
- Callbacks run on the `async_tcp` task and log lines can lose a byte. Wi-Fi connect takes tens of ms;
radio enable 160 to 278 ms, disable about 200 ms.
## BW16 kit (RTL8720DN, AmebaD)
- The kit's own USB-C (CH340) is on LOG_UART and flashes fine. Its two-transistor circuit resets while
RTS alone is asserted and straps BURN while DTR alone is; both asserted does nothing. ROM entry is
esptool's classic sequence (`dtr:false,rts:true` 100 ms, `dtr:true,rts:false` 400 ms, both false); the
first pulse after a replug can be lost, retry up to three times.
- Any reopen resets the chip, 460800 is flaky, 115200 is solid: one open per session, in-place baud
changes only. The ROM and the loader NAK continuously while idle, so ACK scans must drain first.
- The AmebaD core has no mDNS responder (`mdns: disabled: true`).
## LN882H
- ltchiptool forces 1 Mbaud for writes; adapters that cannot hold it fail with "Timeout while linking"
or die mid-write. Patch `LN882H_YM_BAUDRATE` in the penv's `ltchiptool/soc/ln882h/util/ln882htool.py`
to 115200 (lost on reprovision). Weak 3.3 V from the adapter: feed the module's 5 V pad instead. Short
BOOT to GND while the tool connects. OTA afterwards.
- `USE_WIFI_AP_EXCLUSIVE` (one radio mode at a time) exists only on LN882x; compile-check changes there.
## nRF52840
- Nordic PCA10059 dongle: the factory Open DFU bootloader enumerates as `1915:521F` on its own port
name; the app as `2FE3:0100` with two CDC ports, ESPHome log on the second. Only Nordic
`nrfutil nrf5sdk-tools` works (`pkg generate --hw-version 52 --sd-req 0x00 --application-version 1
--application zephyr.hex app.zip`, then `dfu usb-serial -pkg app.zip -p <port>`); ESPHome downloads
it on the first build. GPREGRET does not enter the bootloader; a pin reset through P0.19 does, which
`dfu: true` wires up on this board. A pulsing red LED means bootloader; the side RESET button
re-enters it.
- Makerdiary MDK USB dongle: UF2 bootloader without SoftDevice, app at 0x1000, `UF2BOOT` volume,
adafruit-nrfutil, GPREGRET 0x57 works. RGB LED active low (red P0.23, green P0.22, blue P0.24),
button P0.18.
## ESP Thread Border Router board v1.2 (S3 host + H2 RCP)
- S3 host on USB JTAG serial, H2 RCP on its own USB. Spinel UART1 from the host: `rx_pin: GPIO17`,
`tx_pin: GPIO18`, RCP reset `GPIO7` active low, 460800. The config needs `network: enable_ipv6: true`.
- The shipped H2 firmware fails `CheckRadioCapabilities` with IDF 5.5; build `examples/openthread/ot_rcp`
for esp32h2 with ESPHome's own IDF (`IDF_PATH` at the cached framework, its penv and tools,
`IDF_PYTHON_CHECK_CONSTRAINTS=no`) and flash with esptool at 0x0, 0x8000 and 0x10000.
- A crash-looping S3 pulses the H2 reset every boot, so the H2 cannot be flashed and the S3 will not
enter its bootloader over USB. Hold S3 BOOT, tap S3 RST, flash the H2, release, then replug both.
- `dns-sd -L <name> _meshcop._udp local.` shows the `omr` prefix; it disappears when routing is dead.
Keep one capture per chip; never reset the H2 over USB mid-test unless that is the test (the host
logs `Unexpected RCP reset: RESET_OTHER` and recovers).
@@ -1,117 +0,0 @@
# Proven test flows
Each flow names the pull requests it was used on, so their result tables show what to post.
## Captive portal `/wifisave` hammer (#20802, #20784)
Reproduces a `/wifisave` arriving during the STA cooldown, and proves a fix on every board.
Device under test: `templates/example-dut.yaml` (bogus network, `ap:` with `ap_timeout: 15s`,
`captive_portal:`). Client: `templates/example-client.yaml` on an ESP32 or a D1 mini; it joins the
device's AP, posts 15 bogus saves 3 s apart, then the real credentials. With the portal up the cooldown
is 30 s, so nearly every save lands inside one. Driver: `scripts/wifisave_hammer.sh`. Settle 40 s on
ESP boards, 90 s on the BW15 (its first attempt on the real network fails, see boards.md).
Counts that matter: `Requested WiFi Settings Change` (saves received), `Exiting cooldown early`, crash
markers, boots (`Log initialized`), and the client's `bogus save status 200` and `real save status 200`.
A healthy run: every save answered 200, one cooldown exit per save (two on the BW15, whose retry enters
the adapter restart), no panic, and the real credentials connect the device within about 10 s.
Fault injection for AP start failures: wrap `this->ap_setup_ = this->wifi_start_ap_(this->ap_)` in
`setup_ap_config_()` with an `HWTEST_AP_FAIL_COUNT` build flag
(`esphome: platformio_options: build_flags: -DHWTEST_AP_FAIL_COUNT=2`), raise the portal's "Captive
portal started" from LOGV to LOGI, and after provisioning curl the device's STA address: connection
refused proves the portal's server is gone.
## `reboot_timeout` with a fallback AP (#9958)
Only one board runs the AP at a time, or stations join the wrong one. AP probe: bogus network,
`ap: {ssid, password, ap_timeout: 5s}`, `reboot_timeout: 60s`, `logger: level: VERBOSE` (ESP32 and
ESP8266 log `AP client connected MAC=` at verbose), `on_boot: logger.log: BOOT`. Station probes:
`reboot_timeout: 0s`, `interval: 150s` running `wifi.disable`, `delay: 20s`, `wifi.enable` (60 s cycles
are too short to cover the due moment). Pass pattern: "Can't connect; rebooting" exactly 60 s after boot
with no station joined, no reboot for minutes while one is, then a reboot within a second of the last
disconnect. The BW15 restarts its AP on every STA retry and cannot be tested this way.
## MQTT (#20433, #17935, #20762, #20767, #20768)
A local mosquitto with `allow_anonymous true`, `log_type all` and `log_dest file`: the broker log gives
each subscription's QoS, the device address (`New client connected from <ip> as <name>-<mac>`) and exact
subscribe counts. Kill and restart mosquitto to exercise `on_disconnect` (reason 0) and resubscription.
Keep `reboot_timeout: 0s` on `api:` and `mqtt:`. The ESP-IDF outbox swings free heap about 2 kB right
after bulk subscribe and unsubscribe; read the heap seconds later over several rounds before calling a
leak. Spawned subscriptions need about 2.5 s to reach the broker before the next publish.
`esphome logs --device MQTT` only uses the MQTT transport when the config has no `api:`. Driver pattern: a
paho script publishes and polls the serial capture file.
## UDP, multicast, sockets (#20556 to #20559, #20585, #20590)
A listener on port 9 needs no privileges on macOS. Test multicast device to device; host to device
multicast never arrives on some access points, and `239.255.x.x` groups are unreliable even to a stock
listener. Broadcast to boards is lossy under power save, unicast is not. Flood at a fixed packet rate
(the host hits `ENOBUFS` unthrottled); 1500 packets per second survived on every board. A forced Wi-Fi
reconnect on the Pico keeps IGMP membership. Set a long loop interval from `wifi.on_connect`
(`App.set_loop_interval(20000)`), not `on_boot`, or Wi-Fi connect crawls. The `logger.log` action
rejects `%.*s`; use a lambda.
## OTA overlap and lock (#20588), OTA timeouts (#19041), deflate (#19037)
All overlap orders (a web upload during a native OTA and the reverse) must be refused; the lock release
after an interrupted web upload waits about 14 s (ESP8266) or 7 s (ESP-IDF) for disconnect detection. A
refused web client on `web_server_idf` never gets the busy reply; the connection drops at reboot.
`pkill -f "a\|b"` does not alternate; use two pkills.
## DHCP lease cache (#17767)
Cycle 20 s awake, `deep_sleep.enter 30s`, wake, 20 s, `App.safe_reboot()`, logging `millis()` at the
`wifi.connected` condition. An RTS hardware reset must fall back to DHCP; a software reboot and a deep
sleep wake must apply the cache. `esphome run --no-logs` silently skipped the upload on one board; use
`upload` then `logs`.
## HDMI-CEC two-board wire (#9189)
Two boards on one wire: promiscuous mode, a 0x8F request answered with 0x90 0x00, a `destination:`
filter on the reply handler, template buttons for each target plus lambdas calling
`send(source, dest, span)` as another initiator. Healthy numbers: device-side turnaround 15 to 22 ms,
round trip 144 to 156 ms. Press buttons over the API; judge timings from device logs (ESP32 light sleep
lags the press).
## LD2450 polygon zones (#20154)
To make a target "leave" without anyone moving, set the radar's Zone-1 numbers over the target and
switch the zone type to `Filter` (the count drops to 0 within 0.5 s); set it back to `Disabled` after.
Writing those numbers blocks the ld2450 loop about 50 ms.
## Scheduler and loop wake A/B (#20356)
An external component whose template button arms an SDK `os_timer` (50 ms, one shot) on the ESP8266;
the callback runs in SYS context, records `millis()` and calls `set_timeout` or `defer`; the timeout
logs the elapsed time and loop count delta. Drive with an aioesphomeapi script (`subscribe_logs` plus
`button_command`). Build the same yaml twice with different names, one per tree.
## Noise handshake and OTA encryption on the ESP8266 (#19062, #19233)
Host side timing is useless on a weak link; use an on-device bench with the minimum of five runs over
two boots. Provision a key with `noise_encryption_set_key` through aioesphomeapi and upload with
`espota2.run_ota(host, 8266, None, bin, noise_psk=key)` when the key is not in the yaml.
## ESP-NOW on the ESP8266 (#14407)
The NONOS SDK only delivers broadcast ESP-NOW frames while the station is associated or a soft-AP is
up; a hidden, open, client-less soft-AP (60 s beacon, DHCP stopped) makes broadcasts arrive. In AP-only
mode the device transmits from the soft-AP MAC.
## Wi-Fi Easy Connect (DPP) enrollee (#17934)
Only an Android phone configures: Settings, network details, Add device, Share Wi-Fi (the Wi-Fi list's
QR scanner makes the phone an enrollee). Render the URI with the `qrcode` module and open the PNG.
`esp32: framework: log_level: DEBUG` plus `sdkconfig_options: CONFIG_WPA_DEBUG_PRINT: y` prints the
supplicant state machine.
## Thread border router (#18104)
See boards.md for the ESP Thread BR board. Check that the H2 answers Spinel before blaming a PR.
## nRF52840 dongle boards (#19009, #20814)
Test config: the two LEDs as inverted GPIO outputs, the button as an inverted pull-up binary sensor, a
10 s alive interval. To retest the nrfutil download path, move the cached `sdk-nrf/nrfutil` aside first.
@@ -1,51 +0,0 @@
"""ltchiptool for boards whose RTS drives CEN: reset and link on one open port.
Stock ltchiptool closes and reopens the port after its DTR/RTS reset, and
pyserial raises both lines on open, holding CEN low through the BootROM's
listen window. Open with both lines released and pulse the reset right
before the LinkChecks instead.
"""
import sys
import bk7231tools.serial.main as bk_main
from ltchiptool.__main__ import cli
from ltchiptool.soc.bk72xx.flash import BK72XXFlash
from serial import Serial
class ReleasedSerial(Serial):
def __init__(self, port=None, **kwargs):
super().__init__(None, **kwargs)
self.dtr = False
self.rts = False
self.port = port
self.open()
bk_main.Serial = ReleasedSerial
_connect = BK72XXFlash.flash_connect
def flash_hw_reset(self) -> None:
self._reset_pending = True
def flash_connect(self) -> None:
pending = getattr(self, "_reset_pending", False)
if self.bk and self.conn.linked and not pending:
return
self.flash_build_protocol()
if pending:
self._reset_pending = False
self.bk.hw_reset()
self.conn.linked = False # the chip rebooted, so link again below
_connect(self)
BK72XXFlash.flash_hw_reset = flash_hw_reset
BK72XXFlash.flash_connect = flash_connect
sys.argv = ["ltchiptool", *sys.argv[1:]]
cli()
@@ -1,87 +0,0 @@
"""ltchiptool for the BW15 kit whose CH340 drives CEN (RTS) and PA00 (DTR).
A plain open asserts both lines and holds the chip in reset. Here every open keeps DTR high and RTS
released; the first open pulses RTS so the ROM comes up; after the command DTR low plus an RTS pulse
boots the app. The exit status is ltchiptool's; 2 means the flash succeeded but the app was not
booted (boot pulse failed, or no -d PORT to send it to), so the board sits in the ROM until reset.
Usage: python flash_rtl87xx_kit.py flash write -d <port> firmware.uf2
"""
import sys
import time
import serial
_first = [True]
_orig_open = serial.Serial.open
def _open(self):
self.dtr = True # PA00 high: ROM download mode on the next reset
self.rts = False # CEN released
_orig_open(self)
if _first[0]:
_first[0] = False
self.rts = True
time.sleep(0.1)
self.rts = False
time.sleep(0.3) # reset into the ROM
self.reset_input_buffer()
serial.Serial.open = _open
from ltchiptool.__main__ import cli_entrypoint # noqa: E402
def port_argument(argv: list[str]) -> str | None:
for i, a in enumerate(argv):
if a in ("-d", "--device") and i + 1 < len(argv):
return argv[i + 1]
if a.startswith(("-d=", "--device=")):
return a.split("=", 1)[1]
if a.startswith("-d") and len(a) > 2:
return a[2:]
return None
def boot_app(port: str) -> None:
s = serial.Serial(port=None)
s.port = port
s.dtr = False
s.rts = False
_orig_open(s)
s.rts = True
time.sleep(0.1)
s.rts = False
s.close()
def main() -> int:
rc = 1
try:
result = cli_entrypoint.main(args=sys.argv[1:], standalone_mode=False)
rc = int(result) if isinstance(result, int) else 0
finally:
port = port_argument(sys.argv)
if not port:
print(
"[flash_rtl87xx_kit] no -d PORT given, the application was not booted",
file=sys.stderr,
)
if rc == 0:
rc = 2
else:
try:
boot_app(port)
print("[flash_rtl87xx_kit] application booted")
except (serial.SerialException, OSError) as err:
print(f"[flash_rtl87xx_kit] boot pulse failed: {err}", file=sys.stderr)
if rc == 0:
rc = 2 # flashed, but the board is still in the ROM: press reset
return rc
if __name__ == "__main__":
sys.exit(main())
@@ -1,123 +0,0 @@
"""List the boards on USB, or wait for one to enumerate.
ports.py table: port, vid:pid, product, serial number, guess
ports.py --wait 2e8a print the first port with VID 0x2e8a once it appears (default 60 s)
ports.py --wait 1a86:7523 --timeout 30
ports.py --product "USB Serial" first port whose USB product string matches (case-insensitive)
ports.py --wait 2e8a --serial SN the port of one specific board, whatever name it comes back under
ports.py --serial-of PORT print the USB serial number behind a port name
Run with a Python that has pyserial (any ESPHome venv). Port names follow the hub port on macOS, so
re-run this after every replug instead of trusting a name from an earlier session.
"""
import argparse
import sys
import time
from serial.tools import list_ports
GUESS = [
(
(0x1A86, 0x7523),
"CH340: D1 mini, BW15 kit, BK7238/CB3S or LN882H adapter; identify by the boot banner",
),
((0x1A86, 0x55D3), "CH343: ESP32-P4 devkit console"),
((0x1A86, 0x55D4), "CH343: ESP32 devkit"),
((0x1A86, None), "WCH CH34x USB serial bridge"),
((0x10C4, 0xEA60), "CP2102: classic ESP32 devkit (esp32dev)"),
(
(0x303A, 0x1001),
"Espressif USB JTAG serial: S3/C3/C6/H2 native USB (logger hardware_uart USB_SERIAL_JTAG)",
),
(
(0x2E8A, None),
"Raspberry Pi Pico W / Pico 2 W CDC; the port vanishes and comes back on every reboot",
),
((0x1915, 0x521F), "nRF52840 Dongle (PCA10059) in the Open DFU bootloader"),
(
(0x2FE3, 0x0100),
"nRF52840 Dongle running a Zephyr app; two CDC ports, ESPHome log on the second",
),
((0x1915, 0xCAFE), "Makerdiary nRF52840 MDK dongle running a Zephyr app"),
((0x239A, None), "Adafruit style nRF52 board (UF2 bootloader family)"),
]
def guess(vid: int, pid: int) -> str:
for (gv, gp), text in GUESS:
if vid == gv and (gp is None or pid == gp):
return text
return ""
def parse_id(text: str) -> tuple[int, int | None]:
vid, _, pid = text.partition(":")
return int(vid, 16), (int(pid, 16) if pid else None)
def matches(
port, vid: int | None, pid: int | None, product: str | None, serial: str | None
) -> bool:
if vid is not None and (port.vid != vid or (pid is not None and port.pid != pid)):
return False
if product and (port.product or "").lower() != product.lower():
return False
return not serial or (port.serial_number or "") == serial
def main() -> int:
ap = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
ap.add_argument(
"--wait",
metavar="VID[:PID]",
help="block until a matching port appears, print it",
)
ap.add_argument("--product", help="USB product string to match")
ap.add_argument("--serial", help="USB serial number to match")
ap.add_argument(
"--serial-of", metavar="PORT", help="print the USB serial number of PORT"
)
ap.add_argument("--timeout", type=float, default=60)
args = ap.parse_args()
if args.serial_of:
for p in list_ports.comports():
if p.device == args.serial_of and p.serial_number:
print(p.serial_number)
return 0
print(f"no USB serial number for {args.serial_of}", file=sys.stderr)
return 1
vid = pid = None
if args.wait:
vid, pid = parse_id(args.wait)
if args.wait or args.product or args.serial:
deadline = time.time() + args.timeout
while True:
for p in sorted(list_ports.comports(), key=lambda p: p.device):
if p.vid and matches(p, vid, pid, args.product, args.serial):
print(p.device)
return 0
if time.time() >= deadline:
print("no matching port", file=sys.stderr)
return 1
time.sleep(1)
rows = [p for p in list_ports.comports() if p.vid]
if not rows:
print("no USB serial ports")
return 1
for p in sorted(rows, key=lambda p: p.device):
print(
f"{p.device:32} {p.vid:04x}:{p.pid:04x} {p.product or '?':34} "
f"{p.serial_number or '':18} {guess(p.vid, p.pid)}"
)
return 0
if __name__ == "__main__":
sys.exit(main())
@@ -1,157 +0,0 @@
"""Bounded, timestamped serial capture that always exits and closes the port.
serial_capture.py PORT SECONDS OUTFILE [--baud 115200] [--released] [--reset] [--append]
default open with DTR/RTS as pyserial leaves them (asserted); fine for ESP devkits and the Pico.
--released drive DTR and RTS low before opening: the BW15 and BK7238 CH340 kits strap the boot pin
(DTR) and reset (RTS), so a plain open holds the chip in reset.
--reset pulse reset after opening (DTR low, RTS high 100 ms, RTS low) to capture a fresh boot.
--baud 115200 by default; 74880 shows the ESP8266 ROM boot messages.
--append keep what OUTFILE already holds; by default it is truncated so counts cover this run only.
Exit status 1 when nothing was received (wrong port name, or a port another capture still holds).
Text ESPHome marks as secret (LOG_SECRET, the Wi-Fi password) is written as <secret>.
Lines are written as [HH:MM:SS]text with ANSI colour stripped and flushed one by one, so a shell
loop can grep the file while the capture runs. If the port is missing or disappears (USB CDC boards
re-enumerate on reboot) the script retries until the deadline, and follows the board by its USB serial
number when it comes back under another device path.
Never run an open-ended serial session: every capture has a deadline, and a flash on the same port
needs the capture stopped first (pkill -f "[s]erial_capture.py" does not match the killing shell).
"""
import argparse
import contextlib
import pathlib
import re
import sys
import time
import serial
from serial.tools import list_ports
ANSI = re.compile(rb"\x1b\[[0-9;]*[A-Za-z]")
# ESPHome's LOG_SECRET span (a Wi-Fi password); a span cut off before its end marker is secret to the end
SECRET = re.compile(rb"\x1b\[8m.*?(?:\x1b\[28m|$)", re.DOTALL)
PORT_ERRORS = (serial.SerialException, OSError)
def identify(port: str) -> tuple[str | None, int]:
"""USB serial number of the port and its position among that device's ports (a dongle has two)."""
ports = sorted(list_ports.comports(), key=lambda p: p.device)
serial_number = next((p.serial_number for p in ports if p.device == port), None)
siblings = [
p.device for p in ports if serial_number and p.serial_number == serial_number
]
return serial_number, siblings.index(port) if port in siblings else 0
def current_path(port: str, serial_number: str | None, index: int) -> str:
"""The port's current device path: a USB CDC board can come back under a new name after a reboot."""
if serial_number:
ports = sorted(list_ports.comports(), key=lambda p: p.device)
siblings = [p.device for p in ports if p.serial_number == serial_number]
if index < len(siblings):
return siblings[index]
return port
def open_port(args: argparse.Namespace, path: str) -> serial.Serial:
s = serial.Serial(port=None, baudrate=args.baud, timeout=0.2)
s.port = path
if args.released:
s.dtr = False
s.rts = False
s.open()
if args.reset:
try:
s.dtr = False
s.rts = True
time.sleep(0.1)
s.rts = False
s.reset_input_buffer()
except PORT_ERRORS:
s.close()
raise
return s
def write_line(out, tag: bytes, data: bytes) -> None:
stamp = time.strftime("[%H:%M:%S]").encode()
out.write(stamp + tag + ANSI.sub(b"", SECRET.sub(b"<secret>", data)) + b"\n")
out.flush()
def note(out, text: str) -> None:
write_line(out, b"[capture] ", text.encode())
def capture(args: argparse.Namespace, out) -> int:
"""Returns the number of bytes received."""
deadline = time.time() + args.seconds
buf = b""
s = None
received = 0
serial_number, index = None, 0
while time.time() < deadline:
if s is None:
path = current_path(args.port, serial_number, index)
try:
s = open_port(args, path)
args.reset = False # only reset on the first open
if serial_number is None:
serial_number, index = identify(path)
if path != args.port:
note(out, f"reopened as {path}")
except PORT_ERRORS as err:
note(out, f"open failed: {err}")
time.sleep(1)
continue
try:
data = s.read(4096)
except PORT_ERRORS as err:
if buf: # keep the cut-off line apart from the next boot's first line
write_line(out, b"[partial]", buf)
buf = b""
note(out, f"port lost: {err}")
with contextlib.suppress(*PORT_ERRORS):
s.close()
s = None
time.sleep(1)
continue
if not data:
continue
received += len(data)
buf += data
while b"\n" in buf:
line, buf = buf.split(b"\n", 1)
write_line(out, b"", line.rstrip(b"\r"))
if buf:
write_line(out, b"[partial]", buf)
if s is not None:
s.close()
return received
def main() -> int:
ap = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
ap.add_argument("port")
ap.add_argument("seconds", type=float)
ap.add_argument("outfile")
ap.add_argument("--baud", type=int, default=115200)
ap.add_argument("--released", action="store_true")
ap.add_argument("--reset", action="store_true")
ap.add_argument("--append", action="store_true")
args = ap.parse_args()
with pathlib.Path(args.outfile).open("ab" if args.append else "wb") as out:
received = capture(args, out)
if received == 0:
print(f"[capture] nothing received from {args.port}", file=sys.stderr)
return 1
return 0
if __name__ == "__main__":
sys.exit(main())
@@ -1,133 +0,0 @@
#!/bin/bash
# wifisave_hammer.sh: the device under test (DUT) falls back to its AP; a client board joins it and posts
# /wifisave repeatedly, then the real credentials. Compiles, flashes, captures both serial logs and
# prints counts. Configs come from templates/example-dut.yaml and templates/example-client.yaml.
#
# Usage: wifisave_hammer.sh DUT_KIND DUT_PORT DUT_YAML DUT_TREE CLIENT_PORT CLIENT_YAML CLIENT_TREE [SETTLE_S]
# DUT_KIND esp (esphome upload), pico (upload, then re-find the CDC port by USB serial number),
# bw15 (flash_rtl87xx_kit.py) or bk (flash_bk72xx.py)
# *_YAML absolute path; the file name without .yaml must equal the config's `name`
# *_TREE checkout or worktree whose esphome code must build that yaml (cwd for python -m esphome)
# SETTLE_S seconds to keep capturing after the client reports the real save (default 40; BW15 wants 90)
# Env: PY (python with esphome; default DUT_TREE/venv/bin/python, else python3 on PATH; an explicit PY must exist), LTPY
# (LibreTiny penv python with ltchiptool; default ~/.platformio/penv/.libretiny/bin/python)
# Output next to each yaml: NAME-compile.log, NAME-upload.log, NAME-serial.log, NAME-capture.err, and DUT NAME-events.txt
# (addresses redacted so the extract can go on a PR; the serial logs themselves stay local).
# Exit status: 0 RESULT PASS (no crash marker or reboot after the AP came up, the device joined the network,
# and real stimulus: saves answered and a cooldown exit); 3 RESULT FAIL (the counts show
# a failure); 2 RESULT INVALID (a precondition or the stimulus was missed, or a capture did not last the run);
# 1 when a build, flash or port step fails (nothing is reported).
set -u
SKILL=$(cd "$(dirname "$0")/.." && pwd)
KIND=$1; DPORT=$2; DYAML=$3; DTREE=$4; CPORT=$5; CYAML=$6; CTREE=$7; SETTLE=${8:-40}
if [ -n "${PY:-}" ]; then [ -x "$PY" ] || { echo "[hammer] FAILED: PY=$PY is not executable"; exit 1; }
else PY=$DTREE/venv/bin/python; [ -x "$PY" ] || PY=$(command -v python3) || { echo "[hammer] FAILED: no python found, set PY"; exit 1; }; fi
LTPY=${LTPY:-$HOME/.platformio/penv/.libretiny/bin/python}
DDIR=$(dirname "$DYAML"); DNAME=$(basename "$DYAML" .yaml)
CDIR=$(dirname "$CYAML"); CNAME=$(basename "$CYAML" .yaml)
DLOG=$DDIR/$DNAME-serial.log; CLOG=$CDIR/$CNAME-serial.log
INVALID=""
AP_WAIT=120; UPLOAD_WAIT=300; SAVE_WAIT=240
# Crash signatures (extended regex), not bare words: "aborting connection attempt" is a normal Wi-Fi retry line
CRASH_RE='Panic |abort\(\)|Fatal exception|Exception \(|Guru Meditation|HardFault|Bus Fault|Backtrace:|Soft WDT reset|wdt reset|Brownout|rst cause:[24]'
# Boot banners and port losses are counted apart: a Pico reboot shows as a port loss (and maybe a banner too),
# while on a UART board a port loss comes from the adapter or the hub, not the chip
BANNER_RE='Log initialized'; LOSS_RE='\[capture\] port lost'
DUT_CAPTURE=$((AP_WAIT + UPLOAD_WAIT + SAVE_WAIT + SETTLE + 60)); CLIENT_CAPTURE=$((SAVE_WAIT + SETTLE + 60))
bound() { local t=$1; shift; if command -v timeout >/dev/null; then timeout "$t" "$@"; else perl -e 'alarm shift; exec @ARGV' "$t" "$@"; fi; }
count() { LC_ALL=C grep -a -c "$1" "$2"; }
wait_for() { # wait_for FILE PATTERN SECONDS -> prints elapsed, status 1 on timeout
local n=0; until LC_ALL=C grep -a -q "$2" "$1"; do sleep 2; n=$((n+2)); [ $n -ge "$3" ] && { echo "$n"; return 1; }; done; echo "$n"; }
# Only this run's captures: another capture on the host (a soak on a third board) must survive
stop_tails() { pkill -f "[s]erial_capture.py $DPORT " 2>/dev/null; pkill -f "[s]erial_capture.py $CPORT " 2>/dev/null; sleep 1; }
fail() { echo "[hammer] FAILED: $1"; stop_tails; exit 1; }
port_never_opened() { # an open failure and no line that is not a capture note: the port, not the firmware
LC_ALL=C grep -a -q '\[capture\] open failed' "$1" && ! LC_ALL=C grep -a -q -v '^\[[0-9:]*\]\[capture\]' "$1"; }
compile() { # compile YAML TREE
(cd "$2" && PYTHONUNBUFFERED=1 bound 1500 "$PY" -m esphome compile "$1" > "${1%.yaml}-compile.log" 2>&1); local rc=$?
echo "[hammer] compile $(basename "$1"): rc=$rc"; return $rc; }
esp_upload() { # esp_upload YAML PORT TREE
(cd "$3" && bound $UPLOAD_WAIT "$PY" -m esphome upload "$1" --device "$2" > "${1%.yaml}-upload.log" 2>&1)
local ok; ok=$(count 'Successfully uploaded' "${1%.yaml}-upload.log"); echo "[hammer] upload $(basename "$1"): ok=$ok"; [ "$ok" -ge 1 ]; }
stop_tails
compile "$DYAML" "$DTREE" || fail "DUT build failed, see $DDIR/$DNAME-compile.log"
compile "$CYAML" "$CTREE" || fail "client build failed, see $CDIR/$CNAME-compile.log"
TAILOPT=""
case $KIND in
esp) esp_upload "$DYAML" "$DPORT" "$DTREE" || fail "DUT upload failed" ;;
pico)
SN=$("$PY" "$SKILL/scripts/ports.py" --serial-of "$DPORT") || fail "no USB serial number for $DPORT"
esp_upload "$DYAML" "$DPORT" "$DTREE" || fail "DUT upload failed"
# The Pico drops its CDC port on reboot and may already be back: take whatever path this board has now;
# the capture follows the serial number if the path changes again
DPORT=$("$PY" "$SKILL/scripts/ports.py" --wait 2e8a --serial "$SN" --timeout 60) || fail "pico did not re-enumerate"
echo "[hammer] pico port after upload: $DPORT"; sleep 2 ;;
bw15|bk)
UF2=$(ls "$DDIR/.esphome/build/$DNAME/.pioenvs/$DNAME/"*.uf2 2>/dev/null | head -1)
[ -n "$UF2" ] || fail "no uf2 under $DDIR/.esphome/build/$DNAME"
echo "[hammer] uf2: ${UF2##*/}"
W=$SKILL/scripts/flash_rtl87xx_kit.py; [ "$KIND" = bk ] && W=$SKILL/scripts/flash_bk72xx.py
(cd "$DDIR" && bound 400 "$LTPY" "$W" flash write -d "$DPORT" "$UF2" > "$DDIR/$DNAME-upload.log" 2>&1); rc=$?
echo "[hammer] $KIND flash: rc=$rc"; [ $rc -eq 0 ] || fail "DUT flash failed, see $DDIR/$DNAME-upload.log"
TAILOPT="--released" ;;
*) echo "unknown DUT_KIND $KIND"; exit 1 ;;
esac
: > "$DLOG"; ("$PY" "$SKILL/scripts/serial_capture.py" "$DPORT" $DUT_CAPTURE "$DLOG" $TAILOPT 2> "${DLOG%-serial.log}-capture.err" &)
if ! n=$(wait_for "$DLOG" "Captive portal\|Starting fallback AP" $AP_WAIT); then
[ -s "$DLOG" ] || fail "the DUT capture produced nothing (the capture itself failed), see ${DLOG%-serial.log}-capture.err"
port_never_opened "$DLOG" && fail "could not open $DPORT (held by another process, or the wrong port), see $DLOG"
fail "DUT never raised its AP within ${n}s, see $DLOG"
fi
echo "[hammer] DUT fallback AP after ${n}s"; sleep 2
# reboots are counted from here; the first banner may predate the capture
BANNER_BASE=$(count "$BANNER_RE" "$DLOG"); LOSS_BASE=$(count "$LOSS_RE" "$DLOG")
esp_upload "$CYAML" "$CPORT" "$CTREE" || fail "client upload failed"
: > "$CLOG"; ("$PY" "$SKILL/scripts/serial_capture.py" "$CPORT" $CLIENT_CAPTURE "$CLOG" 2> "${CLOG%-serial.log}-capture.err" &)
if n=$(wait_for "$CLOG" "real save status\|posting the real" $SAVE_WAIT); then
echo "[hammer] client posted the real credentials after ${n}s; settling ${SETTLE}s"; sleep "$SETTLE"
else
[ -s "$CLOG" ] || fail "the client capture produced nothing (the capture itself failed), see ${CLOG%-serial.log}-capture.err"
port_never_opened "$CLOG" && fail "could not open $CPORT (held by another process, or the wrong port), see $CLOG"
INVALID="client never reached the real save within ${n}s"; echo "[hammer] WARNING: $INVALID"
fi
# A verdict needs complete evidence: both captures must have lasted the run and logged no error of their own
for spec in "$DPORT:${DLOG%-serial.log}-capture.err" "$CPORT:${CLOG%-serial.log}-capture.err"; do
port=${spec%%:*}; err=${spec#*:}
pgrep -f "[s]erial_capture.py $port " >/dev/null || INVALID="${INVALID:+$INVALID; }the capture on $port ended before the run did, see $err"
[ -s "$err" ] && INVALID="${INVALID:+$INVALID; }the capture on $port reported an error, see $err"
done
CRASHES=$(LC_ALL=C grep -a -c -E "$CRASH_RE" "$DLOG")
BANNERS=$(( $(count "$BANNER_RE" "$DLOG") - BANNER_BASE )); LOSSES=$(( $(count "$LOSS_RE" "$DLOG") - LOSS_BASE ))
if [ "$KIND" = pico ]; then
REBOOTS=$BANNERS; [ "$LOSSES" -gt "$REBOOTS" ] && REBOOTS=$LOSSES # one reboot can show as both, so take the larger
else
REBOOTS=$BANNERS; [ "$LOSSES" -gt 0 ] && INVALID="${INVALID:+$INVALID; }the DUT port dropped $LOSSES time(s) mid-run (adapter or hub, not the chip)"
fi
STA=$(LC_ALL=C grep -a 'IP Address:' "$DLOG" | grep -v -c '192\.168\.4\.'); REAL=$(LC_ALL=C grep -a -o 'real save status [-0-9]*' "$CLOG" | tail -1 | awk '{print $4}')
SAVES=$(count 'Requested WiFi Settings Change' "$DLOG"); EXITS=$(count 'cooldown early' "$DLOG"); ANSWERED=$(count 'bogus save status 200' "$CLOG")
echo "[hammer] $DNAME: saves requested $SAVES, cooldown exits $EXITS, crash markers $CRASHES, after the AP came up: boot banners $BANNERS, port losses $LOSSES, reboots $REBOOTS; STA addresses $STA"
FAILED=$(count 'bogus save status -1' "$CLOG")
echo "[hammer] $CNAME: bogus saves answered $ANSWERED, failed $FAILED, real save status ${REAL:-none}"
# Only whole messages, matched where the message starts, so a credential line or an odd SSID never gets in
LC_ALL=C grep -a -E "^\[[0-9:]+\](\[[A-Z]\]\[[a-z_]+:[0-9]+\]: *(Exiting cooldown early|Starting fallback AP|Captive portal|Requested WiFi Settings Change|Retry phase|Connected\$|IP Address: )|\[capture\] port lost|($CRASH_RE))" "$DLOG" | LC_ALL=C tr -cd '\11\12\15\40-\176' | sed -E 's/(IP Address: )[^ ]+/\1<redacted>/' | cut -c1-110 | head -80 > "$DDIR/$DNAME-events.txt"
echo "[hammer] events: $DDIR/$DNAME-events.txt"
stop_tails
[ -z "$INVALID" ] || { echo "[hammer] RESULT INVALID: $INVALID"; exit 2; }
# Provisioning is proven by the device joining the network; the client's answer to the real save can time
# out because the device leaves the AP before replying, so its status is information only
if [ "$CRASHES" -gt 0 ] || [ "$REBOOTS" -gt 0 ] || [ "$STA" -lt 1 ]; then
echo "[hammer] RESULT FAIL: crash markers $CRASHES, reboots $REBOOTS, STA addresses $STA, real save status ${REAL:-none}"; exit 3
fi
# A pass needs the stimulus the flow is about: at least half the configured bogus saves answered and one cooldown exit
CONFIGURED=$(LC_ALL=C grep -a -E '^[[:space:]]*bogus_saves:' "$CYAML" | head -1 | tr -dc '0-9'); CONFIGURED=${CONFIGURED:-15}
if [ "$EXITS" -lt 1 ] || [ $((ANSWERED * 2)) -lt "$CONFIGURED" ]; then
echo "[hammer] RESULT INVALID: insufficient stimulus (bogus saves answered $ANSWERED of $CONFIGURED, cooldown exits $EXITS)"; exit 2
fi
[ "$FAILED" -eq 0 ] || echo "[hammer] WARNING: $FAILED of $CONFIGURED bogus saves got no answer"
echo "[hammer] RESULT PASS"; exit 0
@@ -1,77 +0,0 @@
# Package for the client board: it joins the device under test's AP (priority 10), posts
# `bogus_saves` bogus /wifisave requests `save_interval` apart, then posts the real credentials once.
# Include from a per-run yaml that holds the platform block and the substitutions (example-client.yaml);
# real_ssid and real_psk come from the scratch directory's secrets.yaml and must be URL safe.
# Set bogus_saves to 1 for a plain provisioning check. Log lines the driver script counts:
# "bogus save N", "bogus save status 200", "posting the real credentials", "real save status 200"
# The hammer is a single-mode script, so a reconnect to the AP (the device under test rebooted) does not
# start a second series on top of the first.
substitutions:
ap_password: hwtestpass
bogus_saves: "15"
save_interval: 3s
bogus_ssid: hwtest-no-such-network
bogus_psk: nosuchpassword
esphome:
name: ${name}
logger:
level: DEBUG
http_request:
id: http
verify_ssl: false
timeout: 10s
wifi:
id: wifi_id
networks:
- ssid: ${ap_ssid}
password: ${ap_password}
priority: 10
- ssid: ${real_ssid}
password: ${real_psk}
on_connect:
- lambda: |-
char b[40];
ESP_LOGI("test", "connected, ip %s", id(wifi_id).get_ip_addresses()[0].str_to(b));
- if:
condition:
lambda: |-
char b[40];
return strncmp(id(wifi_id).get_ip_addresses()[0].str_to(b), "192.168.4.", 10) == 0;
then:
- script.execute: hammer
script:
- id: hammer
mode: single
then:
- delay: 3s
- logger.log: "hammering /wifisave with bogus credentials"
- repeat:
count: ${bogus_saves}
then:
- lambda: ESP_LOGI("test", "bogus save %u", (unsigned) iteration + 1);
- http_request.get:
url: "http://192.168.4.1/wifisave?ssid=${bogus_ssid}&psk=${bogus_psk}"
capture_response: true
on_response:
- lambda: ESP_LOGI("test", "bogus save status %d", response->status_code);
on_error:
- lambda: ESP_LOGW("test", "bogus save status -1");
- delay: ${save_interval}
- logger.log: "posting the real credentials"
- http_request.get:
url: "http://192.168.4.1/wifisave?ssid=${real_ssid}&psk=${real_psk}"
capture_response: true
on_response:
- lambda: ESP_LOGI("test", "real save status %d", response->status_code);
on_error:
- lambda: ESP_LOGW("test", "real save status -1");
interval:
- interval: 5s
then:
- lambda: ESP_LOGI("test", "alive %u s", (unsigned) (millis() / 1000));
@@ -1,31 +0,0 @@
# Package for a device under test that never finds its network, falls back to its AP and serves the
# captive portal. Include it from a per-run yaml that holds the platform block and the substitutions
# (see example-dut.yaml). Bump `name` on every run: saved credentials are keyed by it, and a reused
# name boots straight onto the real network and never raises the AP.
substitutions:
ap_password: hwtestpass
ap_timeout: 15s
bogus_ssid: hwtest-no-such-network
bogus_psk: nosuchpassword
esphome:
name: ${name}
logger:
level: DEBUG
wifi:
networks:
- ssid: ${bogus_ssid}
password: ${bogus_psk}
ap:
ssid: ${ap_ssid}
password: ${ap_password}
ap_timeout: ${ap_timeout}
captive_portal:
interval:
- interval: 5s
then:
- lambda: ESP_LOGI("test", "alive %u s", (unsigned) (millis() / 1000));
@@ -1,18 +0,0 @@
# Client board for the /wifisave hammer. Copy into a scratch directory next to a secrets.yaml;
# ap_ssid must match the device under test, real_ssid and real_psk must be URL safe.
substitutions:
name: hwtest-client-1
ap_ssid: hwtest-ap
real_ssid: !secret wifi_ssid
real_psk: !secret wifi_password
bogus_saves: "15"
esp32:
board: esp32dev
framework:
type: esp-idf
# esp8266: {board: d1_mini}
packages:
hwtest: !include client-wifisave.yaml
@@ -1,16 +0,0 @@
# Device under test for the /wifisave hammer. Copy into a scratch directory, keep the file name equal
# to `name`, pick one platform block, bump `name` every run.
substitutions:
name: hwtest-dut-1
ap_ssid: hwtest-ap
esp8266:
board: d1_mini
# esp32: {board: esp32dev, framework: {type: esp-idf}}
# rtl87xx: {board: bw15}
# bk72xx: {board: generic-bk7238} # plus logger: {hardware_uart: UART1}, BK72xx logs on UART2 by default
# rp2040: {board: rpipico2w}
packages:
hwtest: !include dut-fallback-ap.yaml
+1 -1
View File
@@ -22,7 +22,7 @@ runs:
# cached path cannot diverge.
echo "ESPHOME_ARDUINO8266_PREFIX=$HOME/.esphome-arduino8266" >> "$GITHUB_ENV"
. venv/bin/activate
key=$(python -c 'from esphome.components.esp8266 import RECOMMENDED_ARDUINO_FRAMEWORK_VERSION as f; from esphome.arduino8266.framework import FRAMEWORK_RELEASES, TOOLCHAIN_VERSION as t; print(f"{FRAMEWORK_RELEASES[f].tag}-{t}")')
key=$(python -c 'from esphome.components.esp8266 import RECOMMENDED_ARDUINO_FRAMEWORK_VERSION as f; from esphome.arduino8266.framework import TOOLCHAIN_VERSION as t; print(f"{f}-{t}")')
[ -n "$key" ] || exit 1
echo "key=$key" >> "$GITHUB_OUTPUT"
- name: Cache the native toolchain (write on dev)
+1 -1
View File
@@ -32,7 +32,7 @@ runs:
# detects the activated venv via ``VIRTUAL_ENV`` so the venv layout
# downstream jobs rely on is preserved.
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
enable-cache: true
# Pull request saves land in per-PR scopes nothing else can
+1 -1
View File
@@ -53,7 +53,7 @@ module.exports = async ({ github, context }) => {
});
const currentLabels = currentLabelsData.map(label => label.name);
const managedLabels = currentLabels.filter(label =>
label.startsWith('component: ') || label.startsWith('platform: ') || MANAGED_LABELS.includes(label)
label.startsWith('component: ') || MANAGED_LABELS.includes(label)
);
// Check for mega-PR early - if present, skip most automatic labeling
+10 -26
View File
@@ -42,8 +42,8 @@ function generateReviewMessages(finalLabels, originalLabelCount, deprecatedInfo,
let message = `${TOO_BIG_MARKER}\n### 📦 Pull Request Size\n\n`;
message +=
`Hey @${prAuthor}, thanks for the contribution. This PR is on the ` +
`large side `;
`Hey @${prAuthor}, thanks for the contribution! Just a heads up, ` +
`this PR is on the large side `;
if (tooManyLabels && tooManyChanges) {
message +=
@@ -57,31 +57,16 @@ function generateReviewMessages(finalLabels, originalLabelCount, deprecatedInfo,
}
message += `, which makes it harder for maintainers to review.\n\n`;
let condition;
if (tooManyLabels && tooManyChanges) {
condition =
`is at most ${TOO_BIG_THRESHOLD} lines (excluding tests) and touches ` +
`at most ${MAX_LABELS} components/areas`;
} else if (tooManyLabels) {
condition = `touches at most ${MAX_LABELS} components/areas`;
} else {
condition = `is at most ${TOO_BIG_THRESHOLD} lines (excluding tests)`;
}
message +=
`**This PR will not be reviewed until it ${condition}.** We know ` +
`that is not what you want to hear after this much work, and we want ` +
`to be upfront so you do not wait for a review that is not coming: ` +
`please split the change. The label is removed automatically once ` +
`the PR ${condition}.\n\n`;
`Smaller, focused PRs tend to be reviewed much faster since they ` +
`fit into the short gaps between other maintainer work; large ones ` +
`often have to wait for a rare long uninterrupted block of time. ` +
`If you can break this up into smaller pieces that can be reviewed ` +
`independently, it will almost certainly land faster overall.\n\n`;
message +=
`There is no exception you can request. Rarely, a maintainer agrees in ` +
`\`#devs\` on [Discord](https://esphome.io/chat) to review a change that ` +
`genuinely cannot be split as one piece and adds the \`mega-pr\` label, ` +
`but that is rare enough that you should plan on splitting rather than ` +
`wait for it. Smaller, focused PRs are picked up much faster because ` +
`they fit into the short gaps between other maintainer work. For a new ` +
`component, the first PR brings the hub and a single platform (for ` +
`example \`sensor\`); each further platform is its own PR on top of it.\n\n`;
`Before putting more time in, it's also worth popping into ` +
`\`#devs\` on [Discord](https://esphome.io/chat) so we can help ` +
`you scope things and flag anything already in flight.\n\n`;
message +=
`For more details (including how to split the work up), see: ` +
`https://developers.esphome.io/contributing/submitting-your-work/` +
@@ -229,7 +214,6 @@ async function handleMaintainerAccessComment(github, context, maintainerAccess)
}
module.exports = {
generateReviewMessages,
handleReviews,
handleMaintainerAccessComment
};
@@ -1,38 +0,0 @@
const { describe, it } = require('node:test');
const assert = require('node:assert/strict');
const { generateReviewMessages } = require('../reviews');
const MAX_LABELS = 15;
const TOO_BIG_THRESHOLD = 1000;
function tooBigMessage(labelCount, additions) {
const files = [{ filename: 'esphome/components/a/a.cpp', additions, deletions: 0 }];
const messages = generateReviewMessages(['too-big'], labelCount, null, files, additions, 0, 'someone', MAX_LABELS, TOO_BIG_THRESHOLD);
assert.equal(messages.length, 1);
return messages[0];
}
describe('too-big review message', () => {
it('names the line cap when the PR is too long', () => {
const message = tooBigMessage(3, 1500);
assert.match(message, /will not be reviewed until it is at most 1000 lines \(excluding tests\)\./);
assert.match(message, /removed automatically once the PR is at most 1000 lines/);
assert.doesNotMatch(message, /components\/areas\./);
});
it('names the area cap when the PR touches too many areas but is short', () => {
const message = tooBigMessage(20, 200);
assert.match(message, /will not be reviewed until it touches at most 15 components\/areas\./);
assert.doesNotMatch(message, /until it is at most 1000 lines/);
});
it('names both caps when both are exceeded', () => {
const message = tooBigMessage(20, 1500);
assert.match(message, /is at most 1000 lines \(excluding tests\) and touches at most 15 components\/areas\./);
});
it('tells new-component authors to bring one platform first', () => {
assert.match(tooBigMessage(3, 1500), /hub and a single platform/);
assert.match(tooBigMessage(3, 1500), /mega-pr/);
});
});
+1 -1
View File
@@ -28,7 +28,7 @@ jobs:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}
private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
+2 -2
View File
@@ -29,7 +29,7 @@ jobs:
- name: Set up uv
# ``--system`` (below) installs into the setup-python interpreter;
# no venv is created or restored by this workflow.
uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
enable-cache: true
# Pull-request-only workflow: a save could never be shared and
@@ -97,7 +97,7 @@ jobs:
run: git diff
- if: failure()
name: Archive artifacts
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: generated-proto-files
path: |
+14 -4
View File
@@ -19,7 +19,6 @@ on:
- "esphome/core/**"
- "esphome/writer.py"
- "esphome/build_gen/**"
- "esphome/build_helpers/**"
- "esphome/espidf/**"
- "esphome/platformio/**"
- "esphome/components/bk72xx/**"
@@ -128,7 +127,7 @@ jobs:
- name: Upload compile-test image artifact
if: matrix.os == 'ubuntu-24.04' && matrix.build_type == 'docker'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
# The tar is already compressed, so upload it as-is. archive: false
# skips the redundant zip and makes the file name the artifact name
@@ -207,10 +206,21 @@ jobs:
- ln882x-arduino
- nrf52
- host
# Strict by default so a new matrix id cannot silently join in the
# degrade-quietly mode the knob exists to catch; the knob is inert
# where no pch code runs (esp32-*-platformio, nrf52).
# Opt-outs: libretiny GCC rejects its own pch until a toolchain bump.
include:
- id: bk72xx-arduino
pch_strict: "0"
- id: rtl87xx-arduino
pch_strict: "0"
- id: ln882x-arduino
pch_strict: "0"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Download image artifact
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: compile-test-image.tar.zst
- name: Load image
@@ -218,7 +228,7 @@ jobs:
- name: Compile ${{ matrix.id }}
run: |
docker run --rm \
-e ESPHOME_PCH_STRICT="${{ matrix.pch_strict || '1' }}" \
-v "${{ github.workspace }}/docker/test_configs:/config" \
-e ESPHOME_LDGEN_STRICT=1 \
"ghcr.io/esphome/esphome-amd64:${{ needs.check-docker.outputs.tag }}" \
compile "${{ matrix.id }}.yaml"
+52 -174
View File
@@ -49,7 +49,7 @@ jobs:
# detects the activated venv via ``VIRTUAL_ENV`` so downstream jobs
# that ``. venv/bin/activate`` see an identical layout.
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
enable-cache: true
# Pull request saves land in per-PR scopes nothing else can
@@ -81,8 +81,8 @@ jobs:
- name: Install apt packages (cached)
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
with:
packages: libsdl2-dev libmbedtls-dev ccache
version: 1.2
packages: libsdl2-dev ccache
version: 1.1
determine-jobs:
name: Determine which jobs to run
@@ -286,7 +286,7 @@ jobs:
fi
echo "version=$version" >> "$GITHUB_OUTPUT"
- name: Run prek
uses: j178/prek-action@1382ad72dea72f9d53832f2bcb65b3e87a947204 # v3.0.1
uses: j178/prek-action@4e14d07f9231acabce116ccfca13b13dd9755ece # v3.0.0
with:
prek-version: ${{ steps.prek.outputs.version }}
# This job only runs on pull requests, so nothing ever populates
@@ -299,7 +299,7 @@ jobs:
# Pushes any fixes the hooks made back to the pull request. This step
# must keep its default name: the GitHub App that performs the push
# locates the workflow run by that name.
- uses: pre-commit-ci/lite-action@062bca0919bc9d6e66755cc05074b70c77e111fc # v1.2.0
- uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0
if: always()
with:
msg: apply automatic formatting fixes
@@ -395,8 +395,6 @@ jobs:
- common
- determine-jobs
if: needs.determine-jobs.outputs.integration-tests == 'true'
# A hung test is failed by pytest's --timeout below; this bounds the rest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
@@ -417,8 +415,8 @@ jobs:
timeout-minutes: 10
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
with:
packages: libsdl2-dev libmbedtls-dev ccache
version: 1.2
packages: libsdl2-dev ccache
version: 1.1
- name: Set up Python 3.13
id: python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
@@ -440,7 +438,7 @@ jobs:
- name: Set up uv
# Only needed on cache miss to populate the venv.
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
enable-cache: true
# Pull request saves land in per-PR scopes nothing else can
@@ -473,14 +471,13 @@ jobs:
exit 1
fi
echo "Bucket ${{ matrix.bucket.name }}: running ${#test_files[@]} integration tests"
# A hung test fails after 30 min: the 15 min shared build lock wait plus a cold compile
pytest -vv --no-cov --tb=native --durations=30 -n auto --dist worksteal --timeout=1800 \
pytest -vv --no-cov --tb=native --durations=30 -n auto --dist worksteal \
--junitxml=junit-integration.xml "${test_files[@]}"
- name: Upload test artifacts
# Tests that compare rendered output write the image they actually got here, so a
# failure can be looked at without reproducing the whole build locally.
if: failure()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: integration-test-artifacts-${{ matrix.bucket.name }}
path: test_artifacts/
@@ -491,7 +488,7 @@ jobs:
# script/update_integration_test_durations.py; only full matrix dev
# runs produce usable data.
if: github.ref == 'refs/heads/dev' && needs.determine-jobs.outputs.integration-run-all == 'true'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-integration-${{ strategy.job-index }}
path: junit-integration.xml
@@ -531,7 +528,7 @@ jobs:
script/check_import_time.py --check --har importtime.har
- name: Upload waterfall HAR
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: import-time-waterfall
path: importtime.har
@@ -629,7 +626,7 @@ jobs:
apt-get install -y libc6-dbg
- name: Run CodSpeed benchmarks
uses: CodSpeedHQ/action@f842b9a3ffe213dbb81768fd7f7eeb4dfcf1c369 # v5.4.2
uses: CodSpeedHQ/action@373d6868929f444bc08d901fd0eb0ad52a8875ea # v5.2.1
with:
run: |
. venv/bin/activate
@@ -683,7 +680,7 @@ jobs:
include:
- id: clang-tidy
name: Run script/clang-tidy for ESP8266
options: --environment esp8266-arduino-tidy --grep USE_ESP8266 --grep USE_SOCKET_IMPL_LWIP_TCP --grep USE_SHD_FIRMWARE_DATA
options: --environment esp8266-arduino-tidy --grep USE_ESP8266
pio_cache_key: tidyesp8266
- id: clang-tidy
name: Run script/clang-tidy for ESP32 Arduino
@@ -696,16 +693,12 @@ jobs:
ignore_errors: false
- id: clang-tidy
name: Run script/clang-tidy for RP2
options: --environment rp2-tidy --grep USE_RP2 --grep USE_BLE_SCAN_RESPONSE_MERGER
options: --environment rp2-tidy --grep USE_RP2
pio_cache_key: tidyrp2
- id: clang-tidy
name: Run script/clang-tidy for host
options: --environment host-tidy --grep USE_HOST
pio_cache_key: tidyhost
- id: clang-tidy
name: Run script/clang-tidy for LibreTiny
environments: bk72xx-tidy ln882h-tidy rtl87xxb-tidy rtl87xxc-tidy
options: --grep USE_LIBRETINY --grep USE_BK72XX --grep USE_RTL87XX --grep USE_LN882X --grep USE_LN882H_BLE --grep USE_SOCKET_IMPL_LWIP_SOCKETS
options: --grep USE_LIBRETINY --grep USE_BK72XX --grep USE_RTL87XX --grep USE_LN882X
pio_cache_key: tidylibretiny
steps:
@@ -714,16 +707,6 @@ jobs:
with:
# Need history for HEAD~1 to work for checking changed files
fetch-depth: 2
- name: Install apt packages (cached)
if: matrix.pio_cache_key == 'tidyhost'
# libsdl2-dev is needed by the sdl component on the host, libmbedtls-dev
# by dsmr and dlms_meter. Packages and version must match seed-apt-cache
# exactly.
timeout-minutes: 10
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
with:
packages: libsdl2-dev libmbedtls-dev ccache
version: 1.2
- name: Restore Python
id: restore-python
@@ -910,20 +893,14 @@ jobs:
matrix:
include:
- id: clang-tidy
name: Run script/clang-tidy for ESP32 IDF 1/5
options: --environment esp32-idf-tidy --split-num 5 --split-at 1
name: Run script/clang-tidy for ESP32 IDF 1/3
options: --environment esp32-idf-tidy --split-num 3 --split-at 1
- id: clang-tidy
name: Run script/clang-tidy for ESP32 IDF 2/5
options: --environment esp32-idf-tidy --split-num 5 --split-at 2
name: Run script/clang-tidy for ESP32 IDF 2/3
options: --environment esp32-idf-tidy --split-num 3 --split-at 2
- id: clang-tidy
name: Run script/clang-tidy for ESP32 IDF 3/5
options: --environment esp32-idf-tidy --split-num 5 --split-at 3
- id: clang-tidy
name: Run script/clang-tidy for ESP32 IDF 4/5
options: --environment esp32-idf-tidy --split-num 5 --split-at 4
- id: clang-tidy
name: Run script/clang-tidy for ESP32 IDF 5/5
options: --environment esp32-idf-tidy --split-num 5 --split-at 5
name: Run script/clang-tidy for ESP32 IDF 3/3
options: --environment esp32-idf-tidy --split-num 3 --split-at 3
steps:
- name: Check out code from GitHub
@@ -1006,14 +983,14 @@ jobs:
- id: clang-tidy
name: Run script/clang-tidy for ESP32 S3
# yamllint disable-line rule:line-length
options: --environment esp32s3-idf-tidy --grep SOC_TEMP_SENSOR_SUPPORTED --grep USE_ESP32_VARIANT_ESP32S3 --grep USE_LOGGER_USB_CDC --grep SOC_I2S_SUPPORTS_TDM --grep USE_OPENTHREAD
options: --environment esp32s3-idf-tidy --grep SOC_TEMP_SENSOR_SUPPORTED --grep USE_ESP32_VARIANT_ESP32S3 --grep USE_LOGGER_USB_CDC
tidy_environment: esp32s3-idf-tidy
- id: clang-tidy
name: Run script/clang-tidy for ESP32 P4
# P4 has no native Wi-Fi/BLE; those run over the hosted co-processor,
# so their code paths differ -- lint them under the P4 build too.
# yamllint disable-line rule:line-length
options: --environment esp32p4-idf-tidy --grep USE_ESP32_VARIANT_ESP32P4 --grep CONFIG_IDF_TARGET_ESP32P4 --grep USE_ESP32_HOSTED --grep USE_WIFI --grep USE_BLE
options: --environment esp32p4-idf-tidy --grep USE_ESP32_VARIANT_ESP32P4 --grep USE_ESP32_HOSTED --grep USE_WIFI --grep USE_BLE
tidy_environment: esp32p4-idf-tidy
- id: clang-tidy
name: Run script/clang-tidy for ESP32 C6
@@ -1119,8 +1096,8 @@ jobs:
timeout-minutes: 10
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
with:
packages: libsdl2-dev libmbedtls-dev ccache
version: 1.2
packages: libsdl2-dev ccache
version: 1.1
- name: Check out code from GitHub
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
@@ -1248,28 +1225,9 @@ jobs:
if [ -n "$compile_csv" ]; then
# Run compilation with grouping and isolation
# The bootloader has no ESPHome code and these builds never
# flash; the check_idf_py batch keeps the full build so the
# native sub-build and the equivalence check stay covered.
skip_flag="--skip-bootloader"
if [[ "${{ matrix.batch.check_idf_py }}" == "true" ]]; then
skip_flag=""
fi
python3 script/test_build_components.py -e compile -c "$compile_csv" -f --isolate "$directly_changed_csv" $skip_flag
if [[ "${{ matrix.batch.check_idf_py }}" == "true" ]]; then
# The real idf.py must find nothing to configure or build in a
# tree built above; catches drift on ESP-IDF bumps.
echo "Checking the native ESP-IDF build matches idf.py"
python3 script/check_idf_py_equivalence.py
fi
python3 script/test_build_components.py -e compile -c "$compile_csv" -f --isolate "$directly_changed_csv"
else
echo "All components in this batch are validate-only -- skipping compile stage."
if [[ "${{ matrix.batch.check_idf_py }}" == "true" ]]; then
# determine-jobs and this step disagree on what compiles; fail
# rather than let the check run nowhere.
echo "::error::This batch was picked for the idf.py check but compiled nothing"
exit 1
fi
fi
- name: Print ccache statistics
@@ -1349,93 +1307,10 @@ jobs:
echo ""
# ESP8266 Arduino built directly (no PlatformIO); compile validates
# config first, so a separate config pass is redundant.
python3 script/test_build_components.py -e compile -t esp8266-ard -c "$TEST_COMPONENTS" -f --toolchain arduino --fail-on-no-tests
test-esp8266-native-windows:
name: Compile esp8266 with the native toolchain on Windows (ccache ${{ matrix.ccache }})
runs-on: windows-latest
needs:
- common
- determine-jobs
if: github.event_name == 'pull_request' && needs.determine-jobs.outputs.esp8266-native == 'true'
# A hung compiler must fail the job, not hold the runner for six hours.
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
# Both ways the build runs on Windows: ESPHome Desktop bundles
# ccache and puts it on PATH, a pip install has none.
ccache: ["1", "0"]
env:
ESPHOME_CCACHE_ENABLE: ${{ matrix.ccache }}
# The test script prints characters the cp1252 console cannot encode
PYTHONUTF8: "1"
# The exact static build ESPHome Desktop ships
CCACHE_URL: https://github.com/ccache/ccache/releases/download/v4.14/ccache-4.14-windows-x86_64.zip
CCACHE_SHA256: 2568347a697e103ca1b073981c704ad76fb2507d066c38dba038dd73399d968f
steps:
- name: Check out code from GitHub
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Install ccache
if: matrix.ccache == '1'
shell: pwsh
run: |
$dir = Join-Path $env:RUNNER_TEMP "ccache"
New-Item -ItemType Directory -Force $dir | Out-Null
$zip = Join-Path $dir "ccache.zip"
Invoke-WebRequest -Uri $env:CCACHE_URL -OutFile $zip
$hash = (Get-FileHash $zip -Algorithm SHA256).Hash.ToLower()
if ($hash -ne $env:CCACHE_SHA256) {
Write-Host "::error::ccache archive sha256 $hash does not match $env:CCACHE_SHA256"
exit 1
}
Expand-Archive -Path $zip -DestinationPath $dir
$bin = Get-ChildItem -Path $dir -Recurse -Filter ccache.exe | Select-Object -First 1
Add-Content -Path $env:GITHUB_PATH -Value $bin.DirectoryName
& $bin.FullName --version
- name: Compile
shell: pwsh
# One component test: web_server brings wifi, api and the async web
# server libraries, the shape of a typical ESP8266 device
run: |
. .\venv\Scripts\Activate.ps1
$arguments = "script/test_build_components.py", "-e", "compile", "-t", "esp8266-ard", "-c", "web_server", "--base-only", "--toolchain", "arduino", "--fail-on-no-tests"
$p = Start-Process -FilePath python -ArgumentList $arguments -NoNewWindow -PassThru
# Reading the handle keeps ExitCode available after the process exits
$null = $p.Handle
if (-not $p.WaitForExit(25 * 60 * 1000)) {
Write-Host "::error::The compile did not finish in 25 minutes; processes still running:"
Get-CimInstance Win32_Process |
Where-Object { $_.CommandLine -match 'xtensa|ccache|ninja|esphome' } |
Select-Object ProcessId, ParentProcessId, CreationDate, CommandLine |
Format-List | Out-String -Width 4096 | Write-Host
Get-Process |
Where-Object { $_.Name -match 'cc1|ccache|ninja|xtensa|python' } |
Select-Object Id, Name, CPU, WorkingSet64 |
Format-Table | Out-String | Write-Host
taskkill /PID $p.Id /T /F
exit 1
}
exit $p.ExitCode
- name: Show ccache statistics
# Also after a failed or killed compile: the counters say whether
# ccache was ever reached
if: always() && matrix.ccache == '1'
shell: pwsh
# The build keeps its store under the esphome tools cache
run: |
$env:CCACHE_DIR = Join-Path $env:LOCALAPPDATA "esphome\Cache\arduino8266\ccache"
ccache -s
# config first, so a separate config pass is redundant. Strict pch:
# exercises the native ninja pch (and its probe edge) against real
# component configs; the docker matrix smoke-tests both toolchains.
ESPHOME_PCH_STRICT=1 python3 script/test_build_components.py -e compile -t esp8266-ard -c "$TEST_COMPONENTS" -f --toolchain arduino --fail-on-no-tests
device-builder:
name: Test downstream esphome/device-builder
@@ -1465,7 +1340,7 @@ jobs:
# install step (order-of-magnitude faster on cold boots,
# with its own wheel cache). actions/setup-python still
# provides the interpreter.
uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
enable-cache: true
# Pull request saves land in per-PR scopes nothing else can
@@ -1524,27 +1399,31 @@ jobs:
echo "::warning::ci_memory_impact_extract.py not found on target branch, skipping memory impact analysis"
fi
# The build below uses --base-only, so skip unless the target branch has
# test.<platform>.yaml for every requested component (test-*.yaml
# variants alone compile nothing, and a partial set would compare a
# smaller target build against the PR build). Checked here, not in
# determine-jobs.py, because determine-jobs runs on the PR branch and
# cannot see the target branch.
# Check if test files exist on the target branch for the requested
# components and platform. When a PR adds new test files for a platform,
# the target branch won't have them yet, so skip instead of failing.
# This check must be done here (not in determine-jobs.py) because
# determine-jobs runs on the PR branch and cannot see what the target
# branch has.
- name: Check for test files on target branch
id: check-tests
if: steps.check-script.outputs.skip != 'true'
run: |
components='${{ toJSON(fromJSON(needs.determine-jobs.outputs.memory_impact).components) }}'
platform="${{ fromJSON(needs.determine-jobs.outputs.memory_impact).platform }}"
missing=""
found=false
for component in $(echo "$components" | jq -r '.[]'); do
if [ ! -f "tests/components/${component}/test.${platform}.yaml" ]; then
missing="${missing} ${component}"
fi
# Check for test files matching the platform (test.platform.yaml or test-*.platform.yaml)
for f in tests/components/${component}/test*.${platform}.yaml; do
if [ -f "$f" ]; then
found=true
break 2
fi
done
done
if [ -n "$missing" ]; then
if [ "$found" = false ]; then
echo "skip=true" >> $GITHUB_OUTPUT
echo "::warning::No test.${platform}.yaml on target branch for${missing}, skipping memory impact analysis"
echo "::warning::No test files found on target branch for platform ${platform}, skipping memory impact analysis"
else
echo "skip=false" >> $GITHUB_OUTPUT
fi
@@ -1664,7 +1543,7 @@ jobs:
fi
- name: Upload memory analysis JSON
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: memory-analysis-target
path: memory-analysis-target.json
@@ -1727,7 +1606,7 @@ jobs:
--platform "$platform"
- name: Upload memory analysis JSON
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: memory-analysis-pr
path: memory-analysis-pr.json
@@ -1757,13 +1636,13 @@ jobs:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Download target analysis JSON
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: memory-analysis-target
path: ./memory-analysis
continue-on-error: true
- name: Download PR analysis JSON
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: memory-analysis-pr
path: ./memory-analysis
@@ -1807,7 +1686,6 @@ jobs:
- test-build-components-split
- test-esp32-platformio
- test-esp8266-native
- test-esp8266-native-windows
- device-builder
- memory-impact-target-branch
- memory-impact-pr-branch
@@ -35,7 +35,7 @@ jobs:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}
private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
+2 -2
View File
@@ -56,7 +56,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
uses: github/codeql-action/init@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
@@ -84,6 +84,6 @@ jobs:
exit 1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
uses: github/codeql-action/analyze@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
with:
category: "/language:${{matrix.language}}"
+9 -15
View File
@@ -15,7 +15,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}
private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
@@ -125,20 +125,14 @@ jobs:
}
async function getEsphomeAndComponentChanges(github, owner, repo, prNumber) {
const changedFiles = await github.paginate(
github.rest.pulls.listFiles,
{
owner: owner,
repo: repo,
pull_number: prNumber,
per_page: 100,
}
);
const changedFiles = await github.rest.pulls.listFiles({
owner: owner,
repo: repo,
pull_number: prNumber,
});
// Files used only for development and CI, which do not affect use as an external component
const ignoredFiles = ["esphome/core/defines.h", "esphome/idf_component.yml"];
const esphomeChanges = changedFiles
.filter(file => !ignoredFiles.includes(file.filename) && file.filename.startsWith('esphome/'))
const esphomeChanges = changedFiles.data
.filter(file => file.filename !== "esphome/core/defines.h" && file.filename.startsWith('esphome/'))
.map(file => {
const match = file.filename.match(/esphome\/([^/]+)/);
return match ? match[1] : null;
@@ -150,7 +144,7 @@ jobs:
}
const uniqueEsphomeChanges = [...new Set(esphomeChanges)];
const componentChanges = changedFiles
const componentChanges = changedFiles.data
.filter(file => file.filename.startsWith('esphome/components/'))
.map(file => {
const match = file.filename.match(/esphome\/components\/([^/]+)\//);
+3 -3
View File
@@ -162,7 +162,7 @@ jobs:
# version: ${{ needs.init.outputs.tag }}
- name: Upload digests
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: digests-${{ matrix.platform.arch }}
path: /tmp/digests
@@ -195,7 +195,7 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Download digests
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: digests-*
path: /tmp/digests
@@ -245,7 +245,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}
private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
+1 -15
View File
@@ -16,18 +16,16 @@ jobs:
# No GITHUB_TOKEN permissions: the reusable workflow mints an ESPHome
# GitHub App token so the labels, comments and closures come from
# esphome[bot] instead of github-actions[bot].
uses: esphome/workflows/.github/workflows/stale.yml@4fbce13026c393d6eb6b247e394dcd9ef1af76c2 # main
uses: esphome/workflows/.github/workflows/stale.yml@cc3e76de337dc59bc1cba8da58d963cd23b873f1 # main
secrets:
ESPHOME_GITHUB_APP_PRIVATE_KEY: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
with:
# Live only on dev: a workflow_dispatch from any other branch is a dry run
dry-run: ${{ github.ref != 'refs/heads/dev' }}
days-before-stale: 90
days-before-stale-conflicting: 30
days-before-close: 7
stale-label: stale
exempt-label: not-stale
conflict-label: has-conflicts
ignored-users: esphbot,codecov-commenter
stale-pr-message: >
There hasn't been any activity on this pull request recently. This
@@ -38,18 +36,6 @@ jobs:
to keep it open. Also, please merge the latest dev branch into your
branch to ensure that it's up to date with the latest changes.
Thank you for your contribution!
conflict-pr-message: >
This pull request has merge conflicts. Please merge the latest dev
branch into your branch to resolve them.
stale-conflicting-pr-message: >
The merge conflicts on this pull request have not been resolved for
30 days, so it has been marked as stale and will be closed if they
are not resolved within 7 days.
Please merge the latest dev branch into your branch. Once the pull
request is mergeable again the stale label is removed.
Thank you for your contribution!
stale-issue-message: >
There hasn't been any activity on this issue recently. Due to the
@@ -7,6 +7,10 @@ on:
permissions:
pull-requests: read # issues.listLabelsOnIssue to detect blocking labels (needs-docs, needs-developer-docs, merge-after-release, chained-pr)
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
check:
name: Check blocking labels
@@ -15,8 +15,6 @@ on:
# base branch checkout, so fork code never runs with the token.
pull_request_target:
types: [opened, synchronize, reopened]
branches:
- dev
paths:
- requirements_dev.txt
- requirements_test.txt
@@ -43,7 +41,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}
private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
+2 -2
View File
@@ -19,7 +19,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}
private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
@@ -47,7 +47,7 @@ jobs:
# setup-python interpreter so subsequent ``prek`` /
# ``script/run-in-env.py`` steps find the deps without a
# ``uv run`` prefix.
uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
enable-cache: true
# Pin uv version so the action does not have to fetch the
@@ -20,7 +20,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}
private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}
+3 -3
View File
@@ -10,7 +10,7 @@ ci:
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.17.0
rev: v0.16.8
hooks:
# Run the linter.
- id: ruff
@@ -18,7 +18,7 @@ repos:
# Run the formatter.
- id: ruff-format
- repo: https://github.com/PyCQA/flake8
rev: 7.4.1
rev: 7.3.0
hooks:
- id: flake8
additional_dependencies:
@@ -36,7 +36,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/asottile/pyupgrade
rev: v3.22.0
rev: v3.21.2
hooks:
- id: pyupgrade
args: [--py312-plus]
-93
View File
@@ -67,7 +67,6 @@ file does, and it is the authority when they disagree. The most useful starting
- Function-local constants: `lower_snake_case`
- Protected/private fields: `lower_snake_case_with_trailing_underscore_`
- Favor descriptive names over abbreviations
- Device components are named brand plus model (`siemens_ira211`), without a protocol-family prefix
- Enumerator names: prefix every value of an `enum class` with the enum name converted to
`UPPER_SNAKE_CASE` (e.g. `UARTFlushResult::UART_FLUSH_RESULT_SUCCESS`). Never use bare
names like `SUCCESS`, `FAILURE`, `OK`, or `FAIL`: platform SDK headers define macros with
@@ -144,9 +143,6 @@ file does, and it is the authority when they disagree. The most useful starting
* **C++ Preprocessor Directives:**
* **Avoid `#define` for constants:** Using `#define` for constants is discouraged and should be replaced with `const` variables or enums.
* **A constant with a compile-time initializer is `static constexpr`,** not `static const`, at namespace scope
and inside functions; `static const` is only for a value computed at run time. A function-local
`static constexpr` table is a static constant to clang-tidy, so it is `UPPER_SNAKE_CASE` too.
* **Use `#define` only for:**
- Conditional compilation (`#ifdef`, `#ifndef`)
- Compile-time sizes calculated during Python code generation (e.g., configuring `std::array` or `StaticVector` dimensions via `cg.add_define()`)
@@ -181,15 +177,6 @@ file does, and it is the authority when they disagree. The most useful starting
Pick the primitive by cadence: under 250 ms use a gated `loop()`; 500 ms and above use
`set_interval`. Full reasoning, including why `set_interval` costs more below 500 ms:
https://developers.esphome.io/architecture/components/advanced/#quick-rule-of-thumb
* **Repeating work:** use `set_interval`, never a `set_timeout` that re-arms itself; every re-arm
rebuilds the callback and re-queues a scheduler item, and the period drifts.
* **Scheduler ids:** name a timer only when it must be cancelled or replaced, and use a
`static constexpr uint32_t` id, never a string. Ids are per component instance and cannot clash with other
components, so number them from 0 and keep all of a component's ids together in one place.
```cpp
static constexpr uint32_t READ_TIMEOUT_ID = 0;
this->set_timeout(READ_TIMEOUT_ID, 50, [this]() { this->read_(); });
```
* **Don't override a default with the same value:** if a base class method already returns what you
want, do not override it. `Component::get_setup_priority()` returns `setup_priority::DATA`, so a
component that wants `DATA` should simply leave it alone.
@@ -197,45 +184,6 @@ file does, and it is the authority when they disagree. The most useful starting
// Bad - this is exactly what the base class already does
float get_setup_priority() const override { return setup_priority::DATA; }
```
* **Constant data lives in RAM on ESP8266** unless marked `PROGMEM`: `const` tables, class-scope
constant arrays, and in-class `std::array` initializers (a `.rodata` template plus a copy). Mark the
table `PROGMEM` and read it with `progmem_memcpy()` or `progmem_read_byte()` (`esphome/core/hal.h`);
for a table of structs copy the whole entry out and return the copy, never a pointer into flash.
On other platforms they are a plain `memcpy` and dereference, so no `#ifdef` is needed. Declare log tags with
`ESPHOME_LOG_TAG(TAG, "name")`, pass status text as `LOG_STR`, e.g.
`this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL))`, and give an action whose payload is a byte array
a `TEMPLATABLE_BYTES` field so a static code stays in flash.
* **Fixed sets of names** (status words, model names): a `PROGMEM_STRING_TABLE` (`esphome/core/progmem.h`),
logged with `get_log_str` and `LOG_STR_ARG`, copied out with `ESPHOME_strncpy_P` before `publish_state`.
A `dump_config` helper that picks a name returns `const LogString *` from `LOG_STR(...)`.
* **CRCs and bit tricks** come from `esphome/core/helpers.h` (`crc8`, `crc16`, `reverse_bits`, `encode_uint16`);
pick the helper's polynomial and bit-order arguments instead of writing a CRC loop.
* **An unset float is `NAN`**, not `optional<float>`; the optional costs 4 to 8 bytes of padding per member.
* **`PollingComponent` first runs `update()`** after a random share of the interval; call `this->update()` at the
end of `setup()` when the entities need a state at boot.
* **A multi-step command sequence** leaves the step pending when the answer is malformed, so the existing
resend and give-up logic handles it; never advance on an answer that was only logged.
* **Entities that each watch a register field:** one class taking register, shift, mask and match from a Python
tuple table, in typed `StaticVector`s sized by `cg.slot_counter`; not a template per bit, not a virtual
listener base (a second vptr per entity).
* **A global feature define** says the code is compiled in, not that this instance uses it: keep the
per-instance check (`if (this->aux_device_ == ...)`) inside the `#ifdef`.
* **Model-specific code** sits behind a define the Python side emits only for configs that use that model
(`cg.add_define("USE_SELEC_METER_EM4M")`), so the other models' builds leave it out; the runtime model check
stays inside the `#ifdef`.
* **Failures after `setup()`:** `mark_failed()` is for `setup()` only. A runtime read or write failure
sets `status_set_warning()` and the next success clears it; writes skip work when `is_failed()`.
* **`dump_config()` already prints the failure reason:** for a failed component, core prints
`<component> is marked FAILED: <reason>` right after the component's `dump_config()`, using the reason
passed to `mark_failed()`. So `dump_config()` never checks `is_failed()` to log a failure, and no
`error_code_` member exists only to pick that message. Pass the reason where setup fails instead:
`this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL))` for a failed bus transfer, a short specific reason
otherwise (`LOG_STR("Wrong chip ID")`). Core also logs it at that moment, so no `ESP_LOGE` repeats it
before `mark_failed()`; keep a separate line only when it prints a value read at run time, such as the
chip ID that did not match. Only the first reason is kept, so do not call `status_set_error()` before
`mark_failed()` and do not mark the component failed again after a helper already did.
* **Fixed platform facts compile to nothing:** gate on `#ifdef USE_ESP8266` and friends, not on a
runtime check of something the build already knows.
* **Logging string literals:** wrap literals passed as `%s` arguments in `LOG_STR_LITERAL()` so they
can be stored in flash rather than RAM.
```cpp
@@ -282,10 +230,6 @@ file does, and it is the authority when they disagree. The most useful starting
```
* **Component Metadata:**
- `DOMAIN`: Required in every component's `__init__.py`, set to the component's own name as a plain
string (e.g. `DOMAIN = "my_component"`). Other code refers to the component through it, e.g.
`from esphome.components.my_component import DOMAIN`. Keep it in alphabetical order with the other
metadata constants. CI (`lint_component_domain`) fails without it.
- `DEPENDENCIES`: List of required components
- `AUTO_LOAD`: Components to automatically load
- `CONFLICTS_WITH`: Incompatible components
@@ -299,7 +243,6 @@ file does, and it is the authority when they disagree. The most useful starting
import esphome.config_validation as cv
from esphome.const import CONF_KEY, CONF_ID
DOMAIN = "my_component"
CONF_PARAM = "param" # A constant that does not yet exist in esphome/const.py
my_component_ns = cg.esphome_ns.namespace("my_component")
@@ -441,25 +384,6 @@ file does, and it is the authority when they disagree. The most useful starting
)
```
When the callback's parameters differ from the automation's arguments, or the trigger should only
fire for some values, pass `params`, `forward` and `when`; the helper then generates a capture-less
lambda (stored inline, nothing allocated). Name the parent with `automation.parent_ref(var)` and build
`forward` from `MockObj` calls, not f-strings of C++:
```python
parent = automation.parent_ref(var)
index = cg.RawExpression("index")
await automation.build_callback_automation(
var,
"add_on_state_callback",
[(cg.StringRef, "x"), (cg.size_t, "i")],
conf,
params=[(cg.size_t, "index")],
forward=[cg.StringRef(parent.option_at(index)), index],
)
```
`build_parent_callback_automation`, `build_trigger_callback`, `build_callback_automations` and
`build_trigger_automations` cover the other shapes; see their docstrings in `esphome/automation.py`.
**C++ -- no trigger class needed.** The callback registration method must be templatized to accept both `std::function` and lightweight forwarder structs (which avoid heap allocation):
```cpp
class MyComponent : public Component {
@@ -579,12 +503,8 @@ file does, and it is the authority when they disagree. The most useful starting
`cover.is_open`, `rtttl.is_playing` and `component.is_idle` are in-tree examples.
* **Type Hints:** Type-hint all function signatures, including test functions and config validators (e.g. `def validate_x(config: ConfigType) -> ConfigType:`, `def test_x() -> None:`). Import `ConfigType` from `esphome.types`.
An intentionally empty body (an unused `register_dumper` builder, for example) gets a one-line docstring, not `pass`.
* **Configuration Validation:**
* **One schema per model:** when a component's options depend on a `model` key, use `cv.typed_schema({...},
key=CONF_MODEL, default_type=...)` with each model's own keys and defaults, not one schema plus a validator
that rejects keys and fills defaults afterwards.
* **Reuse existing validators:** Before writing a custom validator, check for an existing one in `config_validation.py` and compose it in `cv.All(...)` rather than duplicating logic across components. For example, rename a config key with `cv.rename_key(CONF_OLD, CONF_NEW, removed_in="2026.6.0")`, and reject mutually-exclusive keys with `cv.has_at_most_one_key(...)` / `cv.has_exactly_one_key(...)`. See how `api` composes `cv.has_exactly_one_key` + `cv.rename_key`.
* **Common Validators:** `cv.int_`, `cv.float_`, `cv.string`, `cv.boolean`, `cv.int_range(min=0, max=100)`, `cv.positive_int`, `cv.percentage`.
* **Complex Validation:** `cv.All(cv.string, cv.Length(min=1, max=50))`, `cv.Any(cv.int_, cv.string)`.
@@ -618,18 +538,6 @@ file does, and it is the authority when they disagree. The most useful starting
* **Testing:**
* **Python:** Run unit tests with `pytest`.
* **C++:** Use `clang-tidy` for static analysis.
* **C++ unit tests:** gtests in `tests/components/<component>/*.cpp`, run with
`script/cpp_unit_test.py <component>`; see `tests/components/README.md`. Set the loop clock in a test
with `LoopBlockingGuard{nullptr, nullptr, now_ms}`; the runner resets it before every test.
* **Integration tests:** `tests/integration/` runs real firmware on the host. Serial components prove
timeouts and recovery with the `uart_mock` fixture (`tests/integration/test_uart_mock_*.py`). Its
`responses` match on content every time they see it; to answer a repeated request differently, use an
`on_tx` lambda with a static counter and `inject_to_rx_buffer` (see `uart_mock_ld2412_requery_after_giveup.yaml`).
* **Keep build-test variants few:** one `test.<platform>.yaml` per platform the code actually differs
on. A variant per board for platform-identical code only adds CI time.
* **A test that needs a shared component in a particular state** (`esp32_ble` security settings, an option
that PSRAM rejects) cannot be grouped: the merged block wins and the whole batch fails. Add the component to
`ISOLATED_COMPONENTS` in `script/analyze_component_buses.py`, or move the option to a `test-<variant>` file.
* **Component Tests:** YAML-based compilation tests are located in `tests/`. The structure is as follows:
```
tests/
@@ -676,7 +584,6 @@ file does, and it is the authority when they disagree. The most useful starting
name: My Sensor
```
Components that define buses directly are flagged as "NEEDS MIGRATION" and cannot be grouped, increasing CI build time.
`!extend` and `!remove` in a `test.*.yaml` also make the component ungroupable; add a standalone entity with its own id instead.
* **Testing All Components Together:** To verify that all components can be tested together without ID conflicts or configuration issues, use:
```bash
+3 -71
View File
@@ -39,17 +39,12 @@ esphome/components/am43/sensor/* @buxtronix
esphome/components/analog_threshold/* @ianchi
esphome/components/animation/* @syndlex
esphome/components/anova/* @buxtronix
esphome/components/apc1/* @ademuri
esphome/components/apc_proteous/* @clydebarrow
esphome/components/apds9306/* @aodrenah
esphome/components/apds9930/* @iyesin
esphome/components/api/* @esphome/core
esphome/components/aqi/* @freekode @jasstrong @ximex
esphome/components/aranet/* @patrickod
esphome/components/as5600/* @ammmze
esphome/components/as5600/sensor/* @ammmze
esphome/components/as7341/* @mrgnr
esphome/components/as734x/* @latonita @mrgnr
esphome/components/async_tcp/* @esphome/core
esphome/components/at581x/* @X-Ryl669
esphome/components/atc_mithermometer/* @ahpohl
@@ -70,7 +65,6 @@ esphome/components/bedjet/climate/* @jhansche
esphome/components/bedjet/fan/* @jhansche
esphome/components/bedjet/sensor/* @javawizard @jhansche
esphome/components/beken_spi_led_strip/* @Mat931
esphome/components/bh1745/* @latonita
esphome/components/bh1750/* @OttoWinter
esphome/components/bh1900nux/* @B48D81EFCC
esphome/components/binary_sensor/* @esphome/core
@@ -106,9 +100,6 @@ esphome/components/bmp581_i2c/* @danielkent-net @kahrendt
esphome/components/bmp581_spi/* @danielkent-net @kahrendt
esphome/components/bp1658cj/* @Cossid
esphome/components/bp5758d/* @Cossid
esphome/components/bq25186/* @Rapsssito
esphome/components/bq27220/* @rggammon
esphome/components/bq76972/* @limpkin
esphome/components/bridge/* @kbx81
esphome/components/bthome_mithermometer/* @nagyrobi
esphome/components/button/* @esphome/core
@@ -157,7 +148,6 @@ esphome/components/delonghi/* @grob6000
esphome/components/dew_point/* @CFlix
esphome/components/dfplayer/* @glmnet
esphome/components/dfrobot_sen0395/* @niklasweber
esphome/components/dfrobot_sen0609/* @remcom
esphome/components/dht/* @OttoWinter
esphome/components/display_menu_base/* @numo68
esphome/components/dlms_meter/* @latonita @PolarGoose @SimonFischer04 @Tomer27cz
@@ -166,10 +156,8 @@ esphome/components/ds1307/* @badbadc0ffee
esphome/components/ds1603l/* @JakeLC15
esphome/components/ds2484/* @mrk-its
esphome/components/ds248x/* @tomwellnitz
esphome/components/ds3231/* @linkedupbits
esphome/components/dsmr/* @glmnet @PolarGoose
esphome/components/duty_time/* @dudanov
esphome/components/ecocomfort2/* @gledian
esphome/components/ee895/* @Stock-M
esphome/components/ektf2232/touchscreen/* @jesserockz
esphome/components/emc2101/* @ellull
@@ -186,7 +174,6 @@ esphome/components/es7243e/* @kbx81
esphome/components/es8156/* @kbx81
esphome/components/es8311/* @kahrendt @kroimon
esphome/components/es8388/* @P4uLT
esphome/components/es9038q2m_katana/* @GioMez
esphome/components/esp32/* @esphome/core
esphome/components/esp32_ble/* @bdraco @jesserockz @Rapsssito
esphome/components/esp32_ble_client/* @bdraco @jesserockz
@@ -196,34 +183,26 @@ esphome/components/esp32_camera_web_server/* @ayufan
esphome/components/esp32_can/* @Sympatron
esphome/components/esp32_hosted/* @swoboda1337
esphome/components/esp32_hosted/update/* @swoboda1337
esphome/components/esp32_power_management/* @rwrozelle
esphome/components/esp32_rmt/* @jesserockz
esphome/components/esp32_rmt_led_strip/* @jesserockz
esphome/components/esp8266/* @esphome/core
esphome/components/esp_ldo/* @clydebarrow
esphome/components/espectre/* @francescopace
esphome/components/esphome/ota/* @esphome/core
esphome/components/espnow/* @jesserockz
esphome/components/espnow/packet_transport/* @EasilyBoredEngineer
esphome/components/ethernet_info/* @gtjadsonsantos
esphome/components/event/* @nohat
esphome/components/exponential_moving_average/* @clydebarrow
esphome/components/exposure_notifications/* @OttoWinter
esphome/components/ezo/* @ssieb
esphome/components/ezo_pmp/* @carlos-sarmiento
esphome/components/ezsp_proxy_tap/* @kbx81 @puddly
esphome/components/factory_reset/* @anatoly-savchenkov
esphome/components/fastled_base/* @OttoWinter
esphome/components/feedback/* @ianchi
esphome/components/file/* @esphome/core
esphome/components/filter_lifetime/* @tuct
esphome/components/fingerprint_grow/* @alexborro @loongyh @OnFreund
esphome/components/font/* @clydebarrow @esphome/core
esphome/components/friedrich/* @rwrozelle
esphome/components/fs3000/* @kahrendt
esphome/components/ft5x06/* @clydebarrow
esphome/components/ft63x6/* @gpambrozio
esphome/components/fusb302b/* @remcom
esphome/components/gcja5/* @gcormier
esphome/components/gdk101/* @Szewcson
esphome/components/gl_r01_i2c/* @pkejval
@@ -245,14 +224,9 @@ esphome/components/gt911/* @clydebarrow @jesserockz
esphome/components/haier/* @paveldn
esphome/components/haier/binary_sensor/* @paveldn
esphome/components/haier/button/* @paveldn
esphome/components/haier/select/* @paveldn
esphome/components/haier/sensor/* @paveldn
esphome/components/haier/switch/* @paveldn
esphome/components/haier/text_sensor/* @paveldn
esphome/components/haier_tundra/* @fauxpark
esphome/components/haier_tundra/button/* @fauxpark
esphome/components/haier_tundra/switch/* @fauxpark
esphome/components/haier_water_heater/* @TheLexus
esphome/components/havells_solar/* @sourabhjaiswal
esphome/components/hbridge/fan/* @WeekendWarrior
esphome/components/hbridge/light/* @DotNetDann
@@ -261,7 +235,6 @@ esphome/components/hc8/* @omartijn
esphome/components/hdc2010/* @optimusprimespace @ssieb
esphome/components/hdc2080/* @G-Pereira @jesserockz
esphome/components/hdc302x/* @joshuasing
esphome/components/hdmi_cec/* @JosVanEijndhoven
esphome/components/he60r/* @clydebarrow
esphome/components/heatpumpir/* @rob-deutsch
esphome/components/hitachi_ac424/* @sourabhjaiswal
@@ -272,11 +245,8 @@ esphome/components/hmac_md5/* @dwmw2
esphome/components/hmac_sha256/* @dwmw2
esphome/components/hoermann_hcp/* @zweckj
esphome/components/homeassistant/* @esphome/core @OttoWinter
esphome/components/homeassistant/button/* @jesserockz
esphome/components/homeassistant/number/* @landonr
esphome/components/homeassistant/select/* @jesserockz
esphome/components/homeassistant/switch/* @Links2004
esphome/components/homeassistant/text/* @jesserockz
esphome/components/honeywell_hih_i2c/* @Benichou34
esphome/components/honeywellabp/* @RubyBailey
esphome/components/honeywellabp2_i2c/* @jpfaff
@@ -288,7 +258,6 @@ esphome/components/http_request/ota/* @oarcher
esphome/components/http_request/update/* @jesserockz
esphome/components/htu31d/* @betterengineering
esphome/components/hub75/* @stuartparmenter
esphome/components/husb238/* @latonita
esphome/components/hydreon_rgxx/* @functionpointer
esphome/components/hyt271/* @Philippe12
esphome/components/i2c/* @esphome/core
@@ -296,9 +265,7 @@ esphome/components/i2c_device/* @gabest11
esphome/components/i2s_audio/* @jesserockz
esphome/components/i2s_audio/microphone/* @jesserockz
esphome/components/i2s_audio/speaker/* @jesserockz @kahrendt
esphome/components/i2s_clockless_led_strip/* @j9brown
esphome/components/iaqcore/* @yozik04
esphome/components/icm20689/* @lboue
esphome/components/icnt86/* @danepowell
esphome/components/ili9xxx/* @clydebarrow @nielsnl68
esphome/components/improv_base/* @esphome/core
@@ -315,7 +282,6 @@ esphome/components/inkplate/* @jesserockz @JosipKuci
esphome/components/integration/* @OttoWinter
esphome/components/internal_temperature/* @Mat931
esphome/components/interval/* @esphome/core
esphome/components/ir_rf_base/* @bdraco @kbx81
esphome/components/ir_rf_proxy/* @kbx81
esphome/components/it8951/* @koosoli @limengdu @Passific
esphome/components/jsn_sr04t/* @Mafus1
@@ -327,11 +293,9 @@ esphome/components/kuntze/* @ssieb
esphome/components/lc709203f/* @ilikecake
esphome/components/lcd_menu/* @numo68
esphome/components/ld2410/* @regevbr @sebcaps
esphome/components/ld2410s/* @NovakIrs
esphome/components/ld2412/* @Rihan9
esphome/components/ld2420/* @descipher
esphome/components/ld2450/* @hareeshmu
esphome/components/ld2460/* @jesusvallejo
esphome/components/ld24xx/* @kbx81
esphome/components/ld6002b/* @hepter
esphome/components/ledc/* @OttoWinter
@@ -340,10 +304,6 @@ esphome/components/libretiny_pwm/* @kuba2k2
esphome/components/light/* @esphome/core
esphome/components/lightwaverf/* @max246
esphome/components/lilygo_t5_47/touchscreen/* @jesserockz
esphome/components/lis2dw12/* @latonita
esphome/components/lis2dw12_i2c/* @latonita
esphome/components/lis2dw12_spi/* @latonita
esphome/components/lis3dh/* @zebble
esphome/components/lm75b/* @beormund
esphome/components/ln882h_ble/* @Bl00d-B0b
esphome/components/ln882h_ble_tracker/* @Bl00d-B0b
@@ -351,7 +311,6 @@ esphome/components/ln882x/* @lamauny
esphome/components/lock/* @esphome/core
esphome/components/logger/* @esphome/core
esphome/components/logger/select/* @clydebarrow
esphome/components/lp5562/* @DennisGaida
esphome/components/lps22/* @nagisa
esphome/components/lsm6ds/* @clydebarrow
esphome/components/ltr390/* @latonita @sjtrny
@@ -362,9 +321,7 @@ esphome/components/m5stack_8angle/* @rnauber
esphome/components/mapping/* @clydebarrow
esphome/components/matrix_keypad/* @ssieb
esphome/components/max17043/* @blacknell
esphome/components/max17048/* @B48D81EFCC
esphome/components/max31865/* @DAVe3283
esphome/components/max31888/* @JiriPrchal
esphome/components/max44009/* @berfenger
esphome/components/max6956/* @looping40
esphome/components/max7219digit/* @rspaargaren
@@ -383,6 +340,7 @@ esphome/components/mcp4461/* @p1ngb4ck
esphome/components/mcp4728/* @berfenger
esphome/components/mcp47a1/* @jesserockz
esphome/components/mcp9600/* @mreditor97
esphome/components/mcp9808/* @k7hpn
esphome/components/md5/* @esphome/core
esphome/components/mdns/* @esphome/core
esphome/components/media_player/* @jesserockz
@@ -391,14 +349,11 @@ esphome/components/micro_wake_word/* @jesserockz @kahrendt
esphome/components/micronova/* @edenhaus @jorre05
esphome/components/microphone/* @jesserockz @kahrendt
esphome/components/mics_4514/* @jesserockz
esphome/components/mics_5524/* @nliaudat
esphome/components/midea/* @dudanov
esphome/components/midea_ir/* @dudanov
esphome/components/midea_portasplit/* @Fexiven
esphome/components/mipi_dsi/* @clydebarrow
esphome/components/mipi_rgb/* @clydebarrow
esphome/components/mipi_spi/* @clydebarrow
esphome/components/mistral_ir/* @lerhum
esphome/components/mitsubishi/* @RubyBailey
esphome/components/mitsubishi_cn105/* @crnjan
esphome/components/mixer/speaker/* @kahrendt
@@ -437,8 +392,6 @@ esphome/components/noblex/* @AGalfra
esphome/components/noise/* @esphome/core
esphome/components/npi19/* @bakerkj
esphome/components/nrf52/* @tomaszduda23
esphome/components/ns2009/* @tchilov
esphome/components/ns2009/touchscreen/* @tchilov
esphome/components/number/* @esphome/core
esphome/components/one_wire/* @ssieb
esphome/components/online_image/* @clydebarrow @guillempages
@@ -449,12 +402,10 @@ esphome/components/ota/* @esphome/core
esphome/components/output/* @esphome/core
esphome/components/packet_transport/* @clydebarrow
esphome/components/pca6416a/* @Mat931
esphome/components/pca9505/* @ajfriesen @ssieb
esphome/components/pca9554/* @bdraco @clydebarrow @hwstar
esphome/components/pcf85063/* @brogon
esphome/components/pcf8563/* @KoenBreeman
esphome/components/pcm5122/* @remcom
esphome/components/pd_pioneer_ir/* @martinsah
esphome/components/pi4ioe5v6408/* @jesserockz
esphome/components/pid/* @OttoWinter
esphome/components/pipsolar/* @andreashergert1984
@@ -473,7 +424,6 @@ esphome/components/pn7160/* @jesserockz @kbx81
esphome/components/pn7160_i2c/* @jesserockz @kbx81
esphome/components/pn7160_spi/* @jesserockz @kbx81
esphome/components/pn71xx/* @jesserockz @kbx81
esphome/components/power_management/* @rwrozelle
esphome/components/power_supply/* @esphome/core
esphome/components/preferences/* @esphome/core
esphome/components/provisioning/* @esphome/core
@@ -494,8 +444,6 @@ esphome/components/rc522/* @glmnet
esphome/components/rc522_i2c/* @glmnet
esphome/components/rc522_spi/* @glmnet
esphome/components/rd03d/* @jasstrong
esphome/components/remko_ar715/* @naKruul
esphome/components/renogy_inverter_ble/* @emilioaray-dev
esphome/components/resampler/speaker/* @kahrendt
esphome/components/restart/* @esphome/core
esphome/components/rf_bridge/* @jesserockz
@@ -513,10 +461,8 @@ esphome/components/rtttl/* @glmnet @ximex
esphome/components/runtime_image/* @clydebarrow @guillempages @kahrendt
esphome/components/runtime_stats/* @bdraco
esphome/components/rx8025t/* @remcom
esphome/components/rx8111/* @techdregs
esphome/components/rx8130/* @beormund
esphome/components/safe_mode/* @jsuanet @kbx81 @paulmonigatti
esphome/components/samsung/* @jorofi
esphome/components/scd4x/* @martgras @sjtrny
esphome/components/script/* @esphome/core
esphome/components/sdl/* @bdm310 @clydebarrow
@@ -545,14 +491,11 @@ esphome/components/sfa30/* @ghsensdev
esphome/components/sfa40/* @NoQuarrel
esphome/components/sgp40/* @SenexCrenshaw
esphome/components/sgp4x/* @martgras @SenexCrenshaw
esphome/components/sh1122_base/* @pl4nkton
esphome/components/sh1122_spi/* @pl4nkton
esphome/components/sha256/* @esphome/core
esphome/components/shelly_dimmer/* @edge90 @rnauber
esphome/components/sht3xd/* @mrtoy-me
esphome/components/sht4x/* @sjtrny
esphome/components/shutdown/* @esphome/core @jsuanet
esphome/components/siemens_ira211/* @fonix232
esphome/components/sigma_delta_output/* @Cat-Ion
esphome/components/sim800l/* @glmnet
esphome/components/sm10bit_base/* @Cossid
@@ -569,7 +512,6 @@ esphome/components/sound_level/* @kahrendt
esphome/components/spa06_base/* @danielkent-net
esphome/components/spa06_i2c/* @danielkent-net
esphome/components/spa06_spi/* @danielkent-net
esphome/components/spd2010/* @grischard
esphome/components/speaker/* @jesserockz @kahrendt
esphome/components/speaker/media_player/* @kahrendt @synesthesiam
esphome/components/speaker_source/* @kahrendt
@@ -599,7 +541,6 @@ esphome/components/st7735/* @SenexCrenshaw
esphome/components/st7789v/* @kbx81
esphome/components/st7920/* @marsjan155
esphome/components/statsd/* @Links2004
esphome/components/stcc4/* @j9brown
esphome/components/stts22h/* @B48D81EFCC
esphome/components/substitutions/* @esphome/core
esphome/components/sun/* @OttoWinter
@@ -613,15 +554,12 @@ esphome/components/syslog/* @clydebarrow
esphome/components/systa_bus/* @Mat931
esphome/components/t6615/* @tylermenezes
esphome/components/tas2780/* @remcom
esphome/components/tas58xx/* @mrtoy-me @remcom
esphome/components/tc74/* @sethgirvan
esphome/components/tca8418/* @zebble
esphome/components/tca9548a/* @andreashergert1984
esphome/components/tca9555/* @mobrembski
esphome/components/tcl112/* @glmnet
esphome/components/tcp_uart/* @Bascht74
esphome/components/tee501/* @Stock-M
esphome/components/teleinfo/* @0hax @FredM67
esphome/components/teleinfo/* @0hax
esphome/components/tem3200/* @bakerkj
esphome/components/template/alarm_control_panel/* @grahambrown11 @hwstar
esphome/components/template/datetime/* @rfdarter
@@ -633,15 +571,12 @@ esphome/components/thermopro_ble/* @sittner
esphome/components/thermostat/* @kbx81
esphome/components/time/* @esphome/core
esphome/components/tinyusb/* @kbx81
esphome/components/tinyusb_keyboard/* @frederikbolding
esphome/components/tlc5947/* @rnauber
esphome/components/tlc5971/* @IJIJI
esphome/components/tm1621/* @Philippe12
esphome/components/tm1637/* @glmnet
esphome/components/tm1638/* @skykingjwc
esphome/components/tm1651/* @mrtoy-me
esphome/components/tmc2209/* @remcom
esphome/components/tmc22xx/* @remcom
esphome/components/tmp102/* @timsavage
esphome/components/tmp1075/* @sybrenstuvel
esphome/components/tmp117/* @Azimath
@@ -664,13 +599,11 @@ esphome/components/uart/button/* @ssieb
esphome/components/uart/event/* @eoasmxd
esphome/components/uart/packet_transport/* @clydebarrow
esphome/components/uart_mux/* @kbx81
esphome/components/uart_tcp/* @Bascht74
esphome/components/udp/* @clydebarrow
esphome/components/ufire_ec/* @pvizeli
esphome/components/ufire_ise/* @pvizeli
esphome/components/ufm01/* @ljungqvist
esphome/components/ultrasonic/* @ssieb @swoboda1337
esphome/components/unicode/* @esphome/core
esphome/components/update/* @jesserockz
esphome/components/uponor_smatrix/* @kroimon
esphome/components/usb_cdc_acm/* @kbx81
@@ -693,7 +626,7 @@ esphome/components/web_server_idf/* @dentra
esphome/components/weikai/* @DrCoolZic
esphome/components/weikai_i2c/* @DrCoolZic
esphome/components/weikai_spi/* @DrCoolZic
esphome/components/whirlpool/* @arpena @glmnet
esphome/components/whirlpool/* @glmnet
esphome/components/whynter/* @aeonsablaze
esphome/components/wiegand/* @ssieb
esphome/components/wireguard/* @droscy @lhoracek @thomas0bernard
@@ -714,7 +647,6 @@ esphome/components/xiaomi_body_scale/* @dckiller51
esphome/components/xiaomi_hhccjcy10/* @fariouche
esphome/components/xiaomi_lywsd02mmc/* @juanluss31
esphome/components/xiaomi_lywsd03mmc/* @ahpohl
esphome/components/xiaomi_mccgq02hl/* @ahpohl @morph027
esphome/components/xiaomi_mhoc303/* @drug123
esphome/components/xiaomi_mhoc401/* @vevsvevs
esphome/components/xiaomi_rtcgq02lm/* @jesserockz
+1 -1
View File
@@ -48,7 +48,7 @@ PROJECT_NAME = ESPHome
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = 2026.11.0-dev
PROJECT_NUMBER = 2026.10.0-dev
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
+1 -1
View File
@@ -22,7 +22,7 @@ RUN \
-r /requirements.txt
# Install the ESPHome Device Builder dashboard.
RUN uv pip install --no-cache-dir esphome-device-builder==1.24.0
RUN uv pip install --no-cache-dir esphome-device-builder==1.17.0
RUN \
platformio settings set enable_telemetry No \
+2 -6
View File
@@ -21,14 +21,10 @@ export PLATFORMIO_PLATFORMS_DIR="${pio_cache_base}/platforms"
export PLATFORMIO_PACKAGES_DIR="${pio_cache_base}/packages"
export PLATFORMIO_CACHE_DIR="${pio_cache_base}/cache"
# Keep the native toolchain installs and compiler caches on the persistent
# cache root, not the container's user cache dir: it is lost on every
# restart, and not writable when the container runs as a non-root user.
# Keep the native toolchain installs on the persistent cache root, not the
# container's ephemeral user cache dir (re-downloaded on every restart).
export ESPHOME_ESP_IDF_PREFIX="$(dirname "${pio_cache_base}")/idf"
export ESPHOME_SDK_NRF_PREFIX="$(dirname "${pio_cache_base}")/sdk-nrf"
export ESPHOME_ARDUINO8266_PREFIX="$(dirname "${pio_cache_base}")/arduino8266"
export ESPHOME_HOST_PREFIX="$(dirname "${pio_cache_base}")/host"
export ESPHOME_PLATFORMIO_CCACHE_DIR="$(dirname "${pio_cache_base}")/platformio-ccache"
# If /build is mounted, use that as the build path
# otherwise use path in /config (so that builds aren't lost on container restart)
@@ -15,14 +15,10 @@ export PLATFORMIO_PLATFORMS_DIR="${pio_cache_base}/platforms"
export PLATFORMIO_PACKAGES_DIR="${pio_cache_base}/packages"
export PLATFORMIO_CACHE_DIR="${pio_cache_base}/cache"
# Keep the native toolchain installs and compiler caches on the persistent
# /data volume, not the container's ephemeral user cache dir (wiped on every
# add-on update/restart).
# Keep the native toolchain installs on the persistent /data volume, not the
# container's ephemeral user cache dir (wiped on every add-on update/restart).
export ESPHOME_ESP_IDF_PREFIX=/data/cache/idf
export ESPHOME_SDK_NRF_PREFIX=/data/cache/sdk-nrf
export ESPHOME_ARDUINO8266_PREFIX=/data/cache/arduino8266
export ESPHOME_HOST_PREFIX=/data/cache/host
export ESPHOME_PLATFORMIO_CCACHE_DIR=/data/cache/platformio-ccache
if bashio::config.true 'leave_front_door_open'; then
export DISABLE_HA_AUTHENTICATION=true
-2
View File
@@ -3,7 +3,5 @@ esphome:
esp8266:
board: d1_mini
# The PlatformIO path stays covered whatever the default is
toolchain: platformio
logger:
+192 -277
View File
@@ -7,7 +7,6 @@ import importlib
import logging
import os
from pathlib import Path
import platform
import re
import sys
import time
@@ -19,6 +18,7 @@ from typing import TYPE_CHECKING, Protocol
from esphome import const, platform_hooks
from esphome.build_helpers.native import analysis_backend, native_backend
from esphome.const import (
ALLOWED_NAME_CHARS,
ARGUMENT_HELP_DEVICE,
BUNDLE_EXTENSION,
CONF_API,
@@ -36,6 +36,7 @@ from esphome.const import (
CONF_LOGGER,
CONF_MDNS,
CONF_MQTT,
CONF_NAME,
CONF_NAME_ADD_MAC_SUFFIX,
CONF_OTA,
CONF_PASSWORD,
@@ -48,24 +49,19 @@ from esphome.const import (
CONF_WEB_SERVER,
CONF_WIFI,
ENV_NOGITIGNORE,
KEY_CORE,
KEY_ESP32,
KEY_TARGET_PLATFORM,
KEY_VARIANT,
PLATFORM_HOST,
SECRETS_FILES,
ErrorFormat,
Toolchain,
)
from esphome.core import CORE, EsphomeError, coroutine
from esphome.enum import StrEnum
from esphome.helpers import IS_MACOS, get_bool_env, indent, is_ip_address
from esphome.helpers import get_bool_env, indent, is_ip_address
from esphome.log import AnsiFore, color, setup_log
from esphome.stacktrace import LogLineProcessor
from esphome.types import ConfigType
from esphome.upload_targets import PortType, get_port_type
from esphome.util import (
ESPHOME_COMMAND,
PICOTOOL_PACKAGE,
FlashImage,
detect_rp2040_bootsel,
@@ -73,7 +69,6 @@ from esphome.util import (
get_serial_ports,
is_picotool_usb_permission_error,
list_yaml_files,
read_secret_line,
run_external_command,
run_external_process,
safe_print,
@@ -90,6 +85,7 @@ if TYPE_CHECKING:
_LOGGER = logging.getLogger(__name__)
ESPHOME_COMMAND = [sys.executable, "-m", "esphome"]
# Maximum buffer size for serial log reading to prevent unbounded memory growth
SERIAL_BUFFER_MAX_SIZE = 65536
@@ -154,7 +150,6 @@ class ArgsProtocol(Protocol):
file: str | None
no_logs: bool
only_generate: bool
skip_bootloader: bool
show_secrets: bool
dashboard: bool
configuration: str
@@ -483,9 +478,12 @@ def has_ota() -> bool:
def has_native_ota() -> bool:
"""Check if native API OTA upload is available (``platform: esphome``)."""
from esphome.espota2 import esphome_ota_items
return bool(esphome_ota_items(CORE.config))
if CONF_OTA not in CORE.config:
return False
return any(
ota_item.get(CONF_PLATFORM) == CONF_ESPHOME
for ota_item in CORE.config[CONF_OTA]
)
def has_web_server_ota() -> bool:
@@ -831,14 +829,6 @@ def write_cpp_file() -> int:
def compile_program(args: ArgsProtocol, config: ConfigType) -> int:
if CORE.skip_bootloader and not (CORE.is_esp32 and CORE.using_toolchain_esp_idf):
# Debug only: an orchestrator cannot see YAML toolchain overrides,
# so this is its expected no-op, and a full build is safe.
_LOGGER.debug(
"--skip-bootloader ignored: only supported on ESP32 with the "
"esp-idf toolchain"
)
CORE.skip_bootloader = False
# Keep this gate here, NOT in config validation: device-builder needs
# `esphome config` to keep succeeding with placeholders so onboarding can run.
if CONF_WIFI in config:
@@ -848,7 +838,7 @@ def compile_program(args: ArgsProtocol, config: ConfigType) -> int:
# Keep this here, NOT in codegen: config-hash and --only-generate must keep
# working on machines that cannot run the toolchain.
if CORE.is_esp8266 and CORE.using_toolchain_platformio:
if CORE.is_esp8266:
from esphome.components.esp8266 import check_rosetta
check_rosetta()
@@ -869,10 +859,7 @@ def compile_program(args: ArgsProtocol, config: ConfigType) -> int:
return rc
# Create factory.bin, ota.bin, and firmware.elf copy
if not toolchain.create_factory_bin():
# A build whose factory image could not be produced must not
# exit 0; downloads would serve an image from an older build.
return 1
toolchain.create_factory_bin()
toolchain.create_ota_bin()
toolchain.create_elf_copy()
from esphome.build_helpers.idedata import warn_if_idedata_missing
@@ -990,9 +977,8 @@ def upload_using_esptool(
# and partitions included where the target needs them)
image = native.get_factory_firmware_path()
if not image.is_file():
hint = getattr(native, "missing_image_hint", lambda: None)()
raise EsphomeError(
hint or f"{image} does not exist; compile the configuration first"
f"{image} does not exist; compile the configuration first"
)
flash_images = [FlashImage(path=image, offset="0x0")]
else:
@@ -1233,28 +1219,14 @@ def upload_program(
config: ConfigType, args: ArgsProtocol, devices: list[str]
) -> tuple[int, str | None]:
host = devices[0]
port_type = get_port_type(host)
ota_key = getattr(args, "ota_key", None)
if ota_key and port_type in (PortType.SERIAL, PortType.BOOTSEL):
_LOGGER.warning(
"The presented OTA key only applies to network uploads; ignored for %s",
host,
)
platform_upload = platform_hooks.get_platform_hook(
CORE.target_platform, "upload_program"
)
if platform_upload is not None and platform_upload(config, args, host):
if ota_key and port_type not in (PortType.SERIAL, PortType.BOOTSEL):
# A platform's own network path (nrf52 mcumgr) has no key handshake
_LOGGER.warning(
"The presented OTA key only applies to the %s OTA platform; "
"ignored for %s",
CONF_ESPHOME,
host,
)
return 0, host
port_type = get_port_type(host)
# MQTT and MQTTIP are also OTA paths; MQTTIP gets resolved to a real IP later by
# _resolve_network_devices(). Only SERIAL and BOOTSEL are non-OTA upload paths.
is_partition_table = getattr(args, "partition_table", False)
@@ -1297,8 +1269,6 @@ def upload_program(
network_devices = _resolve_network_devices(devices, config, args)
if chosen_platform == CONF_WEB_SERVER:
if ota_key:
raise EsphomeError(OTA_KEY_PLATFORM_ERROR)
if is_partition_table or is_bootloader:
raise EsphomeError(
f"{option_string} is only supported with the esphome OTA platform; "
@@ -1312,17 +1282,6 @@ def upload_program(
return _upload_via_native_api(config, network_devices, args)
def _ota_upload_platforms(config: ConfigType) -> dict[str, None]:
"""The network OTA platforms the config provides, one entry each, in
config order; the web_server final-validate hook merges duplicates."""
return {
ota_platform: None
for ota_item in config.get(CONF_OTA, [])
if (ota_platform := ota_item.get(CONF_PLATFORM))
in (CONF_ESPHOME, CONF_WEB_SERVER)
}
def _choose_ota_platform(config: ConfigType, requested: str | None) -> str:
"""Pick the OTA platform to use, optionally honoring ``--ota-platform``.
@@ -1330,12 +1289,22 @@ def _choose_ota_platform(config: ConfigType, requested: str | None) -> str:
The native API uses challenge-response auth with MD5/SHA256 hashing of a
server-issued nonce, so the password is never sent over the wire; the
``web_server`` path uses HTTP Basic auth which transmits credentials in
cleartext over the LAN. (The native path also compresses the upload:
gzip on ESP8266 and RP2040, which inflate it at reboot, and a deflate
stream on ESP32/LibreTiny, which inflate it as it arrives.) Falls back to
cleartext over the LAN. (The native path also supports gzip compression
on ESP8266, where flash space is tight; on ESP32/RP2040/LibreTiny the
backend reports ``supports_compression() == false`` and the firmware is
sent uncompressed regardless of which platform is used.) Falls back to
``web_server`` only when that is the only available platform.
"""
available = _ota_upload_platforms(config)
# Use a dict (insertion-ordered) instead of a list so error messages and
# membership checks see one entry per platform even if the user has
# multiple ``ota:`` items of the same platform; the web_server OTA
# platform's final-validate hook merges duplicates anyway.
available: dict[str, None] = {}
for ota_item in config.get(CONF_OTA, []):
platform = ota_item.get(CONF_PLATFORM)
if platform in (CONF_ESPHOME, CONF_WEB_SERVER):
available[platform] = None
if not available:
raise EsphomeError(
f"Cannot upload Over the Air as the {CONF_OTA} configuration is not "
@@ -1356,17 +1325,14 @@ def _choose_ota_platform(config: ConfigType, requested: str | None) -> str:
return CONF_WEB_SERVER
def _esphome_ota_conf(config: ConfigType) -> ConfigType | None:
"""The validated esphome OTA platform block, if configured."""
from esphome.espota2 import esphome_ota_items
return next(iter(esphome_ota_items(config)), None)
def _upload_via_native_api(
config: ConfigType, network_devices: list[str], args: ArgsProtocol
) -> tuple[int, str | None]:
ota_conf = _esphome_ota_conf(config) or {}
ota_conf: ConfigType = {}
for ota_item in config.get(CONF_OTA, []):
if ota_item.get(CONF_PLATFORM) == CONF_ESPHOME:
ota_conf = ota_item
break
from esphome import espota2
from esphome.components.noise import static_encryption_key
@@ -1376,15 +1342,9 @@ def _upload_via_native_api(
# Fail closed: an encryption block whose key did not resolve must never
# fall back to a plaintext upload
noise_psk = None
old_noise_psk = None
plaintext_fallback = False
allow_plaintext_upload = False
if ota_key := getattr(args, "ota_key", None):
# The user presents a key the device still runs instead of the
# configured one (a key change in progress); an explicit key never
# downgrades to plaintext
noise_psk = ota_key
elif (encryption_conf := ota_conf.get(CONF_ENCRYPTION)) is not None:
if (encryption_conf := ota_conf.get(CONF_ENCRYPTION)) is not None:
noise_psk = encryption_conf.get(CONF_KEY)
allow_plaintext_upload = bool(
encryption_conf.get(espota2.CONF_ALLOW_PLAINTEXT_UPLOAD)
@@ -1397,8 +1357,6 @@ def _upload_via_native_api(
# Ensure the key is a string, as required by the underlying OTA implementation.
# It arrives here as a SensitiveStr which aioesphomeapi rejects.
noise_psk = str(noise_psk)
if old_key := encryption_conf.get(espota2.CONF_OLD_KEY):
old_noise_psk = str(old_key)
elif api_key := static_encryption_key(config.get(CONF_API) or {}):
# Remove before 2027.3.0: the api key is tried, falling back to plaintext
noise_psk = str(api_key)
@@ -1423,12 +1381,6 @@ def _upload_via_native_api(
ota_type = espota2.OTA_TYPE_UPDATE_PARTITION_TABLE
elif getattr(args, "bootloader", False):
check_partition_access("--bootloader")
if (
getattr(args, "file", None) is None
and (native := native_backend())
and (hint := getattr(native, "missing_image_hint", lambda: None)())
):
raise EsphomeError(hint)
binary = CORE.bootloader_bin
ota_type = espota2.OTA_TYPE_UPDATE_BOOTLOADER
if getattr(args, "file", None) is not None:
@@ -1448,30 +1400,19 @@ def _upload_via_native_api(
noise_psk,
plaintext_fallback=plaintext_fallback,
allow_plaintext_upload=allow_plaintext_upload,
old_noise_psk=old_noise_psk,
)
def _old_key_notice(config: ConfigType) -> None:
"""After `run`, whose image was just built from this config; a plain
`upload` may send a stale image that still carries the previous key."""
from esphome import espota2
for item in espota2.esphome_ota_items(config):
if (item.get(CONF_ENCRYPTION) or {}).get(espota2.CONF_OLD_KEY):
_LOGGER.warning(espota2.OLD_KEY_REMOVE_NOTICE)
def _upload_via_web_server(
config: ConfigType, network_devices: list[str], binary: Path
) -> tuple[int, str | None]:
from esphome import web_server_ota
from esphome.espota2 import esphome_ota_items
from esphome.web_server_helpers import get_web_server_connection
if any(
ota_item.get(CONF_ENCRYPTION) is not None
for ota_item in esphome_ota_items(config)
ota_item.get(CONF_PLATFORM) == CONF_ESPHOME
and ota_item.get(CONF_ENCRYPTION) is not None
for ota_item in config.get(CONF_OTA, [])
):
_LOGGER.warning(
"This config has OTA encryption, but the web_server OTA path sends "
@@ -1779,60 +1720,7 @@ def command_compile(args: ArgsProtocol, config: ConfigType) -> int | None:
return 0
ENV_OTA_KEY = "ESPHOME_OTA_KEY"
OTA_KEY_PLATFORM_ERROR = (
f"--prompt-ota-key and {ENV_OTA_KEY} only apply to the {CONF_ESPHOME} OTA "
"platform; to flash by serial instead, name the port with --device"
)
def _read_ota_key(args: ArgsProtocol, config: ConfigType) -> None:
"""Take the key to present to the device for this upload, from the
prompt or from ESPHOME_OTA_KEY, before any compile so the prompt is
not buried in build output."""
prompt = getattr(args, "prompt_ota_key", False)
env_key = getattr(args, "env_ota_key", None)
if not prompt and env_key is None:
return
if CORE.data.get(KEY_CORE, {}).get(KEY_TARGET_PLATFORM) == PLATFORM_HOST:
_LOGGER.warning("A host program runs locally; the presented OTA key is ignored")
return
# The HTTP path has no key handshake; decide before prompting or
# compiling. A serial target is a serial flash: the key is not even
# asked for, and --ota-platform means nothing to it. Every entry must
# be serial: a missing port is skipped and the next entry may be a host
devices = getattr(args, "device", None) or []
serial_target = bool(devices) and all(
device == "SERIAL"
or get_port_type(device) in (PortType.SERIAL, PortType.BOOTSEL)
for device in devices
)
chosen = (
_choose_ota_platform(config, getattr(args, "ota_platform", None))
if not serial_target and _ota_upload_platforms(config)
else None
)
if chosen == CONF_WEB_SERVER:
raise EsphomeError(OTA_KEY_PLATFORM_ERROR)
from esphome.components.noise import validate_encryption_key
from esphome.config_validation import Invalid
if serial_target:
_LOGGER.warning(
"The presented OTA key only applies to network uploads; ignored for %s",
", ".join(devices),
)
return
key = read_secret_line("OTA encryption key: ") if prompt else env_key
try:
validate_encryption_key(key)
except Invalid as err:
raise EsphomeError(f"Invalid OTA encryption key: {err}") from err
args.ota_key = key
def command_upload(args: ArgsProtocol, config: ConfigType) -> int | None:
_read_ota_key(args, config)
# Get devices, resolving special identifiers like OTA
devices = choose_upload_log_host(
default=args.device,
@@ -1868,19 +1756,6 @@ def command_logs(args: ArgsProtocol, config: ConfigType) -> int | None:
def command_run(args: ArgsProtocol, config: ConfigType) -> int | None:
if (
CORE.skip_bootloader
and CORE.is_esp32
and CORE.using_toolchain_esp_idf
and any(
get_port_type(device) == PortType.SERIAL for device in (args.device or [])
)
):
# Fail before the compile: the result could never flash over serial.
# Elsewhere the flag is ignored, so serial stays fine there.
_LOGGER.error("--skip-bootloader builds cannot be flashed over serial")
return 1
_read_ota_key(args, config)
exit_code = write_cpp(config)
if exit_code != 0:
return exit_code
@@ -1906,7 +1781,6 @@ def command_run(args: ArgsProtocol, config: ConfigType) -> int | None:
exit_code, successful_device = upload_program(config, args, devices)
if exit_code == 0:
_LOGGER.info("Successfully uploaded program.")
_old_key_notice(config)
else:
_LOGGER.warning("Failed to upload to %s", devices)
return exit_code
@@ -2043,10 +1917,7 @@ def run_multiple_configs(
safe_print()
cmd = command_builder(f)
# The parent already logged the Intel macOS warning; children skip it.
rc = run_external_process(
*cmd, env={**os.environ, _INTEL_MACOS_WARNED_ENV: "1"}
)
rc = run_external_process(*cmd)
if rc == 0:
print_bar(f"[{color(AnsiFore.BOLD_GREEN, 'SUCCESS')}] {str(f)}")
@@ -2233,9 +2104,155 @@ def command_analyze_memory(args: ArgsProtocol, config: ConfigType) -> int:
def command_rename(args: ArgsProtocol, config: ConfigType) -> int | None:
from esphome.cli.rename import command_rename as run
from esphome import yaml_util
return run(args, config)
new_name = args.name
for c in new_name:
if c not in ALLOWED_NAME_CHARS:
safe_print(
color(
AnsiFore.BOLD_RED,
f"'{c}' is an invalid character for names. Valid characters are: "
f"{ALLOWED_NAME_CHARS} (lowercase, no spaces)",
)
)
return 1
# Load existing yaml file
raw_contents = CORE.config_path.read_text(encoding="utf-8")
yaml = yaml_util.load_yaml(CORE.config_path)
if CONF_ESPHOME not in yaml or CONF_NAME not in yaml[CONF_ESPHOME]:
safe_print(
color(
AnsiFore.BOLD_RED, "Complex YAML files cannot be automatically renamed."
)
)
return 1
old_name = yaml[CONF_ESPHOME][CONF_NAME]
match = re.match(r"^\$\{?([a-zA-Z0-9_]+)\}?$", old_name)
if match is None:
# Only swap the ``name:`` line that sits directly under the
# top-level ``esphome:`` block. A naked ``re.sub`` would
# also clobber any other ``name:`` line whose value happens
# to match (e.g. a sensor / output / wifi entry sharing the
# device's hostname), silently rewriting unrelated user
# configuration. The pattern anchors:
# - at the start of the line so ``friendly_name:``,
# ``device_name:`` etc. don't match the trailing ``name:``
# substring; and
# - at the end of the value (lookahead for whitespace +
# comment + EOL) so ``old_name`` doesn't match as a
# prefix of a longer value (``kitchen`` vs ``kitchen2``).
name_pattern = re.compile(
rf"^(\s*)name:\s+[\"']?{re.escape(old_name)}[\"']?(?=\s*(?:#|$))"
)
out_lines: list[str] = []
in_esphome_block = False
for line in raw_contents.splitlines(keepends=True):
if line and not line[0].isspace() and line.strip():
in_esphome_block = line.lstrip().startswith("esphome:")
out_lines.append(line)
continue
if in_esphome_block:
line = name_pattern.sub(rf'\1name: "{new_name}"', line, count=1)
out_lines.append(line)
new_raw = "".join(out_lines)
else:
old_name = yaml[CONF_SUBSTITUTIONS][match.group(1)]
if (
len(
re.findall(
rf"^\s+{match.group(1)}:\s+[\"']?{old_name}[\"']?",
raw_contents,
flags=re.MULTILINE,
)
)
> 1
):
safe_print(
color(AnsiFore.BOLD_RED, "Too many matches in YAML to safely rename")
)
return 1
new_raw = re.sub(
rf"^(\s+{match.group(1)}):\s+[\"']?{old_name}[\"']?",
f'\\1: "{new_name}"',
raw_contents,
flags=re.MULTILINE,
)
# ``new_name == old_name`` (after substitution resolution) is
# a no-op rewrite that would still queue a pointless re-flash.
# Catch it before the path-equality check below — covers the
# case where the config filename doesn't match the device name
# (e.g. ``weird-file.yaml`` whose ``esphome.name`` is
# ``kitchen``; running ``esphome rename weird-file.yaml kitchen``
# would otherwise just re-flash the same hostname).
if new_name == old_name:
safe_print(
color(
AnsiFore.BOLD_RED,
f"'{new_name}' is already the device's name.",
)
)
return 1
new_path: Path = CORE.config_dir / (new_name + ".yaml")
if new_path.resolve() == CORE.config_path.resolve():
safe_print(
color(
AnsiFore.BOLD_RED,
f"'{new_name}' is already the device's name.",
)
)
return 1
if new_path.exists():
safe_print(
color(
AnsiFore.BOLD_RED,
f"Cannot rename: {new_path} already exists. "
"Refusing to overwrite an existing configuration.",
)
)
return 1
safe_print(
f"Updating {color(AnsiFore.CYAN, str(CORE.config_path))} to {color(AnsiFore.CYAN, str(new_path))}"
)
print()
new_path.write_text(new_raw, encoding="utf-8")
rc = run_external_process(*ESPHOME_COMMAND, "config", str(new_path))
if rc != 0:
safe_print(color(AnsiFore.BOLD_RED, "Rename failed. Reverting changes."))
new_path.unlink()
return 1
cli_args = [
"run",
str(new_path),
"--no-logs",
"--device",
CORE.address,
]
if args.dashboard:
cli_args.insert(0, "--dashboard")
try:
rc = run_external_process(*ESPHOME_COMMAND, *cli_args)
except KeyboardInterrupt:
rc = 1
if rc != 0:
new_path.unlink()
return 1
if CORE.config_path != new_path:
CORE.config_path.unlink()
safe_print(color(AnsiFore.BOLD_GREEN, "SUCCESS"))
print()
return 0
PRE_CONFIG_ACTIONS = {
@@ -2270,15 +2287,6 @@ SIMPLE_CONFIG_ACTIONS = [
]
def _add_skip_bootloader_arg(parser: argparse.ArgumentParser) -> None:
parser.add_argument(
"--skip-bootloader",
help="Do not build the bootloader or the factory image; "
"the result can only be flashed over OTA.",
action="store_true",
)
def _add_states_args(parser: argparse.ArgumentParser) -> None:
"""Add mutually exclusive ``--states``/``--no-states`` flags to a parser.
@@ -2302,25 +2310,6 @@ def _add_states_args(parser: argparse.ArgumentParser) -> None:
)
def _error_format(value: str) -> ErrorFormat:
try:
return ErrorFormat(value.lower())
except ValueError:
choices = ", ".join(ErrorFormat)
raise argparse.ArgumentTypeError(
f"invalid choice: '{value}' (choose from {choices})"
) from None
ARGUMENT_HELP_PROMPT_OTA_KEY = (
"Ask for the OTA encryption key to present to the device instead of using "
"the one in the configuration, for a device that still runs a previous key. "
"The key is read without echo, or as one line from stdin when that is not "
"a terminal; it is never taken from the command line. A calling program "
f"can hand the key over in the {ENV_OTA_KEY} environment variable instead."
)
def parse_args(argv):
options_parser = argparse.ArgumentParser(add_help=False)
options_parser.add_argument(
@@ -2378,19 +2367,7 @@ def parse_args(argv):
metavar="{" + ",".join(t.value for t in Toolchain) + "}",
help=(
"Select toolchain for compiling. Overrides '<platform>.toolchain' in YAML. "
"Default: the platform's native toolchain where it has one, else "
f"{Toolchain.PLATFORMIO.value}."
),
)
options_parser.add_argument(
"--error-format",
type=_error_format,
metavar="{" + ",".join(f.value for f in ErrorFormat) + "}",
help=(
"How configuration errors are shown. 'yaml' shows them inside the "
"failing YAML; 'line' prints one 'file:line:column: error: message' "
"line per error. Default: $ESPHOME_ERROR_FORMAT, else 'yaml'."
f"Default: {Toolchain.PLATFORMIO.value}."
),
)
@@ -2450,7 +2427,6 @@ def parse_args(argv):
help="Only generate source code, do not compile.",
action="store_true",
)
_add_skip_bootloader_arg(parser_compile)
parser_upload = subparsers.add_parser(
"upload",
@@ -2489,11 +2465,6 @@ def parse_args(argv):
help="Upload as partition table (OTA).",
action="store_true",
)
parser_upload.add_argument(
"--prompt-ota-key",
action="store_true",
help=ARGUMENT_HELP_PROMPT_OTA_KEY,
)
parser_upload.add_argument(
"--bootloader",
help="Upload as bootloader (OTA).",
@@ -2519,7 +2490,7 @@ def parse_args(argv):
"-r",
action="store_true",
help="Reset the device before starting serial logs.",
default=get_bool_env("ESPHOME_SERIAL_LOGGING_RESET"),
default=os.getenv("ESPHOME_SERIAL_LOGGING_RESET"),
)
_add_states_args(parser_logs)
@@ -2552,7 +2523,6 @@ def parse_args(argv):
parser_run.add_argument(
"--no-logs", help="Disable starting logs.", action="store_true"
)
_add_skip_bootloader_arg(parser_run)
_add_states_args(parser_run)
@@ -2561,7 +2531,7 @@ def parse_args(argv):
"-r",
action="store_true",
help="Reset the device before starting serial logs.",
default=get_bool_env("ESPHOME_SERIAL_LOGGING_RESET"),
default=os.getenv("ESPHOME_SERIAL_LOGGING_RESET"),
)
parser_run.add_argument(
"--ota-platform",
@@ -2574,11 +2544,6 @@ def parse_args(argv):
"(HTTP Basic auth) when that is the only configured platform."
),
)
parser_run.add_argument(
"--prompt-ota-key",
action="store_true",
help=ARGUMENT_HELP_PROMPT_OTA_KEY,
)
parser_clean = subparsers.add_parser(
"clean-mqtt",
@@ -2707,18 +2672,9 @@ def parse_args(argv):
args, unknown_args = parser.parse_known_args(arguments)
if unknown_args:
_LOGGER.warning("Ignored unrecognized arguments: %s", unknown_args)
else:
args = parser.parse_args(arguments)
return args
# Read here rather than as the option default, so a bad value is reported
# against the environment variable instead of --error-format
if args.error_format is None:
env_value = os.getenv("ESPHOME_ERROR_FORMAT", ErrorFormat.YAML.value)
try:
args.error_format = _error_format(env_value)
except argparse.ArgumentTypeError as err:
parser.error(f"ESPHOME_ERROR_FORMAT: {err}")
return args
return parser.parse_args(arguments)
def _warn_if_source_tree_mismatch() -> None:
@@ -2764,34 +2720,12 @@ def _warn_if_source_tree_mismatch() -> None:
)
_INTEL_MACOS_REMOVAL = "2027.6.0"
_INTEL_MACOS_WARNED_ENV = "ESPHOME_INTEL_MACOS_WARNED"
def _warn_if_intel_macos() -> None:
"""Warn that Intel (x86_64) Python on macOS loses support by _INTEL_MACOS_REMOVAL."""
if (
not IS_MACOS
or platform.machine() != "x86_64"
or _INTEL_MACOS_WARNED_ENV in os.environ
):
return
_LOGGER.warning(
"Support for Intel Macs will end in ESPHome %s or earlier. The Python "
"packages ESPHome depends on have stopped publishing Intel macOS builds, "
"so future releases will not install on this machine. On an Apple "
"Silicon Mac, switch to a native arm64 Python.",
_INTEL_MACOS_REMOVAL,
)
def run_esphome(argv):
from esphome.address_cache import AddressCache
args = parse_args(argv)
CORE.dashboard = args.dashboard
CORE.testing_mode = args.testing_mode
CORE.error_format = args.error_format
# Create address cache from command-line arguments
CORE.address_cache = AddressCache.from_cli_args(
@@ -2804,25 +2738,7 @@ def run_esphome(argv):
args.log_level = "CRITICAL"
setup_log(log_level=args.log_level)
# Taken out of the environment before any command runs, so no build
# tool inherits a key a calling program handed over
args.env_ota_key = os.environ.pop(ENV_OTA_KEY, None)
if args.command in ("upload", "run"):
# One key is one device's; several configs run in child processes
# that would never see it
if (args.env_ota_key is not None or args.prompt_ota_key) and len(
args.configuration
) > 1:
raise EsphomeError(
f"--prompt-ota-key and {ENV_OTA_KEY} take one configuration; "
f"{len(args.configuration)} were given"
)
elif args.env_ota_key is not None:
_LOGGER.warning(
"%s is set but the %s command does not use it", ENV_OTA_KEY, args.command
)
_warn_if_source_tree_mismatch()
_warn_if_intel_macos()
if args.command in PRE_CONFIG_ACTIONS:
try:
@@ -2866,7 +2782,6 @@ def run_esphome(argv):
CORE.config_path = conf_path
CORE.dashboard = args.dashboard
CORE.skip_bootloader = getattr(args, "skip_bootloader", False)
if args.toolchain is not None:
# CLI toolchain wins over esp32.toolchain in YAML.
CORE.toolchain = args.toolchain
+2 -9
View File
@@ -148,13 +148,6 @@ class AddressCache:
continue
hostname, ips = arg.split("=", 1)
# Normalize hostname for consistent lookups
normalized = normalize_hostname(hostname.strip())
addresses = [ip for value in ips.split(",") if (ip := value.strip())]
if not normalized or not addresses:
_LOGGER.warning(
"Invalid cache entry: %s (hostname and at least one address are required)",
arg,
)
continue
cache[normalized] = addresses
normalized = normalize_hostname(hostname)
cache[normalized] = [ip.strip() for ip in ips.split(",")]
return cache
+1 -1
View File
@@ -37,7 +37,7 @@ def find_elf_path(build_path: Path) -> Path | None:
"""
name = build_path.name
for candidate in (
# Native ESP-IDF: the build writes build/<name>.elf, which ESPHome copies
# Native ESP-IDF: idf.py writes build/<name>.elf, which ESPHome copies
# to build/firmware.elf (see espidf.toolchain.create_elf_copy)
build_path / "build" / "firmware.elf",
# PlatformIO
+45 -105
View File
@@ -3,12 +3,12 @@
Artifacts land in a machine-global cache (shared across projects, like the
ESP-IDF install in ``esphome.espidf.framework``):
<cache>/arduino8266/frameworks/<tag>/ the Arduino core
<cache>/arduino8266/toolchains/<tag>/ xtensa-lx106-elf gcc 10.3
<cache>/arduino8266/frameworks/<version>/ framework-arduinoespressif8266
<cache>/arduino8266/toolchains/<version>/ toolchain-xtensa (gcc 10.3)
Both come from esphome-libs releases pinned below;
``ESPHOME_ARDUINO8266_*_MIRRORS`` overrides the URLs, with ``{VERSION}``
standing for the release tag. ninja comes from PATH or the ninja PyPI wheel.
Packages come from the PlatformIO registry (identical bits to the PlatformIO
backend); ``ESPHOME_ARDUINO8266_*_MIRRORS`` overrides the URLs. ninja comes
from PATH or the ninja PyPI wheel.
"""
from __future__ import annotations
@@ -22,69 +22,13 @@ from esphome.build_helpers.ninja import find_ninja
from esphome.build_helpers.tools_cache import ARDUINO8266_TOOLS_CACHE, tools_cache_path
from esphome.core import EsphomeError, Version
from esphome.framework_helpers import str_to_lst_of_str
from esphome.platformio.registry import (
Download,
PackageSpec,
Resolver,
get_systype,
install_packages,
prefetch_packages,
)
from esphome.platformio.registry import install_package, prefetch_packages
FRAMEWORK_PACKAGE = "arduino-esp8266"
_FRAMEWORK_RELEASES = "https://github.com/esphome-libs/arduino-esp8266/releases/"
class FrameworkRelease(NamedTuple):
tag: str
sha256: str
size: int
def download(self) -> Download:
archive = f"{FRAMEWORK_PACKAGE}-{self.tag}.tar.gz"
url = f"{_FRAMEWORK_RELEASES}download/{self.tag}/{archive}"
return Download(url, self.sha256, self.size)
# Arduino core version -> its build in esphome-libs/arduino-esp8266
FRAMEWORK_RELEASES: dict[Version, FrameworkRelease] = {
Version(3, 1, 2): FrameworkRelease(
"3.1.2-esphome.3",
"3af533a85163804e164500a5b254dc23b922080e25ecb7dc37b3dd8ac84651db",
37185650,
),
}
TOOLCHAIN_PACKAGE = "toolchain-xtensa-lx106-elf"
FRAMEWORK_PACKAGE = "framework-arduinoespressif8266"
TOOLCHAIN_PACKAGE = "toolchain-xtensa"
# gcc 10.3, the toolchain Arduino core 3.x builds with; the build
# generator's compile flags are tuned to it.
TOOLCHAIN_VERSION = "10.3.0-esphome.3"
_TOOLCHAIN_RELEASES = (
"https://github.com/esphome-libs/xtensa-lx106-elf-toolchain/releases/"
)
# Registry system tag -> (sha256, size) of that host's archive
TOOLCHAIN_BUILDS: dict[str, tuple[str, int]] = {
"darwin_arm64": (
"ad0ea929238d9b527c43e0d20257acc2a5680bdb0d2b1cf8f2c99169786217e9",
60747260,
),
"darwin_x86_64": (
"997090cac80c8eb59604ec52b73fb3568e5f2d9b2971f83c3f2a5c545c9c949c",
64065752,
),
"linux_aarch64": (
"403f14d0d5755682fcd6eaea1e4c457a1d8cad30690e52fb0c804d8db266b908",
67487067,
),
"linux_x86_64": (
"64f21fa3ba736b363dc8c234dbbb39e005e574e33de08a78e9a00c55a64ae706",
68343668,
),
"windows_amd64": (
"1e62abf8df041ce5158f5770dffef955f2f981ce7f7adee88fcd5a8197705aa6",
67536405,
),
}
TOOLCHAIN_VERSION = "2.100300.220621"
ESPHOME_ARDUINO8266_FRAMEWORK_MIRRORS = str_to_lst_of_str(
os.environ.get("ESPHOME_ARDUINO8266_FRAMEWORK_MIRRORS", "")
@@ -100,40 +44,36 @@ def get_arduino8266_tools_path() -> Path:
return tools_cache_path(*ARDUINO8266_TOOLS_CACHE)
def framework_release(version: Version) -> FrameworkRelease:
if (release := FRAMEWORK_RELEASES.get(version)) is None:
# 3.1.1 rather than 3.1.0: the registry has no packages for 3.0.0, 3.0.1 or 3.1.0
MIN_FRAMEWORK_VERSION = Version(3, 1, 1)
def framework_package_version(ver: Version) -> str:
"""Map an Arduino core version to its registry package version (3.1.2 ->
3.30102.0; the leading 3 is the package major).
Exact registry names for 3.x cores; callers floor at MIN_FRAMEWORK_VERSION.
"""
if ver.major > 3:
raise EsphomeError(
f"'toolchain: arduino' has no build of Arduino core {version}; "
f"available: {', '.join(str(v) for v in FRAMEWORK_RELEASES)}. "
"Use one of those or 'toolchain: platformio'"
f"Arduino core {ver} is not supported yet; "
"the newest known core series is 3.x"
)
return release
if ver.major < 3:
raise EsphomeError(
f"Arduino core {ver} is not supported; ESPHome requires core 3.x"
)
return f"3.{ver.major}{ver.minor:02d}{ver.patch:02d}.0"
def get_framework_path(tag: str) -> Path:
return get_arduino8266_tools_path() / "frameworks" / tag
def get_framework_path(package_version: str) -> Path:
return get_arduino8266_tools_path() / "frameworks" / package_version
def get_toolchain_path() -> Path:
return get_arduino8266_tools_path() / "toolchains" / TOOLCHAIN_VERSION
def toolchain_download() -> Download:
"""The toolchain archive for the current host."""
systype = get_systype()
if (build := TOOLCHAIN_BUILDS.get(systype)) is None:
raise EsphomeError(
f"There is no ESP8266 toolchain for this system ({systype}); "
f"supported systems are {', '.join(sorted(TOOLCHAIN_BUILDS))}. "
"Either set 'toolchain: platformio' under 'esp8266:', or point "
"ESPHOME_ARDUINO8266_TOOLCHAIN_MIRRORS at a toolchain archive"
)
sha256, size = build
archive = f"{TOOLCHAIN_PACKAGE}-{TOOLCHAIN_VERSION}-{systype}.tar.gz"
url = f"{_TOOLCHAIN_RELEASES}download/{TOOLCHAIN_VERSION}/{archive}"
return Download(url, sha256, size)
class InstalledPaths(NamedTuple):
"""Locations of the installed framework, toolchain, and ninja binary."""
@@ -144,22 +84,29 @@ class InstalledPaths(NamedTuple):
def check_and_install(framework_version: Version) -> InstalledPaths:
"""Ensure framework, toolchain, and ninja are installed; return their paths."""
release = framework_release(framework_version)
if framework_version < MIN_FRAMEWORK_VERSION:
# Config validation enforces this too; keep the module honest when
# called directly.
raise EsphomeError(
f"The native toolchain requires the Arduino core "
f">= {MIN_FRAMEWORK_VERSION}, got {framework_version}"
)
# Probe the cheap local dependency before ~110 MB of downloads
ninja_path = find_ninja()
framework_path = get_framework_path(release.tag)
package_version = framework_package_version(framework_version)
framework_path = get_framework_path(package_version)
downloads_dir = get_arduino8266_tools_path() / "downloads"
toolchain_path = get_toolchain_path()
# One spec per package: the prefetch and the installs must agree
specs = (
PackageSpec(
(
FRAMEWORK_PACKAGE,
release.tag,
package_version,
framework_path,
ESPHOME_ARDUINO8266_FRAMEWORK_MIRRORS,
("cores/esp8266", "tools/sdk", "libraries"),
),
PackageSpec(
(
TOOLCHAIN_PACKAGE,
TOOLCHAIN_VERSION,
toolchain_path,
@@ -168,17 +115,10 @@ def check_and_install(framework_version: Version) -> InstalledPaths:
("bin", "xtensa-lx106-elf"),
),
)
# Resolved only when a download is needed, so an installed toolchain
# keeps working on a host without a build; a mirror override wins
resolvers: dict[str, Resolver] = {}
if not ESPHOME_ARDUINO8266_FRAMEWORK_MIRRORS:
resolvers[FRAMEWORK_PACKAGE] = release.download
if not ESPHOME_ARDUINO8266_TOOLCHAIN_MIRRORS:
resolvers[TOOLCHAIN_PACKAGE] = toolchain_download
# Fetch both archives at once; the installs verify and extract them.
# One spec list for both, so the two phases cannot drift.
prefetch_packages(specs, downloads_dir, resolvers)
install_packages(specs, downloads_dir, resolvers)
# Fetch both archives at once; the installs below verify and extract
prefetch_packages([spec[:4] for spec in specs], downloads_dir)
for name, version, dest, mirrors, expect in specs:
install_package(name, version, dest, mirrors, downloads_dir, expect=expect)
return InstalledPaths(
framework=framework_path, toolchain=toolchain_path, ninja=ninja_path
)
+112 -338
View File
@@ -1,4 +1,4 @@
from collections.abc import Awaitable, Callable, Sequence
from collections.abc import Callable
from dataclasses import dataclass, field
import logging
import string
@@ -21,9 +21,9 @@ from esphome.const import (
CONF_TYPE_ID,
CONF_UPDATE_INTERVAL,
)
from esphome.core import CORE, ID, EsphomeError, HexInt, Lambda
from esphome.core import CORE, ID, EsphomeError, Lambda
from esphome.cpp_generator import (
Expression,
FlashStringLiteral,
LambdaExpression,
MockObj,
MockObjClass,
@@ -35,32 +35,6 @@ from esphome.types import ConfigType, SafeExpType
from esphome.util import Registry
def progmem_bytes(name: str, data: bytes | list[int]) -> MockObj:
"""Shared PROGMEM table for constant bytes; equal payloads share one, empty is nullptr."""
if not data:
return cg.nullptr
return cg.shared_progmem_array(
name, cg.uint8, cg.ArrayInitializer(*(HexInt(x) for x in data))
)
async def templatable_bytes(
value: Any,
args: TemplateArgsType,
set_template: MockObj,
set_static: MockObj,
table_name: str,
) -> None:
"""Set a TemplatableBytes: a lambda via set_template, constant bytes via set_static."""
if cg.is_template(value):
fn = await cg.templatable(value, args, cg.std_vector.template(cg.uint8))
cg.add(set_template(fn))
elif len(value) > 0xFFFF:
raise EsphomeError(f"Byte payload is {len(value)} bytes; the maximum is 65535")
else:
cg.add(set_static(progmem_bytes(table_name, value), len(value)))
def maybe_simple_id(*validators):
"""Allow a raw ID to be specified in place of a config block.
If the value that's being validated is a dictionary, it's passed as-is to the specified validators. Otherwise, it's
@@ -245,26 +219,11 @@ ApplyCondition = cg.esphome_ns.class_("ApplyCondition", Condition)
def flash_string(config: ConfigType, value: str) -> str:
"""Default renderer for ``std::string`` constants; copies the literal out of flash on ESP8266."""
return str(cg.progmem_string(value))
def flash_compare(config: ConfigType, value: str) -> str:
"""Default renderer for ``std::string`` constants in conditions; compares in flash on ESP8266."""
if CORE.is_esp8266:
return f"::esphome::ProgmemStringRef{{PSTR({cg.safe_exp(value)}), {len(value.encode('utf-8'))}}}"
return f"progmem_string({FlashStringLiteral(value)})"
return str(cg.safe_exp(value))
def _default_std_string(
members: list[tuple[str, Any, Any]], renderer: Callable[[ConfigType, str], str]
) -> list[tuple[str, Any, Any]]:
"""Give ``cg.std_string`` members without a renderer the given default."""
return [
(key, t, fn or (renderer if t is cg.std_string else None))
for key, t, fn in members
]
def literal_with_length(config: ConfigType, value: str) -> str:
"""Renderer for a ``(const char *, size_t)`` target: a plain literal plus its byte length.
@@ -274,24 +233,13 @@ def literal_with_length(config: ConfigType, value: str) -> str:
return f"{cg.safe_exp(value)}, {len(value.encode('utf-8'))}"
def string_ref_literal(config: ConfigType, value: str) -> str:
"""Renderer for a ``StringRef`` comparison: a flash literal on ESP8266, else ``StringRef(literal, length)``."""
if CORE.is_esp8266:
return str(cg.FlashStringLiteral(value))
return f"StringRef({literal_with_length(config, value)})"
def _names_parent(text: str) -> bool:
return any(f == "parent" for _, f, _, _ in string.Formatter().parse(text))
@dataclass(frozen=True)
class ApplyCall:
"""One statement from config keys, e.g. ``"set_range({}, {})"`` with ``((CONF_LOW, cg.float_), ...)``.
Each arg is ``(conf_key, type_)`` or ``(conf_key, type_, const_fn)``. A ``conf_key`` may be a
path into nested sections. ``target`` and a plain ``str`` ``type_`` (raw C++ type text) may
name the parent object as ``{parent}``. ``const_fn(config, value)`` renders a constant's argument text; a lambda or an
path into nested sections. A plain ``str`` ``type_`` is raw C++ type text and may use
``{parent}``. ``const_fn(config, value)`` renders a constant's argument text; a lambda or an
id bypasses it. The statement is skipped when none of its keys is set, always emitted when it
has no keys, and a partial set is a config error.
"""
@@ -303,13 +251,13 @@ class ApplyCall:
fields = [
f for _, f, _, _ in string.Formatter().parse(self.target) if f is not None
]
if any(f not in ("", "parent") for f in fields):
if any(fields):
raise ValueError(
f"apply target {self.target!r}: only {{}} and {{parent}} placeholders"
f"apply target {self.target!r}: only bare {{}} placeholders"
)
if (count := fields.count("")) != len(self.args):
if len(fields) != len(self.args):
raise ValueError(
f"apply target {self.target!r} has {count} "
f"apply target {self.target!r} has {len(fields)} "
f"placeholder(s) for {len(self.args)} config key(s)"
)
if any(len(arg) not in (2, 3) for arg in self.args):
@@ -317,12 +265,6 @@ class ApplyCall:
f"apply target {self.target!r}: each arg is (conf_key, type_[, const_fn])"
)
@property
def names_parent(self) -> bool:
return _names_parent(self.target) or any(
isinstance(arg[1], str) and _names_parent(arg[1]) for arg in self.args
)
@property
def members(self) -> list[tuple[Any, Any, Any]]:
"""Each arg as ``(conf_key, type_, const_fn or None)``."""
@@ -397,16 +339,9 @@ def _check_key_in_schema(
schema = schema.schema[markers[part]]
def parent_ref(var: MockObj) -> MockObj:
"""``var`` named from global scope, so a trigger argument cannot shadow it.
Also how a generated callback names its Automation.
"""
return MockObj(f"::{var}", "->")
async def _apply_parent(config: ConfigType, id_key: str = CONF_ID) -> str:
return str(parent_ref(await cg.get_variable(config[id_key])))
# Global-scope qualified so a trigger arg named like the id cannot shadow it.
return f"::{await cg.get_variable(config[id_key])}"
def _apply_lambda_args(args: TemplateArgsType) -> TemplateArgsType:
@@ -438,7 +373,7 @@ async def _render_values(
members: list[tuple[Any, Any, Any]],
values: list[Any],
config: ConfigType,
parent: str | None,
parent: str,
lambda_args: TemplateArgsType,
compare: bool = False,
) -> list[str]:
@@ -482,22 +417,6 @@ def register_apply_action(
) -> None:
"""Register an action that only forwards config values to its parent, with no C++ class.
See ``apply_action_builder``.
"""
register_action(name, ApplyAction, schema, synchronous=True)(
apply_action_builder(name, schema, *fields, call=call, id_key=id_key)
)
def apply_action_builder(
name: str,
schema: cv.Schema,
*fields: ApplyField | ApplyCall,
call: str | None = None,
id_key: str = CONF_ID,
) -> Callable[..., Awaitable[MockObj]]:
"""The builder ``register_apply_action`` registers, for a caller that wraps it.
Generates one static function with the parent (read from ``id_key``) and constants baked
in, lambdas called inline with the trigger args, and an ``ApplyAction`` templated on it.
A constant that is an id (``cv.use_id`` under ``cv.templatable``) is the object it names.
@@ -508,7 +427,10 @@ def apply_action_builder(
statements_spec = [
(
c.target,
_default_std_string(c.members, flash_string),
[
(key, t, fn or (flash_string if t is cg.std_string else None))
for key, t, fn in c.members
],
)
for c in (f if isinstance(f, ApplyCall) else f.call() for f in fields)
]
@@ -529,12 +451,12 @@ def apply_action_builder(
statements: list[str] = []
for target, members in statements_spec:
values = _apply_values(config, members)
if not _apply_call_active(members, values):
if members and all(value is None for value in values):
continue
exprs = await _render_values(
name, target, members, values, config, parent, lambda_args
)
statements.append(f"{receiver}{target.format(*exprs, parent=parent)};")
statements.append(f"{receiver}{target.format(*exprs)};")
if call:
statements = [
f"auto apply_call = {parent}->{call}();",
@@ -545,28 +467,7 @@ def apply_action_builder(
action_id, cg.void, template_arg, lambda_args, statements
)
return builder
def _apply_call_active(members: list[tuple[Any, Any, Any]], values: list[Any]) -> bool:
"""An ``ApplyCall`` is emitted unless it has keys and none of them is set."""
return not members or any(value is not None for value in values)
async def _render_check(
name: str,
target: str,
members: list[tuple[Any, Any, Any]],
values: list[Any],
config: ConfigType,
parent: str | None,
lambda_args: TemplateArgsType,
) -> str:
"""Render a boolean check with ``values`` compared against config."""
exprs = await _render_values(
name, target, members, values, config, parent, lambda_args, compare=True
)
return target.format(*exprs, parent=parent)
register_action(name, ApplyAction, schema, synchronous=True)(builder)
def register_apply_condition(
@@ -577,12 +478,11 @@ def register_apply_condition(
``check`` is applied to the parent: ``"is_playing()"`` becomes ``parent->is_playing()``; an
``ApplyCall`` such as ``ApplyCall("state == {}", ((CONF_STATE, cg.bool_),))`` compares
against config values, all of which must be present. Write ``== false`` to negate.
A ``cg.std_string`` constant stays in flash on ESP8266 and supports only ``==`` or ``!=``
against a ``std::string`` or ``StringRef`` member; other string types are plain literals.
String constants are plain literals, so compare a ``std::string`` or ``StringRef`` member.
Generates one static predicate and an ``ApplyCondition`` templated on it.
"""
call = check if isinstance(check, ApplyCall) else ApplyCall(check)
members = _default_std_string(call.members, flash_compare)
members = call.members
_check_key_in_schema(name, schema, id_key)
for conf_key, _, _ in members:
_check_key_in_schema(name, schema, conf_key)
@@ -595,16 +495,22 @@ def register_apply_condition(
) -> MockObj:
parent = await _apply_parent(config, id_key)
lambda_args = _apply_lambda_args(args)
values = _apply_values(config, members)
check = await _render_check(
name, call.target, members, values, config, parent, lambda_args
exprs = await _render_values(
name,
call.target,
members,
_apply_values(config, members),
config,
parent,
lambda_args,
compare=True,
)
return _apply_function(
condition_id,
cg.bool_,
template_arg,
lambda_args,
[f"return {parent}->{check};"],
[f"return {parent}->{call.target.format(*exprs)};"],
)
register_condition(name, ApplyCondition, schema)(builder)
@@ -740,22 +646,54 @@ XorCondition = cg.esphome_ns.class_("XorCondition", Condition)
@register_condition("and", AndCondition, validate_condition_list)
@register_condition("all", AndCondition, validate_condition_list)
@register_condition("or", OrCondition, validate_condition_list)
@register_condition("any", OrCondition, validate_condition_list)
@register_condition("xor", XorCondition, validate_condition_list)
async def condition_group_to_code(
async def and_condition_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
conditions = await build_condition_list(config, template_arg, args)
# A group of one is that condition for and, or and xor; skip the wrapper.
if len(conditions) == 1:
return conditions[0]
return cg.new_Pvariable(
condition_id, cg.TemplateArguments(len(conditions), *template_arg), *conditions
condition_id, cg.TemplateArguments(len(conditions), *template_arg), conditions
)
@register_condition("or", OrCondition, validate_condition_list)
async def or_condition_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
conditions = await build_condition_list(config, template_arg, args)
return cg.new_Pvariable(
condition_id, cg.TemplateArguments(len(conditions), *template_arg), conditions
)
@register_condition("all", AndCondition, validate_condition_list)
async def all_condition_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
conditions = await build_condition_list(config, template_arg, args)
return cg.new_Pvariable(
condition_id, cg.TemplateArguments(len(conditions), *template_arg), conditions
)
@register_condition("any", OrCondition, validate_condition_list)
async def any_condition_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
conditions = await build_condition_list(config, template_arg, args)
return cg.new_Pvariable(
condition_id, cg.TemplateArguments(len(conditions), *template_arg), conditions
)
@@ -770,6 +708,19 @@ async def not_condition_to_code(
return cg.new_Pvariable(condition_id, template_arg, condition)
@register_condition("xor", XorCondition, validate_condition_list)
async def xor_condition_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
conditions = await build_condition_list(config, template_arg, args)
return cg.new_Pvariable(
condition_id, cg.TemplateArguments(len(conditions), *template_arg), conditions
)
@register_condition("lambda", LambdaCondition, cv.returning_lambda)
async def lambda_condition_to_code(
config: ConfigType,
@@ -871,13 +822,11 @@ async def if_action_to_code(
condition = await build_condition(config[cond_conf], template_arg, args)
var = cg.new_Pvariable(action_id, if_template_arg, condition)
if CONF_THEN in config:
for action in await build_action_list(config[CONF_THEN], template_arg, args):
cg.add(var.add_then_action(action))
cg.add(var.finish_then())
actions = await build_action_list(config[CONF_THEN], template_arg, args)
cg.add(var.add_then(actions))
if has_else:
for action in await build_action_list(config[CONF_ELSE], template_arg, args):
cg.add(var.add_else_action(action))
cg.add(var.finish_else())
actions = await build_action_list(config[CONF_ELSE], template_arg, args)
cg.add(var.add_else(actions))
return var
@@ -900,27 +849,11 @@ async def while_action_to_code(
) -> MockObj:
condition = await build_condition(config[CONF_CONDITION], template_arg, args)
var = cg.new_Pvariable(action_id, template_arg, condition)
for action in await build_action_list(config[CONF_THEN], template_arg, args):
cg.add(var.add_then_action(action))
cg.add(var.finish_then())
actions = await build_action_list(config[CONF_THEN], template_arg, args)
cg.add(var.add_then(actions))
return var
def _shadow_iteration(args: TemplateArgsType) -> TemplateArgsType:
"""Rename an inherited `iteration` so the inner repeat's own counter can shadow it."""
names = {name for _, name in args}
renamed: TemplateArgsType = []
for type_, name in args:
if name == "iteration":
depth = 1
while f"iteration_{depth}" in names:
depth += 1
name = f"iteration_{depth}"
names.add(name)
renamed.append((type_, name))
return renamed
@register_action(
"repeat",
RepeatAction,
@@ -944,11 +877,9 @@ async def repeat_action_to_code(
actions = await build_action_list(
config[CONF_THEN],
cg.TemplateArguments(cg.uint32, *template_arg.args),
[(cg.uint32, "iteration"), *_shadow_iteration(args)],
[(cg.uint32, "iteration"), *args],
)
for action in actions:
cg.add(var.add_then_action(action))
cg.add(var.finish_then())
cg.add(var.add_then(actions))
return var
@@ -1084,141 +1015,30 @@ def has_non_synchronous_actions(actions: ConfigType) -> bool:
Non-synchronous actions (delay, wait_until, script.wait, etc.) store
trigger args for later execution, making non-owning types like StringRef
unsafe.
Accepts an action list, a single action, or an automation. Only the keys of
action entries are looked up as action names; the options of an action are
only searched for nested action lists (``then:``, ``else:``, ...), so an
option that shares a name with an action, such as the ``delay:`` option of
``speaker_source.set_playlist_delay``, is not mistaken for that action.
"""
if isinstance(actions, list):
return any(has_non_synchronous_actions(item) for item in actions)
if isinstance(actions, dict):
for key, options in actions.items():
for key in actions:
if key in ACTION_REGISTRY and not ACTION_REGISTRY[key].synchronous:
return True
if _options_have_non_synchronous_actions(options):
return True
return any(
has_non_synchronous_actions(v)
for v in actions.values()
if isinstance(v, (list, dict))
)
return False
def _options_have_non_synchronous_actions(options: Any) -> bool:
"""Search an action's options for nested action lists, without treating option keys as actions."""
if isinstance(options, list):
return has_non_synchronous_actions(options)
if isinstance(options, dict):
return any(_options_have_non_synchronous_actions(v) for v in options.values())
return False
def validate_no_deferring_actions(
context: str, data: str = "the trigger data"
) -> Callable[[ConfigType], ConfigType]:
"""Return a validator that rejects deferring actions in a validated automation.
Use it for triggers whose arguments only live while the callback runs (views into a reused
buffer, a JSON document freed on return, ...): deferring actions keep the arguments for later.
:param context: Where the automation is, for the error message, e.g. ``"on_json and on_data"``.
:param data: What is only valid while the automation runs, for the error message.
"""
def validator(value: ConfigType) -> ConfigType:
if has_non_synchronous_actions(value):
raise cv.Invalid(
f"Deferring actions (delay, wait_until, script.wait, ...) are not allowed in "
f"{context}: {data} is only valid while the automation runs. Copy what you need "
"into globals first, then defer in a separate script or automation."
)
return value
return validator
def validate_synchronous_automation(
context: str,
data: str = "the trigger data",
extra_schema=None,
extra_validators=None,
single: bool = False,
) -> cv.All:
"""``validate_automation()`` that also rejects deferring actions.
See ``validate_no_deferring_actions()`` for ``context`` and ``data``; the other parameters are
passed to ``validate_automation()``.
"""
return cv.All(
validate_automation(
extra_schema=extra_schema,
extra_validators=extra_validators,
single=single,
),
validate_no_deferring_actions(context, data),
)
async def _new_automation(
args: TemplateArgsType, config: ConfigType, *ctor_args: MockObj
) -> MockObj:
"""Create the Automation for ``config`` with its actions."""
templ = cg.TemplateArguments(*(arg[0] for arg in args))
obj = cg.new_Pvariable(config[CONF_AUTOMATION_ID], templ, *ctor_args)
actions = await build_action_list(config[CONF_THEN], templ, args)
for action in actions:
cg.add(obj.add_action(action))
return obj
async def build_automation(
trigger: MockObj, args: TemplateArgsType, config: ConfigType
) -> MockObj:
return await _new_automation(args, config, trigger)
async def build_trigger_callback(
args: TemplateArgsType,
config: ConfigType,
params: TemplateArgsType,
forward: Sequence[str | Expression] | None = None,
when: str | ApplyCall | None = None,
parent: MockObj | None = None,
) -> LambdaExpression:
"""Build the Automation for ``config`` and return a stateless callback that triggers it.
``params`` are the parent callback's parameters, ``forward`` the expressions passed to
``trigger()`` (default: the parameter names; write the parent as ``parent_ref(var)``),
``when`` a filter the callback returns early on, skipped like any ``ApplyCall`` when none
of its keys is set. ``when`` may name ``parent`` as ``{parent}``, e.g.
``"{parent}->is_fully_open()"``.
"""
members: list[tuple[Any, Any, Any]] = []
if when is not None:
call = when if isinstance(when, ApplyCall) else ApplyCall(when)
members = call.members
if parent is None and call.names_parent:
raise ValueError(f"trigger filter {call.target!r} names {{parent}}")
obj = await _new_automation(args, config)
lambda_args = _apply_lambda_args(params)
statements: list[str] = []
if when is not None:
values = _apply_values(config, members)
if _apply_call_active(members, values):
check = await _render_check(
"trigger filter",
call.target,
members,
values,
config,
None if parent is None else str(parent_ref(parent)),
lambda_args,
)
statements.append(f"if (!({check}))\n return;")
if forward is None:
forward = [name for _, name in params]
statements.append(f"{parent_ref(obj)}->trigger({', '.join(map(str, forward))});")
return LambdaExpression(
["\n".join(statements)], lambda_args, capture="", return_type=cg.void
)
arg_types = [arg[0] for arg in args]
templ = cg.TemplateArguments(*arg_types)
obj = cg.new_Pvariable(config[CONF_AUTOMATION_ID], templ, trigger)
actions = await build_action_list(config[CONF_THEN], templ, args)
cg.add(obj.add_actions(actions))
return obj
async def build_callback_automation(
@@ -1227,9 +1047,6 @@ async def build_callback_automation(
args: TemplateArgsType,
config: ConfigType,
forwarder: MockObj | MockObjClass | None = None,
params: TemplateArgsType | None = None,
forward: Sequence[str | Expression] | None = None,
when: str | ApplyCall | None = None,
) -> None:
"""Build an Automation and register it as a callback on the parent.
@@ -1241,9 +1058,6 @@ async def build_callback_automation(
pointer-sized (single Automation* field) to fit inline in Callback::ctx_
and avoid heap allocation.
With ``params``, ``forward`` or ``when`` the callback is instead the stateless
lambda of ``build_trigger_callback``; ``forwarder`` cannot be combined with them.
:param parent: The component object (e.g., button, sensor).
:param callback_method: Name of the callback method (e.g., "add_on_press_callback").
:param args: Automation template args as list of (type, name) tuples.
@@ -1252,56 +1066,22 @@ async def build_callback_automation(
TriggerForwarder<Ts...>. Pass any struct type whose aggregate init takes
a single Automation pointer (e.g., TriggerOnTrueForwarder).
"""
if params is not None or forward is not None or when is not None:
if forwarder is not None:
raise ValueError(
"forwarder cannot be combined with params, forward or when"
)
callback = await build_trigger_callback(
args, config, args if params is None else params, forward, when, parent
)
cg.add(getattr(parent, callback_method)(callback))
return
obj = await _new_automation(args, config)
arg_types = [arg[0] for arg in args]
templ = cg.TemplateArguments(*arg_types)
obj = cg.new_Pvariable(config[CONF_AUTOMATION_ID], templ)
actions = await build_action_list(config[CONF_THEN], templ, args)
cg.add(obj.add_actions(actions))
# Use template forwarder structs for deduplication. The compiler generates
# one operator() per forwarder type; different automation pointers are just
# data in the struct.
if forwarder is None:
forwarder = TriggerForwarder.template(*(arg[0] for arg in args))
forwarder = TriggerForwarder.template(templ)
# RawExpression for aggregate init — both forwarder and obj are codegen
# MockObjs (not user input), and there's no Expression type for positional
# aggregate initialization (StructInitializer uses named fields).
cg.add(getattr(parent, callback_method)(cg.RawExpression(f"{forwarder}{{{obj}}}")))
async def build_parent_callback_automation(
parent: MockObj, callback_method: str, arg: tuple[Any, str], config: ConfigType
) -> None:
"""Register an Automation that receives ``parent`` from a callback that carries nothing.
``arg`` is the automation's ``(type, name)``, e.g. ``(Fan.operator("ptr"), "x")``.
"""
await build_callback_automation(
parent, callback_method, [arg], config, params=[], forward=[parent_ref(parent)]
)
async def build_trigger_automations(
parent: MockObj | None,
config: ConfigType,
entries: tuple[tuple[str, TemplateArgsType], ...],
) -> None:
"""Instantiate each entry's Trigger class, with ``parent`` when given, and build its automations.
``entries`` are ``(conf_key, args)`` pairs; the class comes from the entry's ``CONF_TRIGGER_ID``.
"""
ctor_args = () if parent is None else (parent,)
for conf_key, args in entries:
for conf in config.get(conf_key, []):
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], *ctor_args)
await build_automation(trigger, args, conf)
@dataclass(frozen=True, slots=True)
class CallbackAutomation:
"""A single callback automation entry for build_callback_automations."""
@@ -1310,9 +1090,6 @@ class CallbackAutomation:
callback_method: str
args: TemplateArgsType = field(default_factory=list)
forwarder: MockObj | MockObjClass | None = None
params: TemplateArgsType | None = None
forward: Sequence[str | Expression] | None = None
when: str | ApplyCall | None = None
async def build_callback_automations(
@@ -1334,7 +1111,4 @@ async def build_callback_automations(
entry.args,
conf,
forwarder=entry.forwarder,
params=entry.params,
forward=entry.forward,
when=entry.when,
)
+40 -76
View File
@@ -41,7 +41,7 @@ from esphome.build_helpers.ninja_gen import (
pch_rule_lines,
tool_lines,
)
from esphome.build_helpers.pch import PCH_DEFAULT_HEADERS
from esphome.build_helpers.pch import PCH_CORE_HEADER
from esphome.components.esp8266 import build_surgery
from esphome.components.esp8266.boards import (
BOARDS,
@@ -54,7 +54,6 @@ from esphome.components.esp8266.const import (
KEY_ESP8266,
KEY_FLASH_SIZE,
KEY_SCANF_FLOAT,
THROW_STUBS_HEADER,
)
from esphome.core import CORE, EsphomeError
from esphome.framework_helpers import get_project_cxx_compile_flags
@@ -1054,10 +1053,13 @@ def write_project(paths: InstalledPaths, ccache: str | None) -> bool:
+ ["stdc++-exc" if config.exceptions else "stdc++", "m", "c", "gcc"]
)
cxx = (toolchain_tool(paths.toolchain, "g++"),)
lines = [
*tool_lines((toolchain_tool(paths.toolchain, "gcc"),), cxx, ccache),
*compile_rule_lines(ccache),
*tool_lines(
(toolchain_tool(paths.toolchain, "gcc"),),
(toolchain_tool(paths.toolchain, "g++"),),
ccache,
),
*compile_rule_lines(),
*ar_rule_lines(toolchain_tool(paths.toolchain, "ar")),
*pch_rule_lines(),
"rule link",
@@ -1066,10 +1068,10 @@ def write_project(paths: InstalledPaths, ccache: str | None) -> bool:
" rspfile_content = $in_newline",
" description = LINK $out",
"rule elf2bin",
# --flash_size follows PlatformIO: ldscript filename first, then
# upload.maximum_size, so the header always matches the layout.
# --flash_size deliberately stays board-derived, as under
# PlatformIO (which reads upload.maximum_size, not the ldscript).
# -W: the framework's own elf2bin.py trips SyntaxWarning on 3.12+.
f" command = $python -W ignore::SyntaxWarning {_q(framework / 'tools' / 'elf2bin.py')} --eboot {_q(framework / 'bootloaders' / 'eboot' / 'eboot.elf')} --app $in --flash_mode {flash_mode} --flash_freq {_FLASH_FREQ_MHZ} --flash_size {_elf2bin_flash_size(board, flash_ld_name)} --path {_q(toolchain_bin)} --out $out",
f" command = $python -W ignore::SyntaxWarning {_q(framework / 'tools' / 'elf2bin.py')} --eboot {_q(framework / 'bootloaders' / 'eboot' / 'eboot.elf')} --app $in --flash_mode {flash_mode} --flash_freq {_FLASH_FREQ_MHZ} --flash_size {_flash_size_str(BOARDS[board][KEY_FLASH_SIZE])} --path {_q(toolchain_bin)} --out $out",
" description = BIN $out",
"rule copy",
" command = $python $buildtool copy $in $out",
@@ -1088,8 +1090,32 @@ def write_project(paths: InstalledPaths, ccache: str | None) -> bool:
if "USE_ESP8266_WAVEFORM_STUBS" in flag_defines:
core_exclude |= _CORE_EXCLUDE_WAVEFORM
# esp8266/__init__ pins build_src_flags (the throw_stubs force-include), as on
# the PlatformIO path; -include paths resolve against the source root
archives = []
# variant_dir existence was already enforced with the include dirs
variant_sources = collect_sources(variant_dir)
if variant_sources:
objs = compile_edges(lines, variant_sources, variant_dir, "variant")
lines.append(f"build libFrameworkArduinoVariant.a: ar {' '.join(objs)}")
archives.append("libFrameworkArduinoVariant.a")
core_objs = compile_edges(
lines, collect_sources(core_dir, core_exclude), core_dir, "core"
)
if not core_objs:
# An empty archive would link into a wall of undefined references
# (app_entry, the exception vectors) far from the cause
raise EsphomeError(
f"{_INCOMPLETE_INSTALL}: no core sources in {core_dir}; {_CLEAN_HINT}"
)
lines.append(f"build libFrameworkArduino.a: ar {' '.join(core_objs)}")
archives.append("libFrameworkArduino.a")
lib_archives, direct_objs = library_edges(lines, libraries)
archives += lib_archives
# One source of truth with the PlatformIO path: esp8266/__init__ pins
# build_src_flags (the throw_stubs force-include); -include paths
# resolve against the source root
src_other: list[str] = []
src_includes: list[str] = []
src_it = iter(
@@ -1104,49 +1130,12 @@ def write_project(paths: InstalledPaths, ccache: str | None) -> bool:
)
src_includes.append(header)
elif is_joined_include(tok):
# Left in src_other it would precede the pch include
# Left in src_other it would precede the pch include and
# silently defeat the .gch
src_includes.append(tok[len("-include") :])
else:
src_other.append(_shell_token(tok))
# The throw stubs abort: none anywhere with exceptions on, else the core and
# libraries get them too (src keeps them after its pch include)
if config.exceptions:
src_includes = [h for h in src_includes if h != THROW_STUBS_HEADER]
include_flags = [f"-include {_q(src_dir / h)}" for h in src_includes]
framework_flags = ""
if THROW_STUBS_HEADER in src_includes:
stubs_flag = include_flags[src_includes.index(THROW_STUBS_HEADER)]
lines.append(f"frameworkflags = {stubs_flag}")
framework_flags = "$frameworkflags"
archives = []
# variant_dir existence was already enforced with the include dirs
variant_sources = collect_sources(variant_dir)
if variant_sources:
objs = compile_edges(
lines, variant_sources, variant_dir, "variant", flags=framework_flags
)
lines.append(f"build libFrameworkArduinoVariant.a: ar {' '.join(objs)}")
archives.append("libFrameworkArduinoVariant.a")
core_objs = compile_edges(
lines,
collect_sources(core_dir, core_exclude),
core_dir,
"core",
flags=framework_flags,
)
if not core_objs:
# An empty archive would link into a wall of undefined references
# (app_entry, the exception vectors) far from the cause
raise EsphomeError(
f"{_INCOMPLETE_INSTALL}: no core sources in {core_dir}; {_CLEAN_HINT}"
)
lines.append(f"build libFrameworkArduino.a: ar {' '.join(core_objs)}")
archives.append("libFrameworkArduino.a")
lib_archives, direct_objs = library_edges(lines, libraries, framework_flags)
archives += lib_archives
# One shared variable instead of repeating the flags line on every src
# edge (hundreds of edges in a real project)
lines.append(f"srcflags = {' '.join(src_other + include_flags)}")
@@ -1154,11 +1143,11 @@ def write_project(paths: InstalledPaths, ccache: str | None) -> bool:
lines,
build_dir,
src_dir,
(*src_includes, *PCH_DEFAULT_HEADERS),
(*src_includes, PCH_CORE_HEADER),
flag_sets.cxxflags,
src_other,
ccache,
(str(paths.framework), str(paths.toolchain)),
cxx,
)
src_objs = compile_edges(
lines,
@@ -1204,28 +1193,3 @@ def _flash_size_str(flash_size: int) -> str:
"""Flash size argument for elf2bin (e.g. ``4M``, ``512K``)."""
mb = 1024 * 1024
return f"{flash_size // mb}M" if flash_size >= mb else f"{flash_size // 1024}K"
# Same pattern PlatformIO's _get_flash_size applies to the ldscript path
_LD_FLASH_SIZE_RE = re.compile(r"\.flash\.(\d+[mk]).*\.ld")
# The framework elf2bin.py's --flash_size choices
_ELF2BIN_FLASH_SIZES = frozenset({"256K", "512K", "1M", "2M", "4M", "8M", "16M"})
def _elf2bin_flash_size(board: str, flash_ld_name: str) -> str:
"""Image-header flash size as PlatformIO derives it: ldscript filename,
else board_upload.maximum_size, else the board table. The SDK clamps the
chip to the header size at boot, so a header smaller than the linked
layout breaks OTA writes on the running device."""
if match := _LD_FLASH_SIZE_RE.search(flash_ld_name):
token = match.group(1)
base = 1024 if token[-1] == "k" else 1024 * 1024
return _flash_size_str(int(token[:-1]) * base)
if max_size := _pio_option("board_upload.maximum_size", ""):
if (
not max_size.isdigit()
or (size := _flash_size_str(int(max_size))) not in _ELF2BIN_FLASH_SIZES
):
raise EsphomeError(f"Invalid board_upload.maximum_size value {max_size!r}")
return size
return _flash_size_str(BOARDS[board][KEY_FLASH_SIZE])
+11 -1
View File
@@ -6,6 +6,7 @@ started esphome and must not depend on the package being importable.
Subcommands:
ar <ar-binary> <archive> <rspfile> remove stale archive, then ``ar rcs``
copy <src> <dst> copy a file
touch <path> create/update a stamp file
The ar rspfile carries one object path per line (the generating rule must
use ``$in_newline``, never ``$in``).
@@ -83,9 +84,18 @@ def _run_copy(src: str, dst: str) -> int:
return 0
def _run_touch(path: str) -> int:
try:
Path(path).touch()
except OSError as err:
print(f"touch: {path} failed: {err}", file=sys.stderr)
return 1
return 0
# mode -> (handler, expected operand count); surplus argv means a
# mis-specified ninja rule and must error, not silently drop operands
_MODES = {"ar": (_run_ar, 3), "copy": (_run_copy, 2)}
_MODES = {"ar": (_run_ar, 3), "copy": (_run_copy, 2), "touch": (_run_touch, 1)}
def main() -> int:
+77 -281
View File
@@ -3,10 +3,15 @@
import json
import logging
from pathlib import Path
import re
import textwrap
from esphome.build_helpers import pch
from esphome.build_helpers.pch import (
PCH_DEFAULT_HEADERS,
PCH_HEADER_NAME,
mark_pch_emitted,
pch_enabled,
pch_header_text,
)
from esphome.components.esp32 import (
get_esp32_variant,
get_excluded_builtin_components,
@@ -21,7 +26,7 @@ from esphome.framework_helpers import (
get_project_cxx_compile_flags,
get_project_link_flags,
)
from esphome.helpers import get_bool_env, mkdir_p, write_file_if_changed
from esphome.helpers import mkdir_p, write_file_if_changed
_LOGGER = logging.getLogger(__name__)
@@ -36,83 +41,6 @@ list(FILTER esphome_cxx_compile_options EXCLUDE REGEX "^-std=")
list(APPEND esphome_cxx_compile_options "-std={standard}")
idf_build_set_property(CXX_COMPILE_OPTIONS "${{esphome_cxx_compile_options}}")"""
# Drops the app archive from ldgen's inputs so app-only edits skip the
# sections.ld regeneration. Safe: no mapping fragment references it
# (run_compile re-checks each build). Filters only the top-level call;
# the prior definition stays reachable with an underscore prefix.
_LDGEN_OVERRIDE = """\
if(COMMAND __ldgen_get_lib_deps_of_target)
set_property(GLOBAL PROPERTY ESPHOME_LDGEN_ARMED 1)
function(__ldgen_get_lib_deps_of_target target out_list_var)
if(NOT COMMAND ___ldgen_get_lib_deps_of_target)
message(FATAL_ERROR "ESPHome ldgen override lost the original "
"implementation; set ESPHOME_LDGEN_FULL_DEPS=1 and rebuild.")
endif()
___ldgen_get_lib_deps_of_target(${target} ${out_list_var})
if(out_list_var STREQUAL "ldgen_libraries")
set_property(GLOBAL PROPERTY ESPHOME_LDGEN_FILTERED 1)
list(LENGTH ${out_list_var} esphome_ldgen_before)
list(REMOVE_ITEM ${out_list_var} idf::src __idf_src)
list(LENGTH ${out_list_var} esphome_ldgen_after)
if(esphome_ldgen_before EQUAL esphome_ldgen_after)
message(@SEVERITY@ "ESPHome ldgen app archive exclusion matched "
"nothing; app edits will regenerate sections.ld.")
endif()
endif()
set(${out_list_var} "${${out_list_var}}" PARENT_SCOPE)
endfunction()
else()
message(@MISSING@ "ESPHome ldgen override target not found; "
"app edits will regenerate sections.ld.")
endif()"""
# lwip sources that compile to empty objects with the option off (their own
# #if guard). (option, regex valid for both Python and CMake); a source is
# only dropped when its option is defined and off, so a renamed option
# keeps it.
LWIP_EMPTY_SOURCES: tuple[tuple[str, str], ...] = (
("CONFIG_LWIP_PPP_SUPPORT", "/netif/ppp/"),
("CONFIG_LWIP_IPV6", "/core/ipv6/"),
("CONFIG_LWIP_AUTOIP", "/core/ipv4/autoip[.]c$"),
("CONFIG_LWIP_STATS", "/core/stats[.]c$"),
)
# Drift guard only: keep every lwip source.
LWIP_FULL_SOURCES_ENV = "ESPHOME_LWIP_FULL_SOURCES"
# Drops the empty objects after project(), once the lwip target exists.
_LWIP_EMPTY_SOURCES_FILTER = f"""\
idf_build_get_property(esphome_build_components BUILD_COMPONENTS)
if(lwip IN_LIST esphome_build_components AND NOT DEFINED ENV{{{LWIP_FULL_SOURCES_ENV}}})
idf_component_get_property(esphome_lwip_lib lwip COMPONENT_LIB)
get_target_property(esphome_lwip_srcs ${{esphome_lwip_lib}} SOURCES)
@FILTERS@
set_property(TARGET ${{esphome_lwip_lib}} PROPERTY SOURCES ${{esphome_lwip_srcs}})
endif()"""
def lwip_empty_source_gate(option: str, regex: str) -> str:
return (
f" if(DEFINED {option} AND NOT {option})\n"
f' list(FILTER esphome_lwip_srcs EXCLUDE REGEX "{regex}")\n'
" endif()"
)
def _lwip_empty_sources_filter() -> str:
gates = "\n".join(lwip_empty_source_gate(*entry) for entry in LWIP_EMPTY_SOURCES)
return _LWIP_EMPTY_SOURCES_FILTER.replace("@FILTERS@", gates)
# Runs after project() so the walk has happened; catches the remaining
# silent path where the top-level out-var was renamed.
_LDGEN_OVERRIDE_CHECK = """\
get_property(esphome_ldgen_armed GLOBAL PROPERTY ESPHOME_LDGEN_ARMED)
get_property(esphome_ldgen_filtered GLOBAL PROPERTY ESPHOME_LDGEN_FILTERED)
if(esphome_ldgen_armed AND NOT esphome_ldgen_filtered)
message(@SEVERITY@ "ESPHome ldgen override never filtered the app "
"archive; app edits will regenerate sections.ld.")
endif()"""
def get_available_components() -> list[str] | None:
"""List the built-in ESP-IDF components from ``project_description.json``.
@@ -158,114 +86,6 @@ def _cmake_quote(value: str) -> str:
return f'"{escaped}"'
# CONFIG_APP_BUILD_BOOTLOADER is hidden and force-selected, so it can only be
# cleared at the CMake level (the same state IDF's RAM-app build type uses).
# The macro is IDF's __build_process_project_includes plus a few added lines;
# the flag is ignored and the bootloader builds as usual if IDF changes it.
IDF_BOOTLOADER_OVERRIDE = """\
# ESPHome bootloader skip switch; see esphome/espidf/toolchain.py.
if(ESPHOME_SKIP_BOOTLOADER)
macro(__build_process_project_includes)
idf_build_get_property(sdkconfig_cmake SDKCONFIG_CMAKE)
include(${sdkconfig_cmake})
set(CONFIG_APP_BUILD_BOOTLOADER "")
# bt's CMakeLists reads the lowercase idf_target that the (now
# skipped) bootloader project_include leaks; keep it defined, or
# its empty TARGET_SRC_NAME sends file(GLOB_RECURSE) across /.
idf_build_get_property(idf_target IDF_TARGET)
# partition_table's V1 ECDSA signing reads this key, which the
# skipped bootloader project_include also sets.
get_filename_component(SECURE_BOOT_SIGNING_KEY "${CONFIG_SECURE_BOOT_SIGNING_KEY}" ABSOLUTE BASE_DIR "${project_dir}")
idf_build_get_property(build_properties __BUILD_PROPERTIES)
foreach(build_property ${build_properties})
idf_build_get_property(val ${build_property})
set(${build_property} "${val}")
endforeach()
idf_build_get_property(build_component_targets __BUILD_COMPONENT_TARGETS)
foreach(component_target ${build_component_targets})
__component_get_property(dir ${component_target} COMPONENT_DIR)
__component_get_property(_name ${component_target} COMPONENT_NAME)
set(COMPONENT_NAME ${_name})
set(COMPONENT_DIR ${dir})
set(COMPONENT_PATH ${dir})
if(EXISTS ${COMPONENT_DIR}/project_include.cmake)
include(${COMPONENT_DIR}/project_include.cmake)
endif()
endforeach()
endmacro()
endif()
"""
# The lines the override adds to IDF's macro; idf_macro_matches() below
# strips them before comparing with the live macro.
BOOTLOADER_OVERRIDE_ADDED_LINES = (
'set(CONFIG_APP_BUILD_BOOTLOADER "")',
"idf_build_get_property(idf_target IDF_TARGET)",
(
"get_filename_component(SECURE_BOOT_SIGNING_KEY"
' "${CONFIG_SECURE_BOOT_SIGNING_KEY}" ABSOLUTE BASE_DIR "${project_dir}")'
),
)
_MACRO = re.compile(
r"macro\(__build_process_project_includes\)(.*?)endmacro\(\)", re.DOTALL
)
def _normalized_macro(text: str) -> list[str] | None:
"""The macro body as comment-free, whitespace-collapsed lines."""
if (match := _MACRO.search(text)) is None:
return None
return [
re.sub(r"\s+", " ", line)
for raw in match.group(1).splitlines()
if (line := raw.split("#", 1)[0].strip())
]
_EXPECTED_MACRO = [
line
for line in _normalized_macro(IDF_BOOTLOADER_OVERRIDE)
if line not in BOOTLOADER_OVERRIDE_ADDED_LINES
]
def idf_macro_matches(idf_path: Path) -> bool:
"""Whether IDF's macro still matches the copy the override replays."""
build_cmake = idf_path / "tools" / "cmake" / "build.cmake"
live = _normalized_macro(build_cmake.read_text(encoding="utf-8"))
return live == _EXPECTED_MACRO
def _cmake_args_for_write(minimal: bool) -> dict[str, str]:
"""The cg.add_cmake_arg() values for one project write.
The discovery (minimal) write lets every built-in component register so
the list it finds, cached per target, serves any exclusion set; the full
write drops the excluded names from that list and passes all of them to
IDF. Names outside the framework's components directory (managed
components) stay excluded on the discovery write too, since the list
only holds built-in ones. A checkout supplied through IDF_PATH caches
nothing, so its discovery keeps every exclusion.
"""
from esphome.espidf.toolchain import _esphome_manages_idf, _get_idf_path
args = dict(CORE.cmake_args)
if (
not minimal
or not _esphome_manages_idf()
or not (excluded := args.get("EXCLUDE_COMPONENTS"))
):
return args
root = _get_idf_path() / "components"
outside = [name for name in excluded.split(";") if not (root / name).is_dir()]
if outside:
args["EXCLUDE_COMPONENTS"] = ";".join(outside)
else:
del args["EXCLUDE_COMPONENTS"]
return args
def get_project_cmakelists(
minimal: bool = False, builtin_components: list[str] | None = None
) -> str:
@@ -311,28 +131,13 @@ def get_project_cmakelists(
else ""
)
# Stops the ~3s sections.ld regeneration on app-only edits; see
# _LDGEN_OVERRIDE. ESPHOME_LDGEN_FULL_DEPS=1 restores stock behavior;
# ESPHOME_LDGEN_STRICT=1 (CI) fails the configure when an IDF bump
# breaks the override instead of degrading to stock deps.
if get_bool_env("ESPHOME_LDGEN_FULL_DEPS"):
ldgen_override = ""
ldgen_override_check = ""
else:
strict = get_bool_env("ESPHOME_LDGEN_STRICT")
severity = "FATAL_ERROR" if strict else "WARNING"
missing = "FATAL_ERROR" if strict else "STATUS"
ldgen_override = _LDGEN_OVERRIDE.replace("@SEVERITY@", severity).replace(
"@MISSING@", missing
)
ldgen_override_check = _LDGEN_OVERRIDE_CHECK.replace("@SEVERITY@", severity)
# CMake variables registered via cg.add_cmake_arg(). Emitted before
# include(project.cmake) so values like EXCLUDE_COMPONENTS are already
# set when project.cmake seeds the component list.
# set when project.cmake seeds the component list, and on minimal
# (discovery) writes too so excluded components never register.
cmake_args = "\n".join(
f"set({name} {_cmake_quote(value)})"
for name, value in sorted(_cmake_args_for_write(minimal).items())
for name, value in sorted(CORE.cmake_args.items())
)
# Per-project list exposed as a CMake variable so converted PIO libs
@@ -355,10 +160,10 @@ def get_project_cmakelists(
# component's REQUIRES including real IDF components). Referenced by
# src/CMakeLists and by each converted PIO lib's CMakeLists. Skipped
# on minimal writes because project_description.json may be stale.
# Excluded components are dropped here as well: the discovery list
# (cached per target) still holds them, and requiring an excluded
# component pulls it back into the build (IDF requirement expansion
# overrides EXCLUDE_COMPONENTS).
# Excluded components are dropped here as well: a stale
# project_description.json from a build without exclusions may still
# list them, and requiring an excluded component pulls it back into
# the build (IDF requirement expansion overrides EXCLUDE_COMPONENTS).
# Derived from the EXCLUDE_COMPONENTS cmake arg emitted above so the
# two can never disagree within one generated file.
builtin_components_property = (
@@ -403,9 +208,6 @@ set(EXTRA_COMPONENT_DIRS ${{CMAKE_SOURCE_DIR}}/src)
include($ENV{{IDF_PATH}}/tools/cmake/project.cmake)
{IDF_BOOTLOADER_OVERRIDE}
{ldgen_override}
{cpp_standard_options}
{cxx_compile_options}
@@ -418,31 +220,14 @@ include($ENV{{IDF_PATH}}/tools/cmake/project.cmake)
project({CORE.name})
{ldgen_override_check}
{_lwip_empty_sources_filter()}
# Emit per-memory-type JSON size data for ESPHome to read post-build.
# json2 stays small; raw dumps every symbol (~2s on a large map) and
# this command runs inside the link edge, blocking everything downstream.
# IDF's size target depends on the map, so ninja has to know the link
# writes it for size to build in the same run as all. IDF declares the
# map itself since espressif/esp-idf#19201 (and in cmakev2), and ninja
# rejects two rules for one output, so declare it here only when IDF has
# not. add_custom_command(OUTPUT) marks its outputs GENERATED.
get_source_file_property(esphome_map_declared
${{CMAKE_BINARY_DIR}}/${{CMAKE_PROJECT_NAME}}.map GENERATED)
if(esphome_map_declared)
set(esphome_map_byproducts)
else()
set(esphome_map_byproducts BYPRODUCTS ${{CMAKE_BINARY_DIR}}/${{CMAKE_PROJECT_NAME}}.map)
endif()
add_custom_command(
TARGET ${{CMAKE_PROJECT_NAME}}.elf POST_BUILD
COMMAND ${{PYTHON}} -m esp_idf_size {size_ng_flag} --format=json2
-o ${{CMAKE_BINARY_DIR}}/esp_idf_size.json
${{CMAKE_PROJECT_NAME}}.map
${{esphome_map_byproducts}}
WORKING_DIRECTORY ${{CMAKE_BINARY_DIR}}
VERBATIM
)
@@ -505,70 +290,72 @@ idf_component_register(
target_link_options(${{COMPONENT_LIB}} PUBLIC
{link_opts_str}
)
{_pch_cmake_block()}"""
{_pch_cmake()}"""
# Where CMake puts the .gch of the src component; ccache reads the checksum
# next to it in place of the .gch
_PCH_SUM_PATH = "build/esp-idf/src/CMakeFiles/__idf_src.dir/cmake_pch.hxx.gch.sum"
# Where the Windows gate records its choice
_PCH_CHOICE_VAR = "ESPHOME_PCH"
def _pch_cmake() -> str:
"""The src component's precompiled-header block (C++ TUs only).
def _pch_cmake_block() -> str:
"""The CMake block that precompiles the core headers for the C++ sources
of the src component; empty when disabled."""
if not pch.pch_enabled():
The -include stays relative (resolved from the compiler cwd, the build
dir); an absolute path would poison ccache keys.
"""
if not pch_enabled():
return ""
headers = "\n".join(
f' "$<$<COMPILE_LANGUAGE:CXX>:${{CMAKE_CURRENT_SOURCE_DIR}}/{header}>"'
for header in pch.PCH_DEFAULT_HEADERS
)
block = f"""target_precompile_headers(${{COMPONENT_LIB}} PRIVATE
{headers}
)"""
if not pch.pch_needs_gcc_check():
return f"\n# ESPHome precompiled header\n{block}\n"
# Before the first configure only CMake knows the compiler version
# Strict inverts: a per-process consumer rejection reds the build.
# Baked at generation: a knob flip takes effect when the CMakeLists is
# rewritten (every esphome compile); a hand-run idf.py keeps the old one
escalation = pch.pch_consumer_escalation()
return f"""
# ESPHome precompiled header, unless GCC bug 14940 keeps it from loading
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND ({pch.PCH_WINDOWS_CMAKE_OLD_GCC}))
message(STATUS "ESPHome: GCC ${{CMAKE_CXX_COMPILER_VERSION}} cannot load a precompiled header on Windows; compiling without it")
set({_PCH_CHOICE_VAR} OFF CACHE BOOL "ESPHome precompiled header in use" FORCE)
else()
set({_PCH_CHOICE_VAR} ON CACHE BOOL "ESPHome precompiled header in use" FORCE)
{textwrap.indent(block, " ")}
endif()
# ESPHome precompiled header (see esphome/build_helpers/pch.py).
# OBJECT_DEPENDS is on the header, not the .gch: pch-baked headers drop
# out of TU depfiles, and prepare_pch() touches the header on rebuild.
target_compile_options(${{COMPONENT_LIB}} PRIVATE
"$<$<COMPILE_LANGUAGE:CXX>:-Winvalid-pch>"
"$<$<COMPILE_LANGUAGE:CXX>:{escalation}>"
"$<$<COMPILE_LANGUAGE:CXX>:-include>"
"$<$<COMPILE_LANGUAGE:CXX>:{PCH_HEADER_NAME}>"
)
set_source_files_properties(${{app_sources}} PROPERTIES
OBJECT_DEPENDS "${{CMAKE_BINARY_DIR}}/{PCH_HEADER_NAME}")
"""
def _read_if_exists(path: Path) -> str:
return path.read_text(encoding="utf-8") if path.is_file() else ""
def discard_pch() -> None:
"""Drop the pch sidecars in the IDF build dir."""
pch.discard_pch(CORE.relative_build_path("build"))
def write_pch_checksum() -> None:
"""Write the checksum ccache uses in place of the .gch: the core headers,
the framework version, the sdkconfig and the managed component versions."""
from esphome.espidf.toolchain import get_cmake_cache_value
if not pch.pch_enabled():
def prepare_pch() -> None:
"""Build the .gch right before ninja, after every reconfigure, so the
compile_commands.json flags and the sdkconfig are the settled ones."""
if not pch_enabled():
# Self-cleaning escape hatch: drop any previously built .gch
pch.discard_pch(CORE.relative_build_path("build"))
pch.pch_disabled_degraded()
return
# The gate's choice, cached by configure
if pch.pch_needs_gcc_check() and get_cmake_cache_value(_PCH_CHOICE_VAR) != "ON":
sdkconfig_path = CORE.relative_build_path(f"sdkconfig.{CORE.name}")
try:
sdkconfig = sdkconfig_path.read_text(encoding="utf-8")
except OSError as err:
# Fail closed: the sdkconfig is the .sum's only config identity for
# sdkconfig.h-only options; a stand-in marker would collide
_LOGGER.warning(
"Could not read %s; compiling without the pch: %s", sdkconfig_path, err
)
pch.discard_pch(CORE.relative_build_path("build"))
pch.pch_degraded(f"sdkconfig unreadable: {err}")
return
pch.log_pch_in_use()
checksum = pch.pch_checksum(
CORE.relative_src_path(),
pch.PCH_DEFAULT_HEADERS,
pch.prepare_pch(
CORE.relative_build_path("build"),
PCH_DEFAULT_HEADERS,
(
str(idf_version()),
_read_if_exists(CORE.relative_build_path(f"sdkconfig.{CORE.name}")),
_read_if_exists(CORE.relative_build_path("dependencies.lock")),
CORE.cpp_standard or "",
sdkconfig,
*get_project_compile_flags(),
*get_project_cxx_compile_flags(),
),
)
path = CORE.relative_build_path(_PCH_SUM_PATH)
path.parent.mkdir(parents=True, exist_ok=True)
write_file_if_changed(path, checksum + "\n")
def write_project(
@@ -590,10 +377,19 @@ def write_project(
get_component_cmakelists(),
)
if pch_enabled():
write_file_if_changed(
CORE.relative_build_path("build", PCH_HEADER_NAME),
pch_header_text(PCH_DEFAULT_HEADERS),
)
# Consumers carry the -include; gate the ccache relaxation on it
mark_pch_emitted()
# Snapshot the exclusion set so has_outdated_files() can trigger a
# reconfigure when it changes. The ESPHOME_PROJECT_BUILTIN_COMPONENTS
# property drops excluded names, so re-including one (e.g. a config
# gains mqtt) needs a reconfigure to rebuild it from the discovery list.
# discovery reconfigure when it changes. Excluded components never
# register in project_description.json, so re-including one (e.g. a
# config gains mqtt) requires a fresh discovery pass before the
# ESPHOME_PROJECT_BUILTIN_COMPONENTS property can list it.
write_file_if_changed(
CORE.relative_build_path("exclude_components.esphomeinternal"),
";".join(get_excluded_builtin_components()),
+9 -16
View File
@@ -15,7 +15,6 @@ from collections.abc import Iterable
import logging
import os
from pathlib import Path
import subprocess
import sys
from typing import TYPE_CHECKING
@@ -33,7 +32,7 @@ from esphome.build_helpers.ninja_gen import (
pch_rule_lines,
tool_lines,
)
from esphome.build_helpers.pch import PCH_DEFAULT_HEADERS, pch_enabled
from esphome.build_helpers.pch import PCH_CORE_HEADER
from esphome.core import CORE, EsphomeError
from esphome.framework_helpers import get_project_cxx_compile_flags
from esphome.helpers import mkdir_p, write_file_if_changed
@@ -193,15 +192,6 @@ def _file_macro_maps(build_dir: Path) -> list[str]:
]
def _compiler_version(cxx: tuple[str, ...]) -> str:
"""What the compiler says it is: its path can stay the same across an
update (the macOS shims in /usr/bin)."""
result = subprocess.run(
[*cxx, "--version"], capture_output=True, text=True, check=False
)
return result.stdout
def write_project(compilers: HostCompilers, ccache: str | None) -> bool:
"""Write the ninja build for the current configuration.
@@ -240,7 +230,7 @@ def write_project(compilers: HostCompilers, ccache: str | None) -> bool:
lines = [
*tool_lines(compilers.cc, compilers.cxx, ccache),
*compile_rule_lines(ccache),
*compile_rule_lines(),
*pch_rule_lines(),
"rule link",
" command = $cxx -o $out $linkflags @$out.rsp $archives $libdirflags $libflags",
@@ -265,15 +255,18 @@ def write_project(compilers: HostCompilers, ccache: str | None) -> bool:
archives, direct_objs = library_edges(lines, libraries)
from esphome.components.host import HOST_PCH_PREFIX
# Host has no framework force-includes; the per-TU cost is the STL
# closure behind the core headers, so those are what is precompiled
src_cxx_override = pch_edges(
lines,
build_dir,
src_dir,
PCH_DEFAULT_HEADERS,
# The arguments of a CXX override come before the flags
[*compilers.cxx[1:], *cxxflags],
(HOST_PCH_PREFIX, PCH_CORE_HEADER),
cxxflags,
(),
(compilers.cxx[0], _compiler_version(compilers.cxx)) if pch_enabled() else (),
ccache,
compilers.cxx,
)
src_objs = compile_edges(
-6
View File
@@ -1,8 +1,6 @@
from esphome.build_helpers.pch import pch_script_enabled
from esphome.const import __version__
from esphome.core import CORE
from esphome.helpers import mkdir_p, read_file, write_file_if_changed
from esphome.platformio.toolchain import copy_pch_script
from esphome.writer import find_begin_end
INI_AUTO_GENERATE_BEGIN = "; ========== AUTO GENERATED CODE BEGIN ==========="
@@ -64,8 +62,6 @@ def get_ini_content():
# Add extra script for C++ flags
CORE.add_platformio_option("extra_scripts", [f"pre:{CXX_FLAGS_FILE_NAME}"])
if pch_script_enabled():
CORE.add_platformio_option("extra_scripts", ["post:pch.py"])
# Add CMake args. A user-supplied value (str or list) is deliberately
# replaced; this option was always overwritten at FINAL priority.
@@ -110,8 +106,6 @@ def write_project():
# Write extra script for C++ specific flags
write_cxx_flags_script()
if pch_script_enabled():
copy_pch_script()
CXX_FLAGS_FILE_NAME = "cxx_flags.py"
+11 -6
View File
@@ -21,12 +21,13 @@ def _ccache_runs(ccache: str) -> bool:
)
def parse_enable_env(name: str) -> bool | None:
def parse_enable_env(name: str, strict: bool = False) -> bool | None:
"""Strictly parse an on/off environment knob; None when unset or invalid.
``bool(str)`` truthiness would flip ``no``/``off`` to enabled, so only
1/true/yes/on and 0/false/no/off count; anything else warns and reads
as unset so the caller's default policy applies.
as unset so the caller's default policy applies — or raises when
``strict`` (a typo must not silently disable a CI gate).
"""
raw = os.environ.get(name)
if raw is None:
@@ -39,6 +40,10 @@ def parse_enable_env(name: str) -> bool | None:
return True
if lowered in FALSY_ENV_STRINGS:
return False
if strict:
from esphome.core import EsphomeError
raise EsphomeError(f"Unrecognized {name}={raw!r}; use 1 or 0")
_LOGGER.warning("Ignoring unrecognized %s=%r; use 1 or 0", name, raw)
return None
@@ -103,13 +108,14 @@ def ccache_defaults_env(cache_dir: Path) -> dict[str, str]:
def effective_ccache_basedir() -> str:
"""The prefix ccache strips from hashed paths: a usable user
CCACHE_BASEDIR, else the resolved build path."""
"""The prefix ccache rewrites out of hashed paths: a user CCACHE_BASEDIR
wins, else the resolved build path (matching ccache_defaults_env)."""
from esphome.core import CORE
raw = os.environ.get("CCACHE_BASEDIR")
if raw is not None and Path(raw).is_absolute() and len(Path(raw).parts) > 1:
return raw
# Unset or degenerate ("", "/", relative): fall back to the build path
return str(Path(CORE.build_path).resolve())
@@ -118,8 +124,7 @@ def ccache_env(ccache: str | None, tools_cache: tuple[str, str]) -> dict[str, st
``ccache`` is the pre-resolved binary (resolve_ccache_path), or None when
disabled; ``tools_cache`` is the backend's tools cache spec, which holds
its ccache dir. The pch settings include ``time_macros``: a cached
object can keep an older ``__DATE__`` or ``__TIME__``.
its ccache dir.
"""
if ccache is None:
return {}
+34 -14
View File
@@ -50,11 +50,11 @@ def warn_if_idedata_missing(get_idedata: Callable[[], dict | None]) -> None:
_LOGGER.debug("Idedata failure detail", exc_info=True)
# C++ translation-unit suffixes used to identify ESPHome source files.
_CXX_SUFFIXES = (".cpp", ".cc")
# C++ translation-unit suffixes.
CXX_SOURCE_SUFFIXES = (".cpp", ".cc", ".cxx")
# Suffixes of input/output files that appear bare on the command line (and so
# must not be mistaken for compiler flags).
_INPUT_FILE_SUFFIXES = (*_CXX_SUFFIXES, ".c", ".o", ".S", ".s")
_INPUT_FILE_SUFFIXES = (*CXX_SOURCE_SUFFIXES, ".c", ".o", ".S", ".s")
# Path marker identifying an ESPHome source translation unit.
_ESPHOME_SRC_MARKER = "/src/esphome/"
@@ -63,11 +63,11 @@ def _is_esphome_src(file: str) -> bool:
"""Whether ``file`` is an ESPHome C++ translation unit; normalized to
``/`` first since Windows compile DBs use backslashes."""
return _ESPHOME_SRC_MARKER in file.replace("\\", "/") and file.endswith(
_CXX_SUFFIXES
CXX_SOURCE_SUFFIXES
)
def _split_command(command: str) -> list[str]:
def split_command(command: str) -> list[str]:
r"""Tokenize a compile_commands.json / response-file command string.
On Windows, tokenize per Windows ``argv`` rules via ``CommandLineToArgvW``.
@@ -103,7 +103,7 @@ def _split_command(command: str) -> list[str]:
ctypes.windll.kernel32.LocalFree(argv)
def _expand_response_files(tokens: list[str], directory: Path) -> list[str]:
def expand_response_files(tokens: list[str], directory: Path) -> list[str]:
"""Inline any ``@response-file`` arguments (paths relative to ``directory``).
GCC response files embed flags that must be expanded so GCC-only flags
@@ -118,8 +118,8 @@ def _expand_response_files(tokens: list[str], directory: Path) -> list[str]:
rf = directory / rf
try:
out.extend(
_expand_response_files(
_split_command(rf.read_text(encoding="utf-8")), directory
expand_response_files(
split_command(rf.read_text(encoding="utf-8")), directory
)
)
continue
@@ -138,7 +138,7 @@ def _pick_entry(entries: list[dict]) -> dict:
if _is_esphome_src(entry["file"]):
return entry
for entry in entries:
if entry["file"].endswith(_CXX_SUFFIXES):
if entry["file"].endswith(CXX_SOURCE_SUFFIXES):
return entry
raise ValueError("no C++ translation unit found in compile_commands.json")
@@ -148,7 +148,7 @@ def _pick_entry(entries: list[dict]) -> dict:
_LAUNCHER_STEMS = frozenset({"ccache", "sccache", "distcc", "icecc", "buildcache"})
def _is_launcher(token: str) -> bool:
def is_launcher(token: str) -> bool:
return Path(token).stem.lower() in _LAUNCHER_STEMS
@@ -166,7 +166,7 @@ def parse_entry(
) -> tuple[str, list[str], list[str], list[str]]:
"""Parse one compile_commands entry -> (cxx_path, defines, includes, cxx_flags)."""
directory = Path(entry["directory"])
tokens = _expand_response_files(_split_command(entry["command"]), directory)
tokens = expand_response_files(split_command(entry["command"]), directory)
def _include(raw: str) -> str:
# Resolve against the entry's ``directory`` so cached idedata works
@@ -182,7 +182,7 @@ def parse_entry(
if not tokens:
# An empty command, or one that was only the launcher; fail by name
raise ValueError(f"empty compile command for {entry.get('file')}")
if _is_launcher(tokens[0]) and len(tokens) > 1 and not tokens[1].startswith("-"):
if is_launcher(tokens[0]) and len(tokens) > 1 and not tokens[1].startswith("-"):
# Stale DB built with a launcher this run no longer configures; the
# real compiler is the next token
_LOGGER.warning("Stripping unconfigured launcher %s", tokens[0])
@@ -195,11 +195,23 @@ def parse_entry(
defines: list[str] = []
includes: list[str] = []
cxx_flags: list[str] = []
unresolved_force_includes: list[str] = []
it = iter(tokens[1:])
for tok in it:
if tok in ("-c", "-o"):
next(it, None) # drop the flag and its argument (input/output)
elif tok == "-include" or is_joined_include(tok):
# Re-anchor only names next to the compile (the pch); a name
# meant for the -I chain must stay untouched
raw = next(it, "") if tok == "-include" else tok[len("-include") :]
if not raw:
_LOGGER.warning("Dropping -include with no argument")
elif Path(resolved := _include(raw)).is_file():
cxx_flags.extend(("-include", resolved))
else:
unresolved_force_includes.append(raw)
cxx_flags.extend(("-include", raw))
elif tok.startswith("-D"):
# ``.strip()`` handles tokens like ``-D CONFIGURED=1`` (a single
# quoted arg with a space after -D) that some flags arrive as.
@@ -218,6 +230,14 @@ def parse_entry(
pass # input/output files
else:
cxx_flags.append(tok)
for raw in unresolved_force_includes:
# A deleted build artifact would otherwise surface only downstream
if not any((Path(inc) / raw).is_file() for inc in includes):
_LOGGER.warning(
"-include %s found neither next to the compile nor on the "
"include path; cached idedata may not resolve it",
raw,
)
return cxx_path, defines, includes, cxx_flags
@@ -282,7 +302,7 @@ def _cache_usable(cached: object) -> bool:
if not isinstance(cached, dict) or "cc_path" not in cached:
return False
cxx_path = cached.get("cxx_path")
if not isinstance(cxx_path, str) or _is_launcher(cxx_path):
if not isinstance(cxx_path, str) or is_launcher(cxx_path):
return False
includes = cached.get("includes")
return isinstance(includes, dict) and isinstance(includes.get("build"), list)
@@ -330,7 +350,7 @@ def load_or_build_idedata(
def reject_launcher_compiler(cxx_path: str) -> None:
"""Reject a compile DB naming a launcher (ccache) as the compiler; it
must never be probed, cached, or consumed."""
if _is_launcher(cxx_path):
if is_launcher(cxx_path):
raise EsphomeError(
f"compile_commands.json names the launcher {cxx_path} as the "
"compiler; the compile database is unusable"
+100 -50
View File
@@ -13,21 +13,25 @@ from pathlib import Path
import sys
from typing import TYPE_CHECKING
from esphome.build_helpers.idedata import is_joined_include
from esphome.build_helpers.ccache import effective_ccache_basedir
from esphome.build_helpers.ninja import (
escape as _e,
quote_path as _q,
shell_token as _shell_token,
)
from esphome.build_helpers.pch import (
PCH_GCH_NAME,
PCH_SUM_NAME,
log_pch_in_use,
pch_consumer_flags,
pch_identity,
pch_usable,
write_pch_headers,
PCH_HEADER_NAME,
mark_pch_emitted,
pch_checksum,
pch_consumer_escalation,
pch_degraded,
pch_disabled_degraded,
pch_enabled,
pch_header_text,
pch_probe_args,
pch_strict,
)
from esphome.core import CORE
from esphome.framework_helpers import strip_win_long_path_prefix
from esphome.helpers import write_file_if_changed
from esphome.platformio.library import SOURCE_KIND_FOR_SUFFIX
@@ -74,40 +78,33 @@ def tool_lines(
# path gets
f"python = {_q(strip_win_long_path_prefix(sys.executable))}",
f"buildtool = {_q(_BUILD_TOOL)}",
*([f"ccache = {_q(ccache)}"] if ccache else []),
f"ccache = {_q(ccache) if ccache else ''}",
"",
]
def compile_rule_lines(ccache: str | None) -> list[str]:
"""The compile rules; ``$own_includes`` is empty unless an edge sets it.
``ccache`` is the launcher ``tool_lines`` was given; the same test here
keeps the variable and the rules in step. It is spliced in rather than
left as an empty variable: a leading space on the command line makes
CreateProcess fail on Windows.
"""
launcher = "$ccache " if ccache else ""
def compile_rule_lines() -> list[str]:
"""The compile rules; ``$own_includes`` is empty unless an edge sets it."""
return [
"rule c",
f" command = {launcher}$cc -MMD -MF $out.d $own_includes $cflags $flags -c $in -o $out",
" command = $ccache $cc -MMD -MF $out.d $own_includes $cflags $flags -c $in -o $out",
" depfile = $out.d",
" deps = gcc",
" description = CC $out",
"rule cxx",
f" command = {launcher}$cxx -MMD -MF $out.d $own_includes $cxxflags $flags -c $in -o $out",
" command = $ccache $cxx -MMD -MF $out.d $own_includes $cxxflags $flags -c $in -o $out",
" depfile = $out.d",
" deps = gcc",
" description = CXX $out",
"rule aspp",
f" command = {launcher}$cc -MMD -MF $out.d -x assembler-with-cpp $own_includes $asflags $flags -c $in -o $out",
" command = $ccache $cc -MMD -MF $out.d -x assembler-with-cpp $own_includes $asflags $flags -c $in -o $out",
" depfile = $out.d",
" deps = gcc",
" description = AS $out",
# Plain assembler, as SCons's ASCOM: no preprocessor, so no
# depfile and no $flags (defines/includes) either
"rule asm",
f" command = {launcher}$cc -x assembler $asflags -c $in -o $out",
" command = $ccache $cc -x assembler $asflags -c $in -o $out",
" description = AS $out",
]
@@ -115,7 +112,8 @@ def compile_rule_lines(ccache: str | None) -> list[str]:
def pch_rule_lines() -> list[str]:
"""The precompiled header rule, for a generator that emits one."""
return [
# No $ccache: the .gch embeds build dir paths
# No $ccache: the .gch is compiled once per build dir and ccache
# cannot cache it usefully (its bytes embed build-dir paths)
"rule pch",
" command = $cxx -MMD -MF $out.d -x c++-header $cxxflags $flags -c $in -o $out",
" depfile = $out.d",
@@ -131,43 +129,97 @@ def pch_edges(
headers: Sequence[str],
cxxflags: Sequence[str],
src_flags: Sequence[str],
ccache: str | None,
identity: Sequence[str],
cxx: Sequence[Path | str],
) -> tuple[str, str] | None:
"""Emit the precompiled header for the C++ src edges.
``headers`` are folded into one prefix header, ``src_flags`` are the
flags every src edge carries, ``identity`` names what else the compile
depends on, the compiler included, and ``cxx`` is what the host rule
asks. Returns the ``cxx_override`` for ``compile_edges``, or None
without a pch.
flags every src edge carries, and ``identity`` names what the compile
depends on beyond the headers and flags (versioned install paths).
Returns the ``cxx_override`` for ``compile_edges``, or None when the
build goes without a precompiled header.
"""
if not pch_usable(cxx):
if not pch_enabled():
pch_disabled_degraded()
return None
if any(
tok == "-include" or tok.startswith("--include") or is_joined_include(tok)
for tok in cxxflags
):
# $cxxflags expands first and GCC only loads a .gch for the first
# -include
if any(tok.startswith("-include") for tok in cxxflags):
# $cxxflags expands first, so a user -include there means GCC would
# never load the .gch
_LOGGER.warning(
"A -include in the compiler flags prevents the precompiled header from "
"A -include in build_flags prevents the precompiled header from "
"loading; compiling without it"
)
pch_degraded("a user -include precedes the pch")
return None
log_pch_in_use()
source = write_pch_headers(build_dir, headers)
write_file_if_changed(
build_dir / PCH_SUM_NAME,
pch_identity([*cxxflags, *src_flags], src_dir, tuple(headers), identity) + "\n",
pch_header = build_dir / PCH_HEADER_NAME
pch_text = pch_header_text(headers)
checksum = None
try:
if ccache:
# The .sum exists only for CCACHE_PCH_EXTSUM; ninja's depfile
# handles staleness. Strip resolved and raw build paths
# (symlinks) so identical configs share cache entries
flags_id = (
" ".join(cxxflags)
.replace(effective_ccache_basedir(), "")
.replace(str(CORE.build_path), "")
)
# The header text covers include order
checksum = pch_checksum(src_dir, headers, (pch_text, *identity, flags_id))
except (OSError, UnicodeError) as err:
# Identity unknown: a stale cache entry must never be served
_LOGGER.warning(
"Could not establish the pch identity; compiling without it: %s", err
)
pch_degraded(f"identity unknown: {err}")
return None
_LOGGER.info(
"Compiling with a precompiled header (set ESPHOME_PCH_ENABLE=0 to disable)"
)
gch = _e(PCH_GCH_NAME)
# The checksum file changes with anything the .gch depends on
lines.append(f"build {gch}: pch {_e(source)} | {_e(PCH_SUM_NAME)}")
write_file_if_changed(pch_header, pch_text)
sum_path = build_dir / f"{PCH_HEADER_NAME}.gch.sum"
if checksum is not None:
# Generate-time stamp: a hand-run ninja can rebuild the .gch
# while this .sum lags
write_file_if_changed(sum_path, checksum + "\n")
else:
# A stale .sum from an earlier ccache run must not survive
sum_path.unlink(missing_ok=True)
gch = _e(f"{PCH_HEADER_NAME}.gch")
lines.append(f"build {gch}: pch {_e(pch_header)}")
if src_flags:
lines.append(f" flags = {' '.join(src_flags)}")
lines.append(f"srccxxflags = {' '.join([*src_flags, *pch_consumer_flags()])}")
return ("$srccxxflags", gch)
# Relative -include: absolute would break cross-device ccache.
# -Wno-error keeps a rejected .gch a warning under user -Werror;
# strict inverts it so any consumer rejection reds the build
# (rejection is per-process, so the probe alone cannot prove
# the consumers)
cxx_parts = [
*src_flags,
f"-Winvalid-pch {pch_consumer_escalation()} -include {PCH_HEADER_NAME}",
]
lines.append(f"srccxxflags = {' '.join(cxx_parts)}")
pch_dep = gch
if pch_strict():
# Consumers wait on the probe stamp, so an unloadable .gch
# reds the build here instead of warning ~100 times
probe = " ".join(pch_probe_args(PCH_HEADER_NAME, source=os.devnull))
lines.append("rule pchprobe")
# $out only expands in rule text, hence the inline stamp
lines.append(
f" command = $cxx $cxxflags $flags {probe}"
" && $python $buildtool touch $out"
)
lines.append(" description = PCHPROBE $out")
# Runs when the .gch is (re)built; strict consumer -Werror
# covers a cached .gch this process cannot load
lines.append(f"build esphome_pch.probe: pchprobe {gch}")
if src_flags:
lines.append(f" flags = {' '.join(src_flags)}")
pch_dep = f"{gch} esphome_pch.probe"
mark_pch_emitted()
return ("$srccxxflags", pch_dep)
def ar_rule_lines(ar: Path | str) -> list[str]:
@@ -214,12 +266,10 @@ def compile_edges(
def library_edges(
lines: list[str], libraries: list[ArduinoLibrary], extra_flags: str = ""
lines: list[str], libraries: list[ArduinoLibrary]
) -> tuple[list[str], list[str]]:
"""Emit every library's compile and archive edges.
``extra_flags`` (raw ninja text) precede each library's own flags.
Returns the archive names and the objects that link directly. A
library's own include dirs lead its compile lines, as PlatformIO searched
them first: the include path is one global list, so another library's
@@ -241,7 +291,7 @@ def library_edges(
lib.sources,
common_parent(lib.sources),
f"lib/{lib.name}",
flags=" ".join(filter(None, [extra_flags, *map(_shell_token, lib.flags)])),
flags=" ".join(_shell_token(f) for f in lib.flags),
own_includes=" ".join(f"-I{_q(d)}" for d in lib.include_dirs),
)
if not lib.lib_archive:
+455 -154
View File
@@ -1,62 +1,100 @@
"""Shared precompiled header policy for the build backends."""
"""Shared precompiled-header policy for the build backends.
The prefix either mirrors the TUs' own force-includes (ESP8266) or is a
curated core-header set (ESP-IDF). ``esphome: includes:`` sources receive
it too; Arduino.h visibility there is intended (esphome#8693).
"""
from __future__ import annotations
from collections.abc import Iterable, Sequence
from collections.abc import Iterable
from contextlib import suppress
from dataclasses import dataclass
import hashlib
import json
import logging
import os
from pathlib import Path
import posixpath
import re
import stat
import subprocess
import sys
from esphome.build_helpers.ccache import effective_ccache_basedir, parse_enable_env
from esphome.const import PLATFORM_NRF52
from esphome.helpers import write_file_if_changed
from esphome.build_helpers.idedata import (
CXX_SOURCE_SUFFIXES,
expand_response_files,
is_launcher,
split_command,
)
_DOMAIN = "pch"
@dataclass
class _PCHData:
emitted: bool = False
def _pch_data() -> _PCHData:
from esphome.core import CORE
if _DOMAIN not in CORE.data:
CORE.data[_DOMAIN] = _PCHData()
return CORE.data[_DOMAIN]
def mark_pch_emitted() -> None:
"""Record that this build's consumers reference the pch."""
_pch_data().emitted = True
_LOGGER = logging.getLogger(__name__)
# The header and its sidecars live in the build directory
# The header and its .gch/.sum sidecars live in the build directory.
PCH_HEADER_NAME = "esphome_pch.h"
PCH_GCH_NAME = f"{PCH_HEADER_NAME}.gch"
# ccache hashes this instead of the .gch; also the freshness stamp
PCH_SUM_NAME = f"{PCH_GCH_NAME}.sum"
# The include list the .gch is compiled from
PCH_SOURCE_NAME = "esphome_pch_src.h"
# GCC can skip a .gch without a diagnostic and read the header of the same
# name, so that header is an error. Other tools get the include list.
PCH_GUARD_TEXT = f"""\
#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTELLISENSE__)
#error "The precompiled header was not loaded"
#else
#include "{PCH_SOURCE_NAME}"
#endif
"""
# The cc1plus wrapper the PlatformIO script writes on arm64 macOS
PCH_CC1_DIR = "pch_cc1"
# What the PlatformIO script leaves in the project root, for cleanup
PCH_ARTIFACT_NAMES = (PCH_HEADER_NAME, PCH_GCH_NAME, PCH_SUM_NAME, PCH_SOURCE_NAME)
PCH_ARTIFACT_DIRS = (PCH_CC1_DIR,)
# The core headers every backend precompiles
PCH_DEFAULT_HEADERS = ("esphome/core/pch_prefix.h",)
# PlatformIO platforms that do not take the pch script
PCH_SCRIPT_EXCLUDED_PLATFORMS = frozenset(
{
PLATFORM_NRF52,
}
# Every artifact the pch machinery can leave behind, for cleanup.
PCH_ARTIFACT_NAMES = (
PCH_HEADER_NAME,
f"{PCH_HEADER_NAME}.gch",
f"{PCH_HEADER_NAME}.gch.sum",
f"{PCH_HEADER_NAME}.gch.failed",
)
# What ccache needs to cache compiles that load a .gch
_CCACHE_PCH_SLOPPINESS = ("pch_defines", "time_macros")
# The core defines header every backend anchors its prefix on.
PCH_CORE_HEADER = "esphome/core/defines.h"
# Prefix-header contents for backends that inject a curated set (rather
# than mirroring the TUs' own force-includes), defines.h first so USE_*
# macros exist for the rest. Deliberately hard-coded: frequency-derived
# sets measured no better and kept selecting headers that cannot compile
# standalone (X-macro, platform-variant). Every entry must be safe to
# include first in an empty TU. Caveat: application.h/automation.h become
# ambiently visible, so a TU missing those #includes still builds on such
# backends; ESPHOME_PCH_ENABLE=0 restores the strict view.
PCH_DEFAULT_HEADERS = (
PCH_CORE_HEADER,
"esphome/core/component.h",
"esphome/core/helpers.h",
"esphome/core/log.h",
"esphome/core/application.h",
"esphome/core/automation.h",
)
# ccache cannot hash through a .gch; CCACHE_PCH_EXTSUM makes it hash the
# .sum sidecar instead of the .gch bytes, which are not reproducible.
# Keep in sync with the literals in platformio/pch.py.script.
_CCACHE_PCH_ENV = {
"CCACHE_SLOPPINESS": "pch_defines,time_macros",
"CCACHE_PCH_EXTSUM": "true",
}
# Both include forms: an angle include resolving under src/ must enter the
# digest too; ones that do not resolve simply end the walk
# Compiler failures that clear on their own must not latch the .failed marker
_TRANSIENT_ERRORS = ("No space left", "Cannot allocate", "Resource temporarily")
# Both include forms: an angle include resolving under src/ enters the digest
_INCLUDE_RE = re.compile(rb'^\s*#\s*include\s+["<]([^">]+)[">]', re.MULTILINE)
@@ -65,104 +103,92 @@ def pch_enabled() -> bool:
return parse_enable_env("ESPHOME_PCH_ENABLE") is not False
def pch_forced() -> bool:
"""``ESPHOME_PCH_ENABLE=1``: wanted even where the host rule says no."""
return parse_enable_env("ESPHOME_PCH_ENABLE") is True
def pch_strict() -> bool:
"""CI knob: ``ESPHOME_PCH_STRICT=1`` turns pch degrade paths fatal.
A set-but-unrecognized value raises: a typo must not silently turn
the gate into a no-op that proves nothing.
"""
return parse_enable_env("ESPHOME_PCH_STRICT", strict=True) is True
# GCC bug 14940: before these releases the Windows loader maps a .gch only
# at its saved address. First fixed release per major, 16 on always fixed;
# PCH_WINDOWS_CMAKE_OLD_GCC and the pch_usable message spell the same table
PCH_WINDOWS_GCC_FIXED = {14: (14, 4), 15: (15, 3)}
PCH_WINDOWS_GCC_FIXED_DEFAULT = (16, 0)
# The same rule for CMake, which alone knows the version before configure
PCH_WINDOWS_CMAKE_OLD_GCC = (
"CMAKE_CXX_COMPILER_VERSION VERSION_LESS 14.4 OR "
"(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 15 AND "
"CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.3)"
)
def pch_degraded(reason: str) -> None:
"""Every degrade path funnels through here; strict mode raises."""
if pch_strict():
from esphome.core import EsphomeError
raise EsphomeError(f"ESPHOME_PCH_STRICT: {reason}")
def gcc_relocates_pch_on_windows(version: Sequence[int]) -> bool:
"""Whether a GCC of this version loads a .gch on Windows."""
if not version:
return False
fixed = PCH_WINDOWS_GCC_FIXED.get(version[0], PCH_WINDOWS_GCC_FIXED_DEFAULT)
return tuple(version[:2]) >= fixed
def pch_disabled_degraded() -> None:
"""Strict CI must not read "no pch at all" as success."""
pch_degraded("pch disabled by ESPHOME_PCH_ENABLE")
# GCC ends the first --version line with its version; clang names itself
_VERSION_RE = re.compile(r"\d+(?:\.\d+)+")
def pch_probe_tail(source: str = "-") -> list[str]:
"""The syntax-only compile shared by the probe and its baseline."""
return ["-fsyntax-only", "-x", "c++", source]
def gcc_version(cxx: Sequence[Path | str]) -> tuple[int, ...] | None:
"""The GCC version from ``--version``: () when it cannot be read, None
for a compiler that is not GCC."""
try:
result = subprocess.run(
[*cxx, "--version"], capture_output=True, text=True, check=False
)
except OSError as err:
_LOGGER.debug("Cannot run %s: %s", cxx[0], err)
return ()
banner = result.stdout.partition("\n")[0]
if "clang" in banner.lower():
return None
found = _VERSION_RE.findall(banner)
return tuple(int(part) for part in found[-1].split(".")) if found else ()
def pch_probe_args(header: str, source: str = "-") -> list[str]:
"""Flags that load-check a built .gch via a syntax-only compile.
Rejection must be a nonzero exit (never just a wording match), so the
invalid-pch class is always escalated. ``source`` defaults to stdin
(host independent); the ninja probe edge passes a real file.
"""
return [
"-Winvalid-pch",
"-Werror=invalid-pch",
"-include",
header,
*pch_probe_tail(source),
]
def pch_needs_gcc_check() -> bool:
"""Windows host with the knob unset: the compiler version decides."""
return sys.platform == "win32" and parse_enable_env("ESPHOME_PCH_ENABLE") is None
def pch_usable(cxx: Sequence[Path | str]) -> bool:
"""The knob plus the host rule; ``ESPHOME_PCH_ENABLE=1`` skips the rule."""
if not pch_enabled():
return False
if not pch_needs_gcc_check():
return True
version = gcc_version(cxx)
if version is None or gcc_relocates_pch_on_windows(version):
return True
_LOGGER.info(
"GCC %s cannot load a precompiled header on Windows (GCC bug 14940, "
"fixed in 14.4, 15.3 and 16); compiling without it "
"(set ESPHOME_PCH_ENABLE=1 to force)",
".".join(map(str, version)) or "of unknown version",
)
return False
def pch_consumer_flags() -> list[str]:
"""Flags a C++ src compile loads the pch with. The -include stays
relative: an absolute path would enter the ccache key."""
return ["-Winvalid-pch", "-Werror=invalid-pch", "-include", PCH_HEADER_NAME]
def pch_consumer_escalation() -> str:
"""Consumer-side invalid-pch flag: strict reds the build on rejection
(per-process, so the probe alone cannot prove the consumers)."""
return "-Werror=invalid-pch" if pch_strict() else "-Wno-error=invalid-pch"
def ccache_pch_env() -> dict[str, str]:
"""What ccache needs to cache compiles that load a .gch, added to what
the user already set."""
if not pch_enabled():
"""Settings ccache needs to cache compiles that consume the .gch;
empty unless this build actually emitted one. User-set values win.
Native backends export these process-wide; only time_macros affects
non-pch TUs."""
if not (pch_enabled() and _pch_data().emitted):
return {}
sloppiness = [
item.strip()
for item in os.environ.get("CCACHE_SLOPPINESS", "").split(",")
if item.strip()
]
sloppiness += [item for item in _CCACHE_PCH_SLOPPINESS if item not in sloppiness]
env = {"CCACHE_SLOPPINESS": ",".join(sloppiness)}
if "CCACHE_PCH_EXTSUM" not in os.environ:
env["CCACHE_PCH_EXTSUM"] = "true"
extsum = os.environ.get("CCACHE_PCH_EXTSUM")
if extsum is not None and extsum.strip().lower() not in ("1", "true", "yes", "on"):
# ccache then hashes the non-reproducible .gch bytes: permanent misses
_LOGGER.warning("CCACHE_PCH_EXTSUM=%s disables pch caching", extsum)
env = {k: v for k, v in _CCACHE_PCH_ENV.items() if k not in os.environ}
user_sloppiness = os.environ.get("CCACHE_SLOPPINESS")
if user_sloppiness is not None and (
missing := [
t
for t in ("pch_defines", "time_macros")
if t not in {tok.strip() for tok in user_sloppiness.split(",")}
]
):
# Without these ccache declines every pch-consuming compile
env["CCACHE_SLOPPINESS"] = ",".join((user_sloppiness, *missing))
_LOGGER.warning(
"Adding %s to CCACHE_SLOPPINESS so ccache can cache compiles "
"that use the precompiled header",
",".join(missing),
)
return env
def pch_script_enabled() -> bool:
"""Whether this PlatformIO build takes the pch script."""
from esphome.core import CORE
return pch_enabled() and CORE.target_platform not in PCH_SCRIPT_EXCLUDED_PLATFORMS
def pch_extra_scripts() -> list[str]:
"""The extra_scripts entries a PlatformIO platform registers for the
pch; empty when disabled (the script itself has no enable check)."""
if not pch_enabled():
pch_disabled_degraded()
return []
return ["post:pch.py"]
def pch_header_text(include_headers: Iterable[str]) -> str:
@@ -170,21 +196,21 @@ def pch_header_text(include_headers: Iterable[str]) -> str:
return "".join(f'#include "{name}"\n' for name in include_headers)
def write_pch_headers(build_dir: Path, include_headers: Iterable[str]) -> Path:
"""Write the guard header and the include list; return the latter,
which is what the .gch compiles from."""
write_file_if_changed(build_dir / PCH_HEADER_NAME, PCH_GUARD_TEXT)
source = build_dir / PCH_SOURCE_NAME
write_file_if_changed(source, pch_header_text(include_headers))
return source
def _resolves(path: Path) -> bool:
"""False when missing; other stat failures propagate (identity unknown,
unlike is_file(), which would silently drop the header)."""
try:
return stat.S_ISREG(path.stat().st_mode)
except (FileNotFoundError, NotADirectoryError):
return False
def _include_closure(src_dir: Path, roots: Iterable[str]) -> dict[str, bytes]:
"""Include closure of ``roots``: src-relative name -> contents.
Resolution mirrors the compiler (includer's dir, then src root). No
#ifdef evaluation: including too much is the safe direction. Headers
outside ``src_dir`` are covered by the version strings of the caller.
Resolution mirrors the compiler (includer's dir, then src root); names
outside ``src_dir`` end the walk and are versioned by the caller. No
#ifdef evaluation: over-approximating is the safe direction.
"""
seen: dict[str, bytes] = {}
stack: list[tuple[str, str]] = [(name, "") for name in roots]
@@ -192,57 +218,332 @@ def _include_closure(src_dir: Path, roots: Iterable[str]) -> dict[str, bytes]:
name, from_dir = stack.pop()
for candidate in (f"{from_dir}/{name}" if from_dir else name, name):
rel = posixpath.normpath(candidate)
if not rel.startswith("..") and (src_dir / rel).is_file():
if not rel.startswith("..") and _resolves(src_dir / rel):
break
else:
continue
if rel in seen:
continue
data = seen[rel] = (src_dir / rel).read_bytes()
try:
data = (src_dir / rel).read_bytes()
except OSError as err:
# A marker would truncate the transitive walk; fail closed
_LOGGER.warning("Could not read %s for the pch checksum: %s", rel, err)
raise
seen[rel] = data
parent = posixpath.dirname(rel)
stack.extend((inc.decode(), parent) for inc in _INCLUDE_RE.findall(data))
stack.extend(
# surrogateescape: a non-UTF-8 name just fails to resolve
(inc.decode(errors="surrogateescape"), parent)
for inc in _INCLUDE_RE.findall(data)
)
return seen
def pch_checksum(
src_dir: Path, include_headers: Iterable[str], extra: Iterable[str]
) -> str:
"""Digest of the prefix header's include closure plus ``extra``."""
"""Digest standing in for the .gch in ccache's hash: the include closure
of the prefix header plus caller-supplied identity strings (versioned
install paths, flags). Raises OSError when a header's identity cannot
be established at all; callers must then compile without a pch."""
digest = hashlib.sha256()
closure = _include_closure(src_dir, include_headers)
for name in sorted(closure):
digest.update(name.encode())
digest.update(name.encode(errors="surrogateescape"))
digest.update(closure[name])
digest.update(b"\0")
for item in extra:
digest.update(item.encode())
digest.update(item.encode(errors="surrogateescape"))
digest.update(b"\0")
return digest.hexdigest()
def pch_identity(
tokens: Iterable[str],
src_dir: Path,
include_headers: tuple[str, ...],
extra: Iterable[str],
) -> str:
"""The .sum digest: include closure, header text, ``extra`` and the
compile flags with the build path stripped, as ccache does."""
# Tokens dropped when retargeting a TU's flags at the prefix header
# (the pch compile must not touch depfiles)
_PCH_STRIP_FLAGS_WITH_ARG = frozenset({"-o", "-c", "-MT", "-MF", "-MQ"})
_PCH_STRIP_FLAGS = frozenset({"-MD", "-MMD", "-MP", "-MM", "-M"})
def pch_compile_command(
build_dir: Path, header: Path, gch: Path
) -> tuple[list[str], Path] | None:
"""The exact src C++ flags from compile_commands.json retargeted at the
header, with the directory they resolve against (relative -I paths must
be expanded and executed from the same root); None (logged) when no
configured C++ TU is available yet."""
from esphome.core import CORE
flags = (
" ".join(tokens)
.replace(str(CORE.build_path), "")
try:
entries = json.loads(
(build_dir / "compile_commands.json").read_text(encoding="utf-8")
)
except (OSError, json.JSONDecodeError) as err:
# Configure already succeeded, so an unusable DB is a real anomaly
_LOGGER.warning("No usable compile database, skipping pch: %s", err)
return None
if not isinstance(entries, list):
_LOGGER.warning("Malformed compile database, skipping pch")
return None
# CMake may spell paths through a symlink differently than CORE does
# (macOS /tmp vs /private/tmp), so compare resolved paths
src_root = Path(CORE.relative_src_path()).resolve()
entry = next(
(
e
for e in entries
if isinstance(e, dict)
and isinstance(e.get("file"), str)
and e["file"].endswith(CXX_SOURCE_SUFFIXES)
and Path(e["file"]).resolve().is_relative_to(src_root)
),
None,
)
if entry is None:
_LOGGER.warning("No src C++ entry in the compile database, skipping pch")
return None
directory = entry.get("directory")
cmd_dir = Path(directory) if isinstance(directory, str) and directory else build_dir
command = entry.get("command")
tokens = expand_response_files(
split_command(command if isinstance(command, str) else ""), cmd_dir
)
# A DB recorded with ccache enabled prefixes the compiler with the
# launcher; the .gch must be compiled directly
if tokens and is_launcher(tokens[0]):
tokens = tokens[1:]
if not tokens:
# "arguments"-style or empty entries must skip, not spawn "-x ..."
_LOGGER.warning("Compile database entry has no usable command, skipping pch")
return None
args: list[str] = []
arg_it = iter(tokens)
for tok in arg_it:
if tok in _PCH_STRIP_FLAGS_WITH_ARG:
next(arg_it, None)
continue
if tok in _PCH_STRIP_FLAGS:
continue
if tok == "-include":
# Drop only the injected prefix; user force-includes must reach
# the .gch compile or GCC rejects it over the macro mismatch
inc = next(arg_it, "")
if not inc.endswith(PCH_HEADER_NAME):
args.extend(("-include", inc))
continue
args.append(tok)
return [*args, "-x", "c++-header", "-c", str(header), "-o", str(gch)], cmd_dir
def _log_pch_in_use() -> None:
# The only place a user can discover the knob; emitted only once a
# .gch is actually fresh or being built
_LOGGER.info(
"Compiling with a precompiled header (set ESPHOME_PCH_ENABLE=0 to disable)"
)
def _read_stamp(path: Path) -> str:
"""A corrupt sidecar must read as stale, not kill the pch forever."""
try:
return path.read_text(encoding="utf-8").strip()
except (OSError, UnicodeDecodeError):
return ""
def discard_pch(build_dir: Path) -> None:
"""Remove the pch sidecars so a stale .gch is never consumed.
Bumps the header only when a .gch was actually removed: TUs compiled
against it have incomplete depfiles, while a repeat failure with no
.gch must not force a full rebuild every build. A .gch that survives
an unlink failure would be consumed silently (wrong output, not a
slow build), so that raises.
"""
header = build_dir / PCH_HEADER_NAME
gch = Path(f"{header}.gch")
had_gch = gch.is_file()
errors = []
for sidecar in (gch, Path(f"{gch}.sum")):
try:
sidecar.unlink(missing_ok=True)
except OSError as err:
if sidecar.is_file():
from esphome.core import EsphomeError
raise EsphomeError(
f"Could not discard the stale precompiled header: {err}"
) from err
errors.append(err)
for err in errors:
_LOGGER.warning("Could not discard the pch sidecars: %s", err)
if had_gch and header.is_file():
with suppress(OSError):
os.utime(header)
def prepare_pch(
build_dir: Path, include_headers: tuple[str, ...], extra: Iterable[str]
) -> None:
"""Compile ``build_dir``'s .gch from compile_commands.json flags and
write its ccache .sum.
The .sum doubles as the freshness stamp and folds in the compile
command, so a flag-only change rebuilds the .gch; ``extra`` carries
backend identity (framework version, sdkconfig, ...). A failed
compile falls back to the plain header include.
"""
from esphome.core import CORE
header = build_dir / PCH_HEADER_NAME
gch = Path(f"{header}.gch")
sum_path = Path(f"{gch}.sum")
cmd_and_dir = pch_compile_command(build_dir, header, gch)
if cmd_and_dir is None:
# Freshness cannot be validated; a leftover .gch must not be consumed
discard_pch(build_dir)
pch_degraded("no usable compile command")
return
cmd, cmd_dir = cmd_and_dir
# Strip like ccache's rewriting (user CCACHE_BASEDIR wins); the raw
# build path covers unresolved (symlinked) spellings
cmd_id = (
" ".join(cmd)
.replace(effective_ccache_basedir(), "")
.replace(str(CORE.build_path), "")
)
# The closure is sorted, so header order only enters via the text
return pch_checksum(
src_dir, include_headers, (pch_header_text(include_headers), *extra, flags)
)
try:
checksum = pch_checksum(
CORE.relative_src_path(),
include_headers,
(
# The closure is sorted, so root order only enters via the text
pch_header_text(include_headers),
*extra,
cmd_id,
),
)
except (OSError, UnicodeError) as err:
# Identity unknown: a stale cache entry must never be served
_LOGGER.warning(
"Could not establish the pch identity; compiling without it: %s", err
)
discard_pch(build_dir)
pch_degraded(f"identity unknown: {err}")
return
failed_marker = Path(f"{gch}.failed")
def _run(
run_cmd: list[str], what: str, stdin: str | None = None
) -> subprocess.CompletedProcess | None:
"""Spawn one pch tool step; environmental failures discard and
degrade (None): spawn/IO/timeout errors and signal kills never
latch the marker."""
try:
proc = subprocess.run(
run_cmd,
cwd=cmd_dir,
# C locale keeps diagnostics matchable by _TRANSIENT_ERRORS
env={**os.environ, "LC_ALL": "C"},
input=stdin,
capture_output=True,
text=True,
check=False,
timeout=300,
)
except (OSError, subprocess.SubprocessError) as err:
_LOGGER.warning("Precompiled header %s did not run: %s", what, err)
discard_pch(build_dir)
pch_degraded(f"{what} did not run: {err}")
return None
if proc.returncode < 0:
# Killed by a signal (OOM, ^C): environmental, do not latch
_LOGGER.warning(
"Precompiled header %s was killed (signal %d); retrying next build",
what,
-proc.returncode,
)
discard_pch(build_dir)
pch_degraded(f"{what} killed by signal {-proc.returncode}")
return None
return proc
_DISABLE_HINT = " (set ESPHOME_PCH_ENABLE=0 to disable)"
def _fail(error: str, reason: str, latch: bool) -> None:
"""Discard and degrade; deterministic failures latch when asked."""
_LOGGER.warning(
"Precompiled header failed; compiling without it: %s", error[:400]
)
# Latching paths keep the full compiler output recoverable
_LOGGER.debug("Full pch output: %s", error)
discard_pch(build_dir)
if latch and not any(m in error for m in _TRANSIENT_ERRORS):
# Skip retries until a header/flag/backend-identity/command change
failed_marker.write_text(checksum + "\n", encoding="utf-8")
os.utime(header)
pch_degraded(f"{reason}: {error[:200]}")
def _probe(latch: bool = True) -> None:
"""Load-check the built .gch: some toolchains build one they then
refuse to load (per-process ASLR). Dep flags are already stripped
from cmd, so no -MF is needed; cmd ends with the fixed
"-x c++-header -c -o" tail. A cached-header rejection may not
reproduce (per-process), so that caller passes latch=False."""
if cmd[-6:-4] != ["-x", "c++-header"]:
# The slice below depends on pch_compile_command's fixed tail
_LOGGER.warning("Unexpected pch command shape: %s", cmd[-6:])
discard_pch(build_dir)
pch_degraded("unexpected pch command shape")
return
base = cmd[:-6]
probe = _run([*base, *pch_probe_args(str(header))], "probe", stdin="")
if probe is None:
return
if probe.returncode != 0:
# Disambiguate: only blame the pch when the same compile passes
# without it; a failing baseline is its own (latchable) problem
baseline = _run([*base, *pch_probe_tail()], "probe baseline", stdin="")
if baseline is None:
return
if baseline.returncode == 0:
error = probe.stderr.strip() or f"exit code {probe.returncode}"
_fail(error, "toolchain cannot load the pch", latch=latch)
else:
error = baseline.stderr.strip() or f"exit code {baseline.returncode}"
_fail(error, "probe cannot run at all", latch=latch)
def log_pch_in_use() -> None:
_LOGGER.info("Compiling with a precompiled header%s", _DISABLE_HINT)
if gch.is_file() and _read_stamp(sum_path) == checksum:
_log_pch_in_use()
if pch_strict():
# Rejection is per-process, so a cached .gch must re-prove
# loadability for the strict gate (CI-only cost); no latch,
# since the rejection may not reproduce either
_probe(latch=False)
return
if _read_stamp(failed_marker) == checksum:
_LOGGER.info(
"Precompiled header disabled after an earlier failure; delete %s to retry",
failed_marker,
)
pch_degraded("earlier failure latched")
return
_log_pch_in_use()
result = _run(cmd, "compile")
if result is None:
return
error = None
if result.returncode != 0:
error = result.stderr.strip() or f"exit code {result.returncode}"
elif not gch.is_file():
error = "compiler produced no .gch"
if error is not None:
_fail(error, "compile failed", latch=True)
return
_probe()
if not gch.is_file():
# The probe discarded a rejected or unrunnable .gch
return
failed_marker.unlink(missing_ok=True)
sum_path.write_text(checksum + "\n", encoding="utf-8")
# Consumers depend on the header (depfiles cannot see through a .gch);
# bump it so users of the previous .gch recompile
os.utime(header)
-180
View File
@@ -1,180 +0,0 @@
"""Run a native build tool (cmake, ninja) and relay its output.
Output is read from a pipe so it can be filtered here: a child that inherits
our stdout writes straight to the file descriptor, past any Python wrapper.
"""
from __future__ import annotations
import codecs
from contextlib import suppress
import logging
import os
from pathlib import Path
import re
import shutil
import subprocess
import sys
from typing import Any, TextIO
from esphome.util import ANSI_ESCAPE, RedirectText, shlex_quote
_LOGGER = logging.getLogger(__name__)
# Windows code page identifier for UTF-8, as used by ``chcp 65001``.
UTF8_CODEPAGE = 65001
# Same pattern idf.py uses to spot ninja status lines (``is_progression``).
_PROGRESS = re.compile(r"^\[\d+/\d+\]|.*\(\d+ \%\)$")
_READ_SIZE = 65536
def _get_kernel32() -> Any | None:
"""Return the Windows kernel32 module, or None on any other platform."""
if sys.platform != "win32":
return None
import ctypes
return ctypes.windll.kernel32
class Utf8Console:
"""Keep an attached Windows console on UTF-8 while a build tool runs.
esp_idf_size draws its table with Unicode box characters, and CMake
re-decodes a child's output with the console code page, which garbles the
table on any page but UTF-8. A console already on UTF-8 is left alone so
an overlapping build never records UTF-8 as the page to go back to.
"""
def __init__(self, kernel32: Any | None) -> None:
self._kernel32 = kernel32
self._codepages: tuple[int, int] | None = None
def __enter__(self) -> None:
kernel32 = self._kernel32
if kernel32 is None:
return
old_in = kernel32.GetConsoleCP()
old_out = kernel32.GetConsoleOutputCP()
# Both calls return 0 when no console is attached.
if not old_in or not old_out:
return
if old_in == UTF8_CODEPAGE and old_out == UTF8_CODEPAGE:
return
# Record first so a switch that fails part way is still undone.
self._codepages = (old_in, old_out)
kernel32.SetConsoleCP(UTF8_CODEPAGE)
kernel32.SetConsoleOutputCP(UTF8_CODEPAGE)
def __exit__(self, *exc_info: object) -> None:
if self._codepages is None:
return
old_in, old_out = self._codepages
self._codepages = None
self._kernel32.SetConsoleCP(old_in)
self._kernel32.SetConsoleOutputCP(old_out)
def _fit_terminal(text: str) -> str:
"""Elide the middle of ``text`` to fit the terminal, as idf.py does.
A width of 0 (a pipe, the dashboard) leaves the text whole.
"""
width = shutil.get_terminal_size((0, 0)).columns
if not width:
return text
if width <= 3:
return "." * width
if len(text) >= width:
keep = (width - 3) // 2
return f"{text[:keep]}...{text[len(text) - keep :]}"
return text
class ToolOutput(RedirectText):
"""RedirectText that can collapse ninja status lines into one line.
With ``progress`` each ``[n/m]`` line overwrites the previous one, the
way idf.py shows a build.
"""
def __init__(
self, out: TextIO, filter_lines: list[str] | None, progress: bool
) -> None:
super().__init__(out, filter_lines=filter_lines)
self._progress = progress
self._on_progress_line = False
def _splits_lines(self) -> bool:
return self._progress or super()._splits_lines()
def _emit_line(self, line: str) -> None:
if self._progress and _PROGRESS.match(line):
if not self._is_filtered(line):
text = _fit_terminal(line.strip("\r\n"))
self._write_color_replace(f"\r{text}\x1b[K")
self._on_progress_line = True
return
self._end_progress_line()
super()._emit_line(line)
def _end_progress_line(self) -> None:
if self._on_progress_line:
self._on_progress_line = False
self._write_color_replace(os.linesep)
def drain(self) -> None:
super().drain()
# Called from cleanup, so a broken stream must not hide the exit code.
with suppress(OSError, ValueError):
self._end_progress_line()
self._out.flush()
def run_build_tool(
cmd: list[str],
*,
cwd: Path,
env: dict[str, str],
filter_lines: list[str] | None = None,
progress: bool = False,
log_path: Path | None = None,
) -> int:
"""Run ``cmd`` and relay stdout and stderr, merged, to our stdout.
``log_path`` also gets the full, unfiltered output without color codes, as
idf.py wrote its logs (its hint patterns expect plain text). Returns the
exit code.
"""
_LOGGER.debug("Running: %s", " ".join(shlex_quote(arg) for arg in cmd))
_LOGGER.debug(" in directory: %s", cwd)
output = ToolOutput(sys.stdout, filter_lines, progress)
decoder = codecs.getincrementaldecoder("utf-8")(errors="replace")
if log_path is not None:
log_path.parent.mkdir(parents=True, exist_ok=True)
with (
Path(log_path or os.devnull).open("w", encoding="utf-8", newline="") as log,
Utf8Console(_get_kernel32()),
subprocess.Popen(
cmd,
cwd=cwd,
env=env,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
close_fds=False,
) as proc,
):
try:
# read1 returns as soon as anything is available, so output
# streams while the tool runs.
while chunk := proc.stdout.read1(_READ_SIZE):
text = decoder.decode(chunk)
log.write(ANSI_ESCAPE.sub("", text))
output.write(text)
if tail := decoder.decode(b"", final=True):
log.write(ANSI_ESCAPE.sub("", tail))
output.write(tail)
finally:
output.drain()
return proc.returncode
+2 -5
View File
@@ -16,8 +16,8 @@ def tools_cache_path(env_var: str, subdir: str) -> Path:
from esphome.helpers import get_str_env
if prefix := get_str_env(env_var, "").strip():
# resolve(): a symlinked prefix would otherwise record a second
# spelling of the same paths in the build tree
# resolve(): symlinked prefixes otherwise trip idf.py's
# venv-mismatch warning on every build
return Path(prefix).expanduser().resolve()
# appauthor=False keeps the Windows path short (no vendor segment);
# deep IDF trees run into MAX_PATH otherwise
@@ -35,12 +35,9 @@ SDK_NRF_TOOLS_CACHE = ("ESPHOME_SDK_NRF_PREFIX", "sdk-nrf")
ARDUINO8266_TOOLS_CACHE = ("ESPHOME_ARDUINO8266_PREFIX", "arduino8266")
# The host backend installs nothing; the entry only holds its ccache dir
HOST_TOOLS_CACHE = ("ESPHOME_HOST_PREFIX", "host")
# PlatformIO installs into its own dirs; the entry is its ccache dir itself
PLATFORMIO_CCACHE = ("ESPHOME_PLATFORMIO_CCACHE_DIR", "platformio-ccache")
TOOLS_CACHE_SPECS = (
IDF_TOOLS_CACHE,
SDK_NRF_TOOLS_CACHE,
ARDUINO8266_TOOLS_CACHE,
HOST_TOOLS_CACHE,
PLATFORMIO_CCACHE,
)
+12 -20
View File
@@ -102,21 +102,25 @@ _KNOWN_FILE_EXTENSIONS = frozenset(
)
# Matches !secret references in YAML text. An optional surrounding
# quote pair around the key is allowed and ignored: YAML treats
# ``!secret 'foo'`` and ``!secret foo`` as the same key. This is
# intentionally a simple regex scan rather than a YAML parse — it may
# match inside comments or multi-line strings, which is the conservative
# direction (include more secrets rather than fewer).
_SECRET_RE = re.compile(r"""!secret\s+['"]?([^\s'"]+)""")
def _find_used_secret_keys(yaml_files: list[Path]) -> set[str]:
"""Scan YAML files for ``!secret <key>`` references."""
keys: set[str] = set()
for fpath in yaml_files:
try:
text = fpath.read_text(encoding="utf-8")
except (OSError, UnicodeDecodeError) as err:
_LOGGER.warning(
"Could not scan %s for !secret references (%s); the bundled "
"secret set may be incomplete",
fpath,
err,
)
except (OSError, UnicodeDecodeError):
continue
keys |= yaml_util.find_secret_references(text)
for match in _SECRET_RE.finditer(text):
keys.add(match.group(1))
return keys
@@ -418,18 +422,6 @@ class ConfigBundleCreator:
must ship every candidate so the remote build can pick any one.
"""
discovered = yaml_util.discover_user_yaml_files(self._config_path)
if discovered.load_errors:
_LOGGER.warning(
"Bundle may be incomplete; could not load all configuration files: %s",
"; ".join(discovered.load_errors),
)
if discovered.unresolved:
_LOGGER.warning(
"Bundle may be incomplete; %d !include path(s) use "
"substitutions and cannot be captured: %s",
len(discovered.unresolved),
", ".join(discovered.unresolved),
)
self._secrets_paths.update(discovered.secrets)
# A !secret inside a file this re-parse does not reach (for example
# a git-fetched package the builder re-fetches) still resolves
-2
View File
@@ -1,2 +0,0 @@
"""Commands of the esphome command line, one module each, imported by
__main__ only when they run so that startup stays light."""
-164
View File
@@ -1,164 +0,0 @@
"""``esphome rename``."""
from __future__ import annotations
import argparse
from pathlib import Path
import re
from esphome import yaml_edit, yaml_util
from esphome.const import (
ALLOWED_NAME_CHARS,
CONF_ESPHOME,
CONF_NAME,
CONF_SUBSTITUTIONS,
)
from esphome.core import CORE, EsphomeError
from esphome.log import AnsiFore, color
from esphome.types import ConfigType
from esphome.util import ESPHOME_COMMAND, run_external_process, safe_print
def _revert(new_path: Path, why: str) -> int:
"""Say why the rename stopped and take the new file back; an orphan the
next attempt would trip over is reported."""
safe_print(color(AnsiFore.BOLD_RED, f"Rename failed: {why}"))
try:
new_path.unlink(missing_ok=True)
except OSError as err:
safe_print(color(AnsiFore.BOLD_RED, f"Could not remove {new_path}: {err}"))
return 1
def command_rename(args: argparse.Namespace, config: ConfigType) -> int | None:
"""Rename the device: a new file with the name line rewritten, validated
and installed, then the old file removed."""
new_name = args.name
for c in new_name:
if c not in ALLOWED_NAME_CHARS:
safe_print(
color(
AnsiFore.BOLD_RED,
f"'{c}' is an invalid character for names. Valid characters are: "
f"{ALLOWED_NAME_CHARS} (lowercase, no spaces)",
)
)
return 1
yaml = yaml_util.load_yaml(CORE.config_path)
def name_edit() -> tuple[str, yaml_edit.LineEdit]:
"""The name and the line to rewrite: the name's own line, or the
substitution's line it comes from, as a plain value in this file."""
esphome_conf = yaml.get(CONF_ESPHOME)
if not isinstance(esphome_conf, dict) or CONF_NAME not in esphome_conf:
raise EsphomeError(f"no '{CONF_ESPHOME}: {CONF_NAME}:' in the file")
old_name = str(esphome_conf[CONF_NAME])
mapping, field = esphome_conf, CONF_NAME
if match := re.match(r"^\$\{?([a-zA-Z0-9_]+)\}?$", old_name):
mapping, field = yaml.get(CONF_SUBSTITUTIONS), match.group(1)
if not isinstance(mapping, dict) or field not in mapping:
raise EsphomeError(f"the substitution '{field}' is not in the file")
old_name = str(mapping[field])
# Only read here; the rewritten text goes to a new file, so the
# source may live anywhere the config path points to
source = yaml_edit.source_of(mapping, field)
if source is None or source[0].resolve() != CORE.config_path.resolve():
raise EsphomeError(f"'{field}' was not read from {CORE.config_path}")
doc, line_no = source
text = yaml_edit.line_at(doc, line_no)
if (line_match := yaml_edit.field_line_re(field, old_name).match(text)) is None:
raise EsphomeError(f"'{field}' is not a plain value on {doc}:{line_no + 1}")
# The new value is always quoted, whatever the old line had
return old_name, yaml_edit.LineEdit(
doc, line_no, text, yaml_edit.rewrite(line_match, new_name, '"')
)
try:
old_name, edit = name_edit()
except EsphomeError as err:
safe_print(
color(
AnsiFore.BOLD_RED,
f"Complex YAML files cannot be automatically renamed: {err}",
)
)
return 1
# ``new_name == old_name`` (after substitution resolution) is
# a no-op rewrite that would still queue a pointless re-flash.
# Catch it before the path-equality check below — covers the
# case where the config filename doesn't match the device name
# (e.g. ``weird-file.yaml`` whose ``esphome.name`` is
# ``kitchen``; running ``esphome rename weird-file.yaml kitchen``
# would otherwise just re-flash the same hostname).
if new_name == old_name:
safe_print(
color(
AnsiFore.BOLD_RED,
f"'{new_name}' is already the device's name.",
)
)
return 1
new_path: Path = CORE.config_dir / (new_name + ".yaml")
if new_path.resolve() == CORE.config_path.resolve():
safe_print(
color(
AnsiFore.BOLD_RED,
f"'{new_name}' is already the device's name.",
)
)
return 1
if new_path.exists():
safe_print(
color(
AnsiFore.BOLD_RED,
f"Cannot rename: {new_path} already exists. "
"Refusing to overwrite an existing configuration.",
)
)
return 1
safe_print(
f"Updating {color(AnsiFore.CYAN, str(CORE.config_path))} to {color(AnsiFore.CYAN, str(new_path))}"
)
print()
try:
yaml_edit.write_keeping_mode(
new_path,
yaml_edit.rewritten_text(yaml_edit.read_text(CORE.config_path), [edit]),
like=CORE.config_path,
)
except EsphomeError as err:
return _revert(new_path, str(err))
if run_external_process(*ESPHOME_COMMAND, "config", str(new_path)) != 0:
return _revert(new_path, "the new configuration does not validate")
cli_args = [
"run",
str(new_path),
"--no-logs",
"--device",
CORE.address,
]
if args.dashboard:
cli_args.insert(0, "--dashboard")
try:
rc = run_external_process(*ESPHOME_COMMAND, *cli_args)
except KeyboardInterrupt:
rc = 1
if rc != 0:
return _revert(
new_path,
"the install did not finish; the device may already run the new name",
)
CORE.config_path.unlink()
safe_print(color(AnsiFore.BOLD_GREEN, "SUCCESS"))
print()
return 0
-5
View File
@@ -31,20 +31,15 @@ from esphome.cpp_generator import ( # noqa: F401
add_global,
add_library,
add_platformio_option,
extern_progmem_array,
get_variable,
get_variable_with_full_id,
is_static_pointer,
is_template,
new_Pvariable,
new_variable,
process_lambda,
progmem_array,
progmem_string,
safe_exp,
set_cpp_standard,
shared_progmem_array,
shared_progmem_string,
statement,
static_const_array,
static_function,
-1
View File
@@ -1,2 +1 @@
CODEOWNERS = ["@MrSuicideParrot"]
DOMAIN = "a01nyub"
+1 -1
View File
@@ -6,7 +6,7 @@
namespace esphome::a01nyub {
ESPHOME_LOG_TAG(TAG, "a01nyub.sensor");
static const char *const TAG = "a01nyub.sensor";
void A01nyubComponent::loop() {
uint8_t data;
-1
View File
@@ -1,2 +1 @@
CODEOWNERS = ["@TH-Braemer"]
DOMAIN = "a02yyuw"
+1 -1
View File
@@ -6,7 +6,7 @@
namespace esphome::a02yyuw {
ESPHOME_LOG_TAG(TAG, "a02yyuw.sensor");
static const char *const TAG = "a02yyuw.sensor";
void A02yyuwComponent::loop() {
uint8_t data;
-1
View File
@@ -1 +0,0 @@
DOMAIN = "a4988"
+1 -1
View File
@@ -3,7 +3,7 @@
namespace esphome::a4988 {
ESPHOME_LOG_TAG(TAG, "a4988.stepper");
static const char *const TAG = "a4988.stepper";
void A4988::setup() {
if (this->sleep_pin_ != nullptr) {
@@ -1,2 +1 @@
CODEOWNERS = ["@DAVe3283"]
DOMAIN = "absolute_humidity"
@@ -3,7 +3,7 @@
namespace esphome::absolute_humidity {
ESPHOME_LOG_TAG(TAG, "absolute_humidity.sensor");
static const char *const TAG{"absolute_humidity.sensor"};
void AbsoluteHumidityComponent::setup() {
this->temperature_sensor_->add_on_state_callback([this](float state) {
@@ -19,7 +19,11 @@ AbsoluteHumidityComponent = absolute_humidity_ns.class_(
SaturationVaporPressureEquation = absolute_humidity_ns.enum(
"SaturationVaporPressureEquation"
)
EQUATION = SaturationVaporPressureEquation.options("BUCK", "TETENS", "WOBUS")
EQUATION = {
"BUCK": SaturationVaporPressureEquation.BUCK,
"TETENS": SaturationVaporPressureEquation.TETENS,
"WOBUS": SaturationVaporPressureEquation.WOBUS,
}
CONFIG_SCHEMA = (
sensor.sensor_schema(
-1
View File
@@ -1 +0,0 @@
DOMAIN = "ac_dimmer"
+1 -1
View File
@@ -14,7 +14,7 @@
namespace esphome::ac_dimmer {
ESPHOME_LOG_TAG(TAG, "ac_dimmer");
static const char *const TAG = "ac_dimmer";
// Global array to store dimmer objects
static AcDimmerDataStore *all_dimmers[32]; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
@@ -9,7 +9,7 @@
#include "esp_clk_tree.h"
#include "soc/clk_tree_defs.h"
ESPHOME_LOG_TAG(TAG, "hw_timer_esp_idf");
static const char *const TAG = "hw_timer_esp_idf";
namespace esphome::ac_dimmer {
+5 -3
View File
@@ -14,9 +14,11 @@ ac_dimmer_ns = cg.esphome_ns.namespace("ac_dimmer")
AcDimmer = ac_dimmer_ns.class_("AcDimmer", output.FloatOutput, cg.Component)
DimMethod = ac_dimmer_ns.enum("DimMethod")
DIM_METHODS = DimMethod.options(
"LEADING_PULSE", "LEADING", "TRAILING", prefix="DIM_METHOD_"
)
DIM_METHODS = {
"LEADING_PULSE": DimMethod.DIM_METHOD_LEADING_PULSE,
"LEADING": DimMethod.DIM_METHOD_LEADING,
"TRAILING": DimMethod.DIM_METHOD_TRAILING,
}
ZC_INTERRUPT_TYPES = {
"RISING": gpio_ns.INTERRUPT_RISING_EDGE,
-1
View File
@@ -9,7 +9,6 @@ from esphome.cpp_generator import MockObj
from esphome.types import ConfigType
DEPENDENCIES = ["uart"]
DOMAIN = "adalight"
adalight_ns = cg.esphome_ns.namespace("adalight")
AdalightLightEffect = adalight_ns.class_(
@@ -3,7 +3,7 @@
namespace esphome::adalight {
ESPHOME_LOG_TAG(TAG, "adalight_light_effect");
static const char *const TAG = "adalight_light_effect";
static const uint32_t ADALIGHT_ACK_INTERVAL = 1000;
static const uint32_t ADALIGHT_RECEIVE_TIMEOUT = 1000;
+5 -2
View File
@@ -22,7 +22,6 @@ from esphome.core import CORE
from esphome.types import ConfigType
CODEOWNERS = ["@esphome/core"]
DOMAIN = "adc"
adc_ns = cg.esphome_ns.namespace("adc")
@@ -46,7 +45,11 @@ ATTENUATION_MODES = {
sampling_mode = adc_ns.enum("SamplingMode", is_class=True)
SAMPLING_MODES = sampling_mode.options("avg", "min", "max")
SAMPLING_MODES = {
"avg": sampling_mode.AVG,
"min": sampling_mode.MIN,
"max": sampling_mode.MAX,
}
adc_unit_t = cg.global_ns.enum("adc_unit_t", is_class=True)
+4 -4
View File
@@ -128,10 +128,10 @@ class ADCSensor final : public sensor::Sensor, public PollingComponent, public v
#endif // USE_RP2
protected:
uint8_t sample_count_{1}; // Must match DEFAULT_SAMPLES in sensor.py
bool output_raw_{false}; // Must match CONF_RAW default in sensor.py
uint8_t sample_count_{1};
bool output_raw_{false};
InternalGPIOPin *pin_;
SamplingMode sampling_mode_{SamplingMode::AVG}; // Must match DEFAULT_SAMPLING_MODE in sensor.py
SamplingMode sampling_mode_{SamplingMode::AVG};
#ifdef USE_ESP32
float sample_autorange_();
@@ -139,7 +139,7 @@ class ADCSensor final : public sensor::Sensor, public PollingComponent, public v
bool autorange_{false};
adc_oneshot_unit_handle_t adc_handle_{nullptr};
adc_cali_handle_t calibration_handle_{nullptr};
adc_atten_t attenuation_{ADC_ATTEN_DB_0}; // Must match DEFAULT_ATTENUATION in sensor.py
adc_atten_t attenuation_{ADC_ATTEN_DB_0};
adc_channel_t channel_{};
adc_unit_t adc_unit_{};
struct SetupFlags {
+1 -1
View File
@@ -3,7 +3,7 @@
namespace esphome::adc {
ESPHOME_LOG_TAG(TAG, "adc");
static const char *const TAG = "adc";
const LogString *sampling_mode_to_str(SamplingMode mode) {
switch (mode) {
+1 -1
View File
@@ -6,7 +6,7 @@
namespace esphome::adc {
ESPHOME_LOG_TAG(TAG, "adc");
static const char *const TAG = "adc";
adc_oneshot_unit_handle_t ADCSensor::shared_adc_handles[2] = {nullptr, nullptr};
@@ -13,7 +13,7 @@ ADC_MODE(ADC_VCC)
namespace esphome::adc {
ESPHOME_LOG_TAG(TAG, "adc");
static const char *const TAG = "adc";
void ADCSensor::setup() {
#ifndef USE_ADC_SENSOR_VCC
@@ -5,7 +5,7 @@
namespace esphome::adc {
ESPHOME_LOG_TAG(TAG, "adc");
static const char *const TAG = "adc";
void ADCSensor::setup() {
#ifndef USE_ADC_SENSOR_VCC
+1 -1
View File
@@ -17,7 +17,7 @@
namespace esphome::adc {
ESPHOME_LOG_TAG(TAG, "adc");
static const char *const TAG = "adc";
// The on-die temperature sensor sits on the last ADC channel: input 4 on RP2040
// and RP2350A, but input 8 on RP2350B, which has eight external channels rather
+1 -1
View File
@@ -7,7 +7,7 @@
namespace esphome::adc {
ESPHOME_LOG_TAG(TAG, "adc");
static const char *const TAG = "adc";
void ADCSensor::setup() {
if (!adc_is_ready_dt(this->channel_)) {
+8 -24
View File
@@ -48,11 +48,6 @@ AUTO_LOAD = ["voltage_sampler"]
CONF_SAMPLES = "samples"
CONF_SAMPLING_MODE = "sampling_mode"
# Keep in sync with the initializers in adc_sensor.h
DEFAULT_ATTENUATION = "0db"
DEFAULT_SAMPLING_MODE = "avg"
DEFAULT_SAMPLES = 1
_attenuation = cv.enum(ATTENUATION_MODES, lower=True)
_sampling_mode = cv.enum(SAMPLING_MODES, lower=True)
@@ -70,10 +65,7 @@ def validate_config(config: ConfigType) -> ConfigType:
):
raise cv.Invalid("ESP32-S31 only supports 'attenuation: 0db'")
if (
config.get(CONF_ATTENUATION, None) == "auto"
and config.get(CONF_SAMPLES, DEFAULT_SAMPLES) > 1
):
if config.get(CONF_ATTENUATION, None) == "auto" and config.get(CONF_SAMPLES, 1) > 1:
raise cv.Invalid(
"Automatic attenuation cannot be used when multisampling is set"
)
@@ -121,16 +113,12 @@ CONFIG_SCHEMA = cv.All(
{
cv.Required(CONF_PIN): validate_adc_pin,
cv.Optional(CONF_RAW, default=False): cv.boolean,
cv.SplitDefault(CONF_ATTENUATION, esp32=DEFAULT_ATTENUATION): cv.All(
cv.SplitDefault(CONF_ATTENUATION, esp32="0db"): cv.All(
cv.only_on_esp32, _attenuation
),
cv.OnlyWith(CONF_NRF_SAADC, PLATFORM_NRF52): cv.declare_id(adc_dt_spec),
cv.Optional(CONF_SAMPLES, default=DEFAULT_SAMPLES): cv.int_range(
min=1, max=255
),
cv.Optional(
CONF_SAMPLING_MODE, default=DEFAULT_SAMPLING_MODE
): _sampling_mode,
cv.Optional(CONF_SAMPLES, default=1): cv.int_range(min=1, max=255),
cv.Optional(CONF_SAMPLING_MODE, default="avg"): _sampling_mode,
}
)
.extend(cv.polling_component_schema("60s")),
@@ -167,13 +155,9 @@ async def to_code(config: ConfigType) -> None:
pin = await cg.gpio_pin_expression(config[CONF_PIN])
cg.add(var.set_pin(pin))
# Skip the setters when the config matches the C++ initializers.
if config[CONF_RAW]:
cg.add(var.set_output_raw(True))
if (samples := config[CONF_SAMPLES]) != DEFAULT_SAMPLES:
cg.add(var.set_sample_count(samples))
if (sampling_mode := config[CONF_SAMPLING_MODE]) != DEFAULT_SAMPLING_MODE:
cg.add(var.set_sampling_mode(sampling_mode))
cg.add(var.set_output_raw(config[CONF_RAW]))
cg.add(var.set_sample_count(config[CONF_SAMPLES]))
cg.add(var.set_sampling_mode(config[CONF_SAMPLING_MODE]))
if CORE.is_esp32:
# Re-enable ESP-IDF's ADC driver (excluded by default to save compile time)
@@ -182,7 +166,7 @@ async def to_code(config: ConfigType) -> None:
if attenuation := config.get(CONF_ATTENUATION):
if attenuation == "auto":
cg.add(var.set_autorange(cg.global_ns.true))
elif attenuation != DEFAULT_ATTENUATION:
else:
cg.add(var.set_attenuation(attenuation))
variant = get_esp32_variant()
@@ -5,7 +5,6 @@ from esphome.const import CONF_ID
from esphome.types import ConfigType
DEPENDENCIES = ["spi"]
DOMAIN = "adc128s102"
MULTI_CONF = True
CODEOWNERS = ["@DeerMaximum"]
+1 -1
View File
@@ -3,7 +3,7 @@
namespace esphome::adc128s102 {
ESPHOME_LOG_TAG(TAG, "adc128s102");
static const char *const TAG = "adc128s102";
float ADC128S102::get_setup_priority() const { return setup_priority::HARDWARE; }
@@ -4,7 +4,7 @@
namespace esphome::adc128s102 {
ESPHOME_LOG_TAG(TAG, "adc128s102.sensor");
static const char *const TAG = "adc128s102.sensor";
ADC128S102Sensor::ADC128S102Sensor(uint8_t channel) : channel_(channel) {}
@@ -1 +0,0 @@
DOMAIN = "addressable_light"
@@ -3,7 +3,7 @@
namespace esphome::addressable_light {
ESPHOME_LOG_TAG(TAG, "addressable_light.display");
static const char *const TAG = "addressable_light.display";
int AddressableLightDisplay::get_width_internal() { return this->width_; }
int AddressableLightDisplay::get_height_internal() { return this->height_; }
-1
View File
@@ -1 +0,0 @@
DOMAIN = "ade7880"
+1 -1
View File
@@ -15,7 +15,7 @@
namespace esphome::ade7880 {
ESPHOME_LOG_TAG(TAG, "ade7880");
static const char *const TAG = "ade7880";
void IRAM_ATTR ADE7880Store::gpio_intr(ADE7880Store *arg) { arg->reset_done = true; }
+7 -1
View File
@@ -11,6 +11,12 @@
namespace esphome::ade7880 {
// adapted from https://stackoverflow.com/a/55912127/1886371
template<size_t Bits, typename T> inline T sign_extend(const T &v) noexcept {
using S = struct { signed Val : Bits; };
return reinterpret_cast<const S *>(&v)->Val;
}
// Register types
// unsigned 8-bit (uint8_t)
// signed 10-bit - 16-bit ZP on wire (int16_t, needs sign extension)
@@ -43,7 +49,7 @@ uint16_t ADE7880::read_u16_register16_(uint16_t a_register) {
int32_t ADE7880::read_s24zp_register16_(uint16_t a_register) {
// s24zp means 24 bit signed value in the lower 24 bits of a 32-bit register
uint32_t in;
int32_t in;
this->read_register16(a_register, reinterpret_cast<uint8_t *>(&in), sizeof(in));
return sign_extend<24>(convert_big_endian(in));
}
-1
View File
@@ -1,2 +1 @@
CODEOWNERS = ["@angelnu"]
DOMAIN = "ade7953"
@@ -27,7 +27,6 @@ from esphome.cpp_generator import MockObj
from esphome.types import ConfigType
CODEOWNERS = ["@angelnu"]
DOMAIN = "ade7953_base"
CONF_CURRENT_A = "current_a"
CONF_CURRENT_B = "current_b"
@@ -5,7 +5,7 @@
namespace esphome::ade7953_base {
ESPHOME_LOG_TAG(TAG, "ade7953");
static const char *const TAG = "ade7953";
constexpr uint16_t CONFIG_DEFAULT = 0x8004u;
constexpr uint16_t CONFIG_LOCK_BIT = 0x8000u;
@@ -1,2 +1 @@
CODEOWNERS = ["@angelnu"]
DOMAIN = "ade7953_i2c"
@@ -4,7 +4,7 @@
namespace esphome::ade7953_i2c {
ESPHOME_LOG_TAG(TAG, "ade7953");
static const char *const TAG = "ade7953";
void AdE7953I2c::dump_config() {
ESP_LOGCONFIG(TAG, "ADE7953_i2c:");
@@ -1,2 +1 @@
CODEOWNERS = ["@angelnu"]
DOMAIN = "ade7953_spi"
@@ -4,7 +4,7 @@
namespace esphome::ade7953_spi {
ESPHOME_LOG_TAG(TAG, "ade7953");
static const char *const TAG = "ade7953";
// Datasheet requires at least 1.2µs after clearing CONFIG LOCK_BIT before raising CS
constexpr uint8_t CONFIG_LOCK_SETTLE_US = 2;
-1
View File
@@ -5,7 +5,6 @@ from esphome.const import CONF_ID
from esphome.types import ConfigType
DEPENDENCIES = ["i2c"]
DOMAIN = "ads1115"
MULTI_CONF = True
ads1115_ns = cg.esphome_ns.namespace("ads1115")
+6 -3
View File
@@ -4,14 +4,14 @@
namespace esphome::ads1115 {
ESPHOME_LOG_TAG(TAG, "ads1115");
static const char *const TAG = "ads1115";
static const uint8_t ADS1115_REGISTER_CONVERSION = 0x00;
static const uint8_t ADS1115_REGISTER_CONFIG = 0x01;
void ADS1115Component::setup() {
uint16_t value;
if (!this->read_byte_16(ADS1115_REGISTER_CONVERSION, &value)) {
this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL));
this->mark_failed();
return;
}
@@ -58,7 +58,7 @@ void ADS1115Component::setup() {
config |= 0b0000000000000011;
if (!this->write_byte_16(ADS1115_REGISTER_CONFIG, config)) {
this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL));
this->mark_failed();
return;
}
this->prev_config_ = config;
@@ -66,6 +66,9 @@ void ADS1115Component::setup() {
void ADS1115Component::dump_config() {
ESP_LOGCONFIG(TAG, "ADS1115:");
LOG_I2C_DEVICE(this);
if (this->is_failed()) {
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
}
}
float ADS1115Component::request_measurement(ADS1115Multiplexer multiplexer, ADS1115Gain gain,
ADS1115Resolution resolution, ADS1115Samplerate samplerate) {
@@ -4,7 +4,7 @@
namespace esphome::ads1115 {
ESPHOME_LOG_TAG(TAG, "ads1115.sensor");
static const char *const TAG = "ads1115.sensor";
float ADS1115Sensor::sample() {
return this->parent_->request_measurement(this->multiplexer_, this->gain_, this->resolution_, this->samplerate_);
Loaded 100 of 4453 files, more files were not shown because too many files have changed in this diff. Show more