Strict fails on a disabled pch, narrows the projenv exemption, and covers the new funnel sites

This commit is contained in:
J. Nick Koston
2026-08-26 22:51:53 -05:00
parent 4a3b095172
commit 5d690104b5
6 changed files with 83 additions and 4 deletions
+3
View File
@@ -1313,6 +1313,9 @@ def write_project(paths: InstalledPaths, ccache: str | None) -> bool:
pch_dep = f"{gch} esphome_pch.probe"
src_cxx_override = ("$srccxxflags", pch_dep)
mark_pch_emitted()
else:
# Strict CI must not read "no pch at all" as success
pch_degraded("pch disabled by ESPHOME_PCH_ENABLE")
src_objs = _ninja_compile_edges(
lines,
_collect_sources(src_dir),
+1
View File
@@ -323,6 +323,7 @@ def prepare_pch() -> None:
if not pch_enabled():
# Self-cleaning escape hatch: drop any previously built .gch
pch.discard_pch(CORE.relative_build_path("build"))
pch.pch_degraded("pch disabled by ESPHOME_PCH_ENABLE")
return
sdkconfig_path = CORE.relative_build_path(f"sdkconfig.{CORE.name}")
try:
+5 -1
View File
@@ -148,7 +148,11 @@ def ccache_pch_env() -> dict[str, str]:
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)."""
return ["post:pch.py"] if pch_enabled() else []
if not pch_enabled():
# Strict CI must not read "no pch at all" as success
pch_degraded("pch disabled by ESPHOME_PCH_ENABLE")
return []
return ["post:pch.py"]
def pch_header_text(include_headers: Iterable[str]) -> str:
+8 -3
View File
@@ -160,10 +160,15 @@ def _read_stamp(path: Path) -> str:
def _setup_pch() -> bool | None:
if projenv is None:
# Expected under -t nobuild (nothing compiles), so not a degrade
# even in strict mode; anything else still leaves a trail
print(f"ESPHome: projenv unavailable ({_projenv_error}); skipping pch")
return True
try:
from SCons.Script import COMMAND_LINE_TARGETS
# Expected under -t nobuild (nothing compiles); a missing
# projenv on a real compile must not pass strict
return "nobuild" in [str(t) for t in COMMAND_LINE_TARGETS]
except Exception: # noqa: BLE001 -- no SCons: cannot tell, stay lenient
return True
# Project root: SCons compiles run here, so the relative -include
# resolves; an absolute path would break cross-device ccache sharing.
proj_dir = Path(env.subst("$PROJECT_DIR")) # noqa: F821
+55
View File
@@ -869,6 +869,61 @@ def test_prepare_pch_signal_kill_is_transient(tmp_path: Path) -> None:
assert len(calls) == 2
def test_prepare_pch_signal_kill_strict_raises(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
from esphome.build_gen.espidf import prepare_pch
from esphome.core import EsphomeError
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
dev = _make_pch_device(tmp_path, "dev_ks")
CORE.build_path = dev
with (
patch.object(CORE, "name", "test"),
patch(
"esphome.build_helpers.pch.subprocess.run",
side_effect=lambda cmd, **kw: subprocess.CompletedProcess(cmd, -9, "", ""),
),
pytest.raises(EsphomeError, match="killed by signal"),
):
prepare_pch()
def test_prepare_pch_strict_raises_when_disabled(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Strict must not read a disabled pch as success."""
from esphome.build_gen.espidf import prepare_pch
from esphome.core import EsphomeError
monkeypatch.setenv("ESPHOME_PCH_ENABLE", "0")
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
dev = _make_pch_device(tmp_path, "dev_ds")
CORE.build_path = dev
with (
patch.object(CORE, "name", "test"),
pytest.raises(EsphomeError, match="disabled"),
):
prepare_pch()
def test_prepare_pch_missing_sdkconfig_strict_raises(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
from esphome.build_gen.espidf import prepare_pch
from esphome.core import EsphomeError
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
dev = _make_pch_device(tmp_path, "dev_ss")
(dev / "sdkconfig.test").unlink()
CORE.build_path = dev
with (
patch.object(CORE, "name", "test"),
pytest.raises(EsphomeError, match="sdkconfig unreadable"),
):
prepare_pch()
def test_prepare_pch_without_compile_commands(tmp_path: Path) -> None:
"""Stale checksum but no configured TU yet: no compile, no sidecars."""
from esphome.build_gen.espidf import prepare_pch
@@ -242,3 +242,14 @@ def test_pch_degraded_raises_only_in_strict(
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
with pytest.raises(EsphomeError, match="reason"):
pch.pch_degraded("reason")
def test_pch_extra_scripts_strict_raises_when_disabled(
monkeypatch: pytest.MonkeyPatch,
) -> None:
from esphome.core import EsphomeError
monkeypatch.setenv("ESPHOME_PCH_ENABLE", "0")
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
with pytest.raises(EsphomeError, match="disabled"):
pch.pch_extra_scripts()