# pylint: disable=E0602 Import("env") # noqa import os # Filter out waveform/PWM code from the Arduino core build # This saves ~596 bytes of RAM and 464 bytes of flash by not # instantiating the waveform generator state structures (wvfState + pwmState). # # The waveform code is used by: analogWrite, Tone, Servo, and direct # startWaveform/stopWaveform calls. ESPHome's esp8266_pwm component # calls require_waveform() to keep this code when needed. # # When excluded, we provide stub implementations of stopWaveform() and # _stopPWM() since digitalWrite() calls these unconditionally. def has_define_flag(env, name): """Check if a define exists in the build flags.""" define_flag = f"-D{name}" # Check BUILD_FLAGS (where ESPHome puts its defines) for flag in env.get("BUILD_FLAGS", []): if flag == define_flag or flag.startswith(f"{define_flag}="): return True # Also check CPPDEFINES list (parsed defines) for define in env.get("CPPDEFINES", []): if isinstance(define, tuple): if define[0] == name: return True elif define == name: return True return False # USE_ESP8266_WAVEFORM_STUBS is defined when no component needs waveform if has_define_flag(env, "USE_ESP8266_WAVEFORM_STUBS"): def filter_waveform_from_core(env, node): """Filter callback to exclude waveform files from framework build.""" path = node.get_path() filename = os.path.basename(path) if filename in ( "core_esp8266_waveform_pwm.cpp", "core_esp8266_waveform_phase.cpp", ): print(f"ESPHome: Excluding {filename} from build (waveform not required)") return None return node # Apply the filter to framework sources env.AddBuildMiddleware(filter_waveform_from_core, "**/cores/esp8266/*.cpp")