; This PlatformIO project is for development purposes *only*: clang-tidy derives its compilation
; database from here, and IDEs like CLion and VSCode also use it. This does not actually create a
; usable binary.
; It's *not* used during runtime.

[platformio]
default_envs = esp8266-arduino, esp32-arduino, esp32-idf, bk72xx-arduino
; Ideally, we want src_dir to be the root directory of the repository, to mimic the runtime build
; environment as best as possible. Unfortunately, the ESP-IDF toolchain really doesn't like this
; being the root directory. Instead, set esphome/ as the source directory, all our sources are in
; there anyway. Set the root directory as the include_dir, so that the esphome/ directory is on the
; include path.
src_dir = esphome
include_dir = .

; This are just the build flags as set by the runtime.
[flags:runtime]
build_flags =
    -Wno-unused-but-set-variable
    -Wno-sign-compare

; This are just the build flags for clang-tidy.
[flags:clangtidy]
build_flags =
    -Wall
    -Wextra
    -Wunreachable-code
    -Wfor-loop-analysis
    -Wshadow-field
    -Wshadow-field-in-constructor
    -Wshadow-uncaptured-local

; This are common settings for all environments.
[common]
lib_deps =
    esphome/noise-c@0.1.4                  ; api
    makuna/NeoPixelBus@2.7.3               ; neopixelbus
    improv/Improv@1.2.4                    ; improv_serial / esp32_improv
    bblanchon/ArduinoJson@6.18.5           ; json
    wjtje/qr-code-generator-library@1.7.0  ; qr_code
    functionpointer/arduino-MLX90393@1.0.2 ; mlx90393
    pavlodn/HaierProtocol@0.9.31           ; haier
    kikuchan98/pngle@1.0.2                 ; online_image
    ; This is using the repository until a new release is published to PlatformIO
    https://github.com/Sensirion/arduino-gas-index-algorithm.git#3.2.1 ; Sensirion Gas Index Algorithm Arduino Library
    lvgl/lvgl@8.4.0                                       ; lvgl
build_flags =
    -DESPHOME_LOG_LEVEL=ESPHOME_LOG_LEVEL_VERY_VERBOSE
src_filter =
    +<./>
    +<../tests/dummy_main.cpp>
    +<../.temp/all-include.cpp>
lib_ldf_mode = off

; This are common settings for all Arduino-framework based environments.
[common:arduino]
extends = common
lib_deps =
    ${common.lib_deps}
    SPI                                                   ; spi (Arduino built-in)
    Wire                                                  ; i2c (Arduino built-int)
    heman/AsyncMqttClient-esphome@1.0.0                   ; mqtt
    esphome/ESPAsyncWebServer-esphome@3.2.2               ; web_server_base
    fastled/FastLED@3.3.2                                 ; fastled_base
    mikalhart/TinyGPSPlus@1.0.2                           ; gps
    freekode/TM1651@1.0.1                                 ; tm1651
    glmnet/Dsmr@0.7                                       ; dsmr
    rweather/Crypto@0.4.0                                 ; dsmr
    dudanov/MideaUART@1.1.9                               ; midea
    tonia/HeatpumpIR@1.0.27                               ; heatpumpir
build_flags =
    ${common.build_flags}
    -DUSE_ARDUINO

; This are common settings for all IDF-framework based environments.
[common:idf]
extends = common
build_flags =
    ${common.build_flags}
    -DUSE_ESP_IDF

; This are common settings for the ESP8266 using Arduino.
[common:esp8266-arduino]
extends = common:arduino
platform = platformio/espressif8266@4.2.1
platform_packages =
    platformio/framework-arduinoespressif8266@~3.30102.0

framework = arduino
lib_deps =
    ${common:arduino.lib_deps}
    ESP8266WiFi                           ; wifi (Arduino built-in)
    Update                                ; ota (Arduino built-in)
    esphome/ESPAsyncTCP-esphome@2.0.0     ; async_tcp
    ESP8266HTTPClient                     ; http_request (Arduino built-in)
    ESP8266mDNS                           ; mdns (Arduino built-in)
    DNSServer                             ; captive_portal (Arduino built-in)
    droscy/esp_wireguard@0.4.2            ; wireguard

build_flags =
    ${common:arduino.build_flags}
    -Wno-nonnull-compare
    -DUSE_ESP8266
    -DUSE_ESP8266_FRAMEWORK_ARDUINO
