diff --git a/esphome/codegen.py b/esphome/codegen.py index bfa1683ce7..8e02ec1164 100644 --- a/esphome/codegen.py +++ b/esphome/codegen.py @@ -22,6 +22,7 @@ from esphome.cpp_generator import ( # noqa: F401 TemplateArguments, add, add_build_flag, + add_build_unflag, add_define, add_global, add_library, @@ -34,6 +35,7 @@ from esphome.cpp_generator import ( # noqa: F401 process_lambda, progmem_array, safe_exp, + set_cpp_standard, statement, static_const_array, templatable, diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 157fd9db11..7f2d718d35 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -695,6 +695,7 @@ FINAL_VALIDATE_SCHEMA = cv.Schema(final_validate) async def to_code(config): cg.add_platformio_option("board", config[CONF_BOARD]) cg.add_platformio_option("board_upload.flash_size", config[CONF_FLASH_SIZE]) + cg.set_cpp_standard("gnu++17") cg.add_build_flag("-DUSE_ESP32") cg.add_define("ESPHOME_BOARD", config[CONF_BOARD]) cg.add_build_flag(f"-DUSE_ESP32_VARIANT_{config[CONF_VARIANT]}") diff --git a/esphome/components/esp8266/__init__.py b/esphome/components/esp8266/__init__.py index c949e53aa6..4b4862a1d0 100644 --- a/esphome/components/esp8266/__init__.py +++ b/esphome/components/esp8266/__init__.py @@ -183,6 +183,7 @@ async def to_code(config): cg.add_platformio_option("board", config[CONF_BOARD]) cg.add_build_flag("-DUSE_ESP8266") + cg.set_cpp_standard("gnu++17") cg.add_define("ESPHOME_BOARD", config[CONF_BOARD]) cg.add_define("ESPHOME_VARIANT", "ESP8266") diff --git a/esphome/components/libretiny/__init__.py b/esphome/components/libretiny/__init__.py index 5bdfb15e19..7683c29c63 100644 --- a/esphome/components/libretiny/__init__.py +++ b/esphome/components/libretiny/__init__.py @@ -264,6 +264,7 @@ async def component_to_code(config): # force using arduino framework cg.add_platformio_option("framework", "arduino") cg.add_build_flag("-DUSE_ARDUINO") + cg.set_cpp_standard("gnu++17") # disable library compatibility checks cg.add_platformio_option("lib_ldf_mode", "off") diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py index c3e11336a9..2718e3050f 100644 --- a/esphome/components/rp2040/__init__.py +++ b/esphome/components/rp2040/__init__.py @@ -167,6 +167,7 @@ async def to_code(config): cg.add_platformio_option("lib_ldf_mode", "chain+") cg.add_platformio_option("board", config[CONF_BOARD]) cg.add_build_flag("-DUSE_RP2040") + cg.set_cpp_standard("gnu++17") cg.add_define("ESPHOME_BOARD", config[CONF_BOARD]) cg.add_define("ESPHOME_VARIANT", "RP2040") diff --git a/esphome/core/__init__.py b/esphome/core/__init__.py index e95bd7edcc..bc98ff54db 100644 --- a/esphome/core/__init__.py +++ b/esphome/core/__init__.py @@ -507,6 +507,8 @@ class EsphomeCore: self.libraries: list[Library] = [] # A set of build flags to set in the platformio project self.build_flags: set[str] = set() + # A set of build unflags to set in the platformio project + self.build_unflags: set[str] = set() # A set of defines to set for the compile process in esphome/core/defines.h self.defines: set[Define] = set() # A map of all platformio options to apply @@ -545,6 +547,7 @@ class EsphomeCore: self.global_statements = [] self.libraries = [] self.build_flags = set() + self.build_unflags = set() self.defines = set() self.platformio_options = {} self.loaded_integrations = set() @@ -766,11 +769,15 @@ class EsphomeCore: self.libraries.append(library) return library - def add_build_flag(self, build_flag): + def add_build_flag(self, build_flag: str) -> str: self.build_flags.add(build_flag) _LOGGER.debug("Adding build flag: %s", build_flag) return build_flag + def add_build_unflag(self, build_unflag: str) -> None: + self.build_unflags.add(build_unflag) + _LOGGER.debug("Adding build unflag: %s", build_unflag) + def add_define(self, define): if isinstance(define, str): define = Define(define) diff --git a/esphome/cpp_generator.py b/esphome/cpp_generator.py index bbfa6af815..4641f69bdd 100644 --- a/esphome/cpp_generator.py +++ b/esphome/cpp_generator.py @@ -608,6 +608,17 @@ def add_build_flag(build_flag: str): CORE.add_build_flag(build_flag) +def add_build_unflag(build_unflag: str) -> None: + """Add a global build unflag to the compiler flags.""" + CORE.add_build_unflag(build_unflag) + + +def set_cpp_standard(standard: str) -> None: + """Set C++ standard with compiler flag `-std={standard}`.""" + CORE.add_build_unflag("-std=gnu++11") + CORE.add_build_flag(f"-std={standard}") + + def add_define(name: str, value: SafeExpType = None): """Add a global define to the auto-generated defines.h file. diff --git a/esphome/writer.py b/esphome/writer.py index a47112e1fd..7a5089e384 100644 --- a/esphome/writer.py +++ b/esphome/writer.py @@ -153,6 +153,9 @@ def get_ini_content(): # Sort to avoid changing build flags order CORE.add_platformio_option("build_flags", sorted(CORE.build_flags)) + # Sort to avoid changing build unflags order + CORE.add_platformio_option("build_unflags", sorted(CORE.build_unflags)) + content = "[platformio]\n" content += f"description = ESPHome {__version__}\n" diff --git a/platformio.ini b/platformio.ini index 27da883ab3..77938424f9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -48,6 +48,9 @@ lib_deps = lvgl/lvgl@8.4.0 ; lvgl build_flags = -DESPHOME_LOG_LEVEL=ESPHOME_LOG_LEVEL_VERY_VERBOSE + -std=gnu++17 +build_unflags = + -std=gnu++11 src_filter = +<./> +<../tests/dummy_main.cpp> @@ -73,6 +76,8 @@ lib_deps = build_flags = ${common.build_flags} -DUSE_ARDUINO +build_unflags = + ${common.build_unflags} ; This are common settings for all IDF-framework based environments. [common:idf] @@ -80,6 +85,8 @@ extends = common build_flags = ${common.build_flags} -DUSE_ESP_IDF +build_unflags = + ${common.build_unflags} ; This are common settings for the ESP8266 using Arduino. [common:esp8266-arduino] @@ -104,6 +111,8 @@ build_flags = -Wno-nonnull-compare -DUSE_ESP8266 -DUSE_ESP8266_FRAMEWORK_ARDUINO +build_unflags = + ${common.build_unflags} extra_scripts = post:esphome/components/esp8266/post_build.py.script ; This are common settings for the ESP32 (all variants) using Arduino. @@ -135,6 +144,8 @@ build_flags = -DUSE_ESP32 -DUSE_ESP32_FRAMEWORK_ARDUINO -DAUDIO_NO_SD_FS ; i2s_audio +build_unflags = + ${common.build_unflags} extra_scripts = post:esphome/components/esp32/post_build.py.script ; This are common settings for the ESP32 (all variants) using IDF. @@ -155,6 +166,8 @@ build_flags = -Wno-nonnull-compare -DUSE_ESP32 -DUSE_ESP32_FRAMEWORK_ESP_IDF +build_unflags = + ${common.build_unflags} extra_scripts = post:esphome/components/esp32/post_build.py.script ; This are common settings for the ESP32 using the latest ESP-IDF version. @@ -181,6 +194,8 @@ build_flags = ${common:arduino.build_flags} -DUSE_RP2040 -DUSE_RP2040_FRAMEWORK_ARDUINO +build_unflags = + ${common.build_unflags} ; This are common settings for the LibreTiny (all variants) using Arduino. [common:libretiny-arduino] @@ -192,6 +207,8 @@ lib_deps = build_flags = ${common:arduino.build_flags} -DUSE_LIBRETINY +build_unflags = + ${common.build_unflags} build_src_flags = -include Arduino.h ; This is the common settings for the nRF52 using Zephyr. @@ -224,6 +241,8 @@ board = nodemcuv2 build_flags = ${common:esp8266-arduino.build_flags} ${flags:runtime.build_flags} +build_unflags = + ${common.build_unflags} [env:esp8266-arduino-tidy] extends = common:esp8266-arduino @@ -231,6 +250,8 @@ board = nodemcuv2 build_flags = ${common:esp8266-arduino.build_flags} ${flags:clangtidy.build_flags} +build_unflags = + ${common.build_unflags} ;;;;;;;; ESP32 ;;;;;;;; @@ -242,6 +263,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32 +build_unflags = + ${common.build_unflags} [env:esp32-arduino-tidy] extends = common:esp32-arduino @@ -250,6 +273,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32 +build_unflags = + ${common.build_unflags} [env:esp32-idf] extends = common:esp32-idf @@ -259,6 +284,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32 +build_unflags = + ${common.build_unflags} [env:esp32-idf-5_3] extends = common:esp32-idf-5_3 @@ -268,6 +295,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32 +build_unflags = + ${common.build_unflags} [env:esp32-idf-tidy] extends = common:esp32-idf @@ -277,6 +306,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32 +build_unflags = + ${common.build_unflags} ;;;;;;;; ESP32-C3 ;;;;;;;; @@ -287,6 +318,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32C3 +build_unflags = + ${common.build_unflags} [env:esp32c3-arduino-tidy] extends = common:esp32-arduino @@ -295,6 +328,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32C3 +build_unflags = + ${common.build_unflags} [env:esp32c3-idf] extends = common:esp32-idf @@ -304,6 +339,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32C3 +build_unflags = + ${common.build_unflags} [env:esp32c3-idf-5_3] extends = common:esp32-idf-5_3 @@ -313,6 +350,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32C3 +build_unflags = + ${common.build_unflags} [env:esp32c3-idf-tidy] extends = common:esp32-idf @@ -322,6 +361,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32C3 +build_unflags = + ${common.build_unflags} ;;;;;;;; ESP32-C6 ;;;;;;;; @@ -343,6 +384,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32S2 +build_unflags = + ${common.build_unflags} [env:esp32s2-arduino-tidy] extends = common:esp32-arduino @@ -351,6 +394,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32S2 +build_unflags = + ${common.build_unflags} [env:esp32s2-idf] extends = common:esp32-idf @@ -360,6 +405,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32S2 +build_unflags = + ${common.build_unflags} [env:esp32s2-idf-5_3] extends = common:esp32-idf-5_3 @@ -369,6 +416,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32S2 +build_unflags = + ${common.build_unflags} [env:esp32s2-idf-tidy] extends = common:esp32-idf @@ -378,6 +427,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32S2 +build_unflags = + ${common.build_unflags} ;;;;;;;; ESP32-S3 ;;;;;;;; @@ -388,6 +439,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32S3 +build_unflags = + ${common.build_unflags} [env:esp32s3-arduino-tidy] extends = common:esp32-arduino @@ -396,6 +449,8 @@ build_flags = ${common:esp32-arduino.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32S3 +build_unflags = + ${common.build_unflags} [env:esp32s3-idf] extends = common:esp32-idf @@ -405,6 +460,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32S3 +build_unflags = + ${common.build_unflags} [env:esp32s3-idf-5_3] extends = common:esp32-idf-5_3 @@ -414,6 +471,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:runtime.build_flags} -DUSE_ESP32_VARIANT_ESP32S3 +build_unflags = + ${common.build_unflags} [env:esp32s3-idf-tidy] extends = common:esp32-idf @@ -423,6 +482,8 @@ build_flags = ${common:esp32-idf.build_flags} ${flags:clangtidy.build_flags} -DUSE_ESP32_VARIANT_ESP32S3 +build_unflags = + ${common.build_unflags} ;;;;;;;; ESP32-P4 ;;;;;;;; @@ -444,6 +505,8 @@ board = rpipico build_flags = ${common:rp2040-arduino.build_flags} ${flags:runtime.build_flags} +build_unflags = + ${common.build_unflags} ;;;;;;;; LibreTiny ;;;;;;;; @@ -455,6 +518,8 @@ build_flags = ${flags:runtime.build_flags} -DUSE_BK72XX -DUSE_LIBRETINY_VARIANT_BK7231N +build_unflags = + ${common.build_unflags} [env:rtl87xxb-arduino] extends = common:libretiny-arduino @@ -464,6 +529,8 @@ build_flags = ${flags:runtime.build_flags} -DUSE_RTL87XX -DUSE_LIBRETINY_VARIANT_RTL8710B +build_unflags = + ${common.build_unflags} [env:rtl87xxc-arduino] extends = common:libretiny-arduino @@ -473,6 +540,8 @@ build_flags = ${flags:runtime.build_flags} -DUSE_RTL87XX -DUSE_LIBRETINY_VARIANT_RTL8720C +build_unflags = + ${common.build_unflags} [env:host] extends = common @@ -483,6 +552,8 @@ build_flags = ${common.build_flags} -DUSE_HOST -std=c++17 +build_unflags = + ${common.build_unflags} ;;;;;;;; nRF52 ;;;;;;;; @@ -492,6 +563,8 @@ board = adafruit_feather_nrf52840 build_flags = ${common:nrf52-zephyr.build_flags} ${flags:runtime.build_flags} +build_unflags = + ${common.build_unflags} [env:nrf52-tidy] extends = common:nrf52-zephyr @@ -499,3 +572,5 @@ board = adafruit_feather_nrf52840 build_flags = ${common:nrf52-zephyr.build_flags} ${flags:clangtidy.build_flags} +build_unflags = + ${common.build_unflags}