diff --git a/build.sh b/build.sh index 8e5c30b45..48fae2c4d 100755 --- a/build.sh +++ b/build.sh @@ -2637,21 +2637,21 @@ requires_esp32_portable_app_slot() { && ! is_esp32_companion_build "$1" } -is_esp32_c6_target() { - [[ "${PIO_ENV_BOARD_BY_NAME[$1]:-}" == esp32-c6-* ]] -} - requires_esp32_portable_size_ceiling() { local env_name=$1 requires_esp32_portable_app_slot "$env_name" || return 1 - # Arduino 3.x pulls substantially more WiFi runtime into ESP32-C6 images. - # These target-specific OTA siblings already used 1920 KiB or larger A/B app - # slots before the compact browser uploader was enabled, so retain their - # established partition contract and enforce the actual partition below. - if is_lora_ota_only_target "$env_name" && is_esp32_c6_target "$env_name"; then - return 1 + # Arduino 3.x pulls substantially more WiFi runtime into ESP32-C6 and RC32 + # images. These target-specific OTA siblings already use larger A/B slots: + # C6 boards declared at least 1920 KiB slots, while RC32 has always declared + # the two 0x640000 slots in default_16MB.csv. Retain those established + # partition contracts and enforce each image against its actual partition + # below instead of the unrelated legacy 1.25 MiB ceiling. + if is_lora_ota_only_target "$env_name"; then + case "${PIO_ENV_BOARD_BY_NAME[$env_name]:-}" in + esp32-c6-*|heltec-rc32) return 1 ;; + esac fi return 0 diff --git a/test/test_build_profiles.sh b/test/test_build_profiles.sh index 8ca824d50..0d67faf1a 100644 --- a/test/test_build_profiles.sh +++ b/test/test_build_profiles.sh @@ -268,6 +268,21 @@ require(rak_usb, "build_flags", "FORCE_GPS_ALIVE") # aliases remain directly buildable, but canonical release resolution must # replace each with that exact board's Full target. init_project_context >/dev/null + +# Arduino-ESP32 3.x OTA-only targets that have always declared larger A/B +# slots must be checked against their real partition table, not the legacy +# 1.25 MiB portable ceiling. Keep that exception OTA-only so ordinary RC32 +# standard artifacts still retain the portable release contract. +for rc32_ota_env in \ + heltec_rc32_repeater_lora_ota_no_external_sensors \ + heltec_rc32_without_display_repeater_lora_ota_no_external_sensors; do + if requires_esp32_portable_size_ceiling "$rc32_ota_env"; then + fail "$rc32_ota_env incorrectly inherited the legacy portable size ceiling" + fi +done +requires_esp32_portable_size_ceiling heltec_rc32_repeater \ + || fail "ordinary RC32 repeater lost the portable size ceiling" + while IFS='|' read -r source_env full_env build_base; do [ "${PIO_ENV_PLATFORM_BY_NAME[$full_env]:-}" = ESP32_PLATFORM ] \ || fail "$full_env was not registered as ESP32 Full Companion"