extra_scripts = post:esphome/components/esp8266/post_build.py.script

; This are common settings for the ESP32 (all variants) using Arduino.
[common:esp32-arduino]
extends = common:arduino
platform = platformio/espressif32@5.4.0
platform_packages =
    platformio/framework-arduinoespressif32@~3.20005.0

framework = arduino
lib_deps =
    ; order matters with lib-deps; some of the libs in common:arduino.lib_deps
    ; don't declare built-in libraries as dependencies, so they have to be declared first
    FS                                   ; web_server_base (Arduino built-in)
    WiFi                                 ; wifi,web_server_base,ethernet (Arduino built-in)
    Update                               ; ota,web_server_base (Arduino built-in)
    ${common:arduino.lib_deps}
    esphome/AsyncTCP-esphome@2.1.4       ; async_tcp
    WiFiClientSecure                     ; http_request,nextion (Arduino built-in)
    HTTPClient                           ; http_request,nextion (Arduino built-in)
    ESPmDNS                              ; mdns (Arduino built-in)
    DNSServer                            ; captive_portal (Arduino built-in)
    esphome/ESP32-audioI2S@2.0.7         ; i2s_audio
    droscy/esp_wireguard@0.4.2          ; wireguard

build_flags =
    ${common:arduino.build_flags}
    -DUSE_ESP32
    -DUSE_ESP32_FRAMEWORK_ARDUINO
    -DAUDIO_NO_SD_FS                ; i2s_audio
extra_scripts = post:esphome/components/esp32/post_build.py.script

; This are common settings for the ESP32 (all variants) using IDF.
[common:esp32-idf]
extends = common:idf
platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.06/platform-espressif32.zip
platform_packages =
    pioarduino/framework-espidf@https://github.com/pioarduino/esp-idf/releases/download/v5.1.5/esp-idf-v5.1.5.zip

framework = espidf
lib_deps =
    ${common:idf.lib_deps}
    droscy/esp_wireguard@0.4.2              ; wireguard
    kahrendt/ESPMicroSpeechFeatures@1.1.0   ; micro_wake_word
build_flags =
    ${common:idf.build_flags}
    -Wno-nonnull-compare
    -DUSE_ESP32
    -DUSE_ESP32_FRAMEWORK_ESP_IDF
extra_scripts = post:esphome/components/esp32/post_build.py.script

; This are common settings for the ESP32 using the latest ESP-IDF version.
[common:esp32-idf-5_3]
extends = common:esp32-idf
platform = platformio/espressif32@6.8.0
platform_packages =
    platformio/framework-espidf@~3.50300.0

; These are common settings for the RP2040 using Arduino.
[common:rp2040-arduino]
extends = common:arduino
board_build.filesystem_size = 0.5m

platform = https://github.com/maxgerhardt/platform-raspberrypi.git#v1.2.0-gcc12
platform_packages =
    ; earlephilhower/framework-arduinopico@~1.20602.0 ; Cannot use the platformio package until old releases stop getting deleted
    earlephilhower/framework-arduinopico@https://github.com/earlephilhower/arduino-pico/releases/download/3.9.4/rp2040-3.9.4.zip

framework = arduino
lib_deps =
    ${common:arduino.lib_deps}
build_flags =
    ${common:arduino.build_flags}
    -DUSE_RP2040
    -DUSE_RP2040_FRAMEWORK_ARDUINO

; This are common settings for the LibreTiny (all variants) using Arduino.
[common:libretiny-arduino]
extends = common:arduino
platform = libretiny
framework = arduino
lib_deps =
    droscy/esp_wireguard@0.4.2    ; wireguard
build_flags =
    ${common:arduino.build_flags}
    -DUSE_LIBRETINY
build_src_flags = -include Arduino.h

; All the actual environments are defined below.

;;;;;;;; ESP8266 ;;;;;;;;

[env:esp8266-arduino]
extends = common:esp8266-arduino
board = nodemcuv2
build_flags =
    ${common:esp8266-arduino.build_flags}
    ${flags:runtime.build_flags}

[env:esp8266-arduino-tidy]
extends = common:esp8266-arduino
board = nodemcuv2
build_flags =
    ${common:esp8266-arduino.build_flags}
    ${flags:clangtidy.build_flags}

;;;;;;;; ESP32 ;;;;;;;;

[env:esp32-arduino]
extends = common:esp32-arduino
board = esp32dev
board_build.partitions = huge_app.csv
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32

[env:esp32-arduino-tidy]
extends = common:esp32-arduino
board = esp32dev
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32

[env:esp32-idf]
extends = common:esp32-idf
board = esp32dev
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32

[env:esp32-idf-5_3]
extends = common:esp32-idf-5_3
board = esp32dev
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32

[env:esp32-idf-tidy]
extends = common:esp32-idf
board = esp32dev
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32-idf-tidy
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32

;;;;;;;; ESP32-C3 ;;;;;;;;

[env:esp32c3-arduino]
extends = common:esp32-arduino
board = esp32-c3-devkitm-1
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32C3

[env:esp32c3-arduino-tidy]
extends = common:esp32-arduino
board = esp32-c3-devkitm-1
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32C3

[env:esp32c3-idf]
extends = common:esp32-idf
board = esp32-c3-devkitm-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32c3-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32C3

[env:esp32c3-idf-5_3]
extends = common:esp32-idf-5_3
board = esp32-c3-devkitm-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32c3-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32C3

[env:esp32c3-idf-tidy]
extends = common:esp32-idf
board = esp32-c3-devkitm-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32c3-idf-tidy
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32C3

;;;;;;;; ESP32-S2 ;;;;;;;;

[env:esp32s2-arduino]
extends = common:esp32-arduino
board = esp32-s2-kaluga-1
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S2

[env:esp32s2-arduino-tidy]
extends = common:esp32-arduino
board = esp32-s2-kaluga-1
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S2

[env:esp32s2-idf]
extends = common:esp32-idf
board = esp32-s2-kaluga-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32s2-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S2

[env:esp32s2-idf-5_3]
extends = common:esp32-idf-5_3
board = esp32-s2-kaluga-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32s2-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S2

[env:esp32s2-idf-tidy]
extends = common:esp32-idf
board = esp32-s2-kaluga-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32s2-idf-tidy
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S2

;;;;;;;; ESP32-S3 ;;;;;;;;

[env:esp32s3-arduino]
extends = common:esp32-arduino
board = esp32-s3-devkitc-1
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S3

[env:esp32s3-arduino-tidy]
extends = common:esp32-arduino
board = esp32-s3-devkitc-1
build_flags =
    ${common:esp32-arduino.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S3

[env:esp32s3-idf]
extends = common:esp32-idf
board = esp32-s3-devkitc-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32s3-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S3

[env:esp32s3-idf-5_3]
extends = common:esp32-idf-5_3
board = esp32-s3-devkitc-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32s3-idf
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S3

[env:esp32s3-idf-tidy]
extends = common:esp32-idf
board = esp32-s3-devkitc-1
board_build.esp-idf.sdkconfig_path = .temp/sdkconfig-esp32s3-idf-tidy
build_flags =
    ${common:esp32-idf.build_flags}
    ${flags:clangtidy.build_flags}
    -DUSE_ESP32_VARIANT_ESP32S3

;;;;;;;; RP2040 ;;;;;;;;

[env:rp2040-pico-arduino]
extends = common:rp2040-arduino
board = rpipico
build_flags =
    ${common:rp2040-arduino.build_flags}
    ${flags:runtime.build_flags}

;;;;;;;; LibreTiny ;;;;;;;;

[env:bk72xx-arduino]
extends = common:libretiny-arduino
board = generic-bk7231n-qfn32-tuya
build_flags =
    ${common:libretiny-arduino.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_BK72XX
    -DUSE_LIBRETINY_VARIANT_BK7231N

[env:rtl87xxb-arduino]
extends = common:libretiny-arduino
board = generic-rtl8710bn-2mb-788k
build_flags =
    ${common:libretiny-arduino.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_RTL87XX
    -DUSE_LIBRETINY_VARIANT_RTL8710B

[env:rtl87xxc-arduino]
extends = common:libretiny-arduino
board = generic-rtl8720cf-2mb-992k
build_flags =
    ${common:libretiny-arduino.build_flags}
    ${flags:runtime.build_flags}
    -DUSE_RTL87XX
    -DUSE_LIBRETINY_VARIANT_RTL8720C

[env:host]
extends = common
platform = platformio/native
lib_deps =
    esphome/noise-c@0.1.1  ; used by api
build_flags =
    ${common.build_flags}
    -DUSE_HOST
    -std=c++17