# Check ESP-IDF version and error out if it is not in the supported range. # # Note for arduino-esp32 developers: to bypass the version check locally, # set ARDUINO_SKIP_IDF_VERSION_CHECK environment variable to 1. For example: # export ARDUINO_SKIP_IDF_VERSION_CHECK=1 # idf.py build set(min_supported_idf_version "5.1.0") set(max_supported_idf_version "5.1.99") set(idf_version "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") if ("${idf_version}" AND NOT "$ENV{ARDUINO_SKIP_IDF_VERSION_CHECK}") if (idf_version VERSION_LESS min_supported_idf_version) message(FATAL_ERROR "Arduino-esp32 can be used with ESP-IDF versions " "between ${min_supported_idf_version} and ${max_supported_idf_version}, " "but an older version is detected: ${idf_version}.") endif() if (idf_version VERSION_GREATER max_supported_idf_version) message(FATAL_ERROR "Arduino-esp32 can be used with ESP-IDF versions " "between ${min_supported_idf_version} and ${max_supported_idf_version}, " "but a newer version is detected: ${idf_version}.") endif() endif() set(CORE_SRCS cores/esp32/base64.cpp cores/esp32/cbuf.cpp cores/esp32/chip-debug-report.cpp cores/esp32/esp32-hal-adc.c cores/esp32/esp32-hal-bt.c cores/esp32/esp32-hal-cpu.c cores/esp32/esp32-hal-dac.c cores/esp32/esp32-hal-gpio.c cores/esp32/esp32-hal-i2c.c cores/esp32/esp32-hal-i2c-slave.c cores/esp32/esp32-hal-ledc.c cores/esp32/esp32-hal-matrix.c cores/esp32/esp32-hal-misc.c cores/esp32/esp32-hal-periman.c cores/esp32/esp32-hal-psram.c cores/esp32/esp32-hal-rgb-led.c cores/esp32/esp32-hal-sigmadelta.c cores/esp32/esp32-hal-spi.c cores/esp32/esp32-hal-time.c cores/esp32/esp32-hal-timer.c cores/esp32/esp32-hal-tinyusb.c cores/esp32/esp32-hal-touch.c cores/esp32/esp32-hal-uart.c cores/esp32/esp32-hal-rmt.c cores/esp32/Esp.cpp cores/esp32/FunctionalInterrupt.cpp cores/esp32/HardwareSerial.cpp cores/esp32/HEXBuilder.cpp cores/esp32/IPAddress.cpp cores/esp32/libb64/cdecode.c cores/esp32/libb64/cencode.c cores/esp32/MacAddress.cpp cores/esp32/main.cpp cores/esp32/MD5Builder.cpp cores/esp32/Print.cpp cores/esp32/SHA1Builder.cpp cores/esp32/stdlib_noniso.c cores/esp32/Stream.cpp cores/esp32/StreamString.cpp cores/esp32/Tone.cpp cores/esp32/HWCDC.cpp cores/esp32/USB.cpp cores/esp32/USBCDC.cpp cores/esp32/USBMSC.cpp cores/esp32/FirmwareMSC.cpp cores/esp32/firmware_msc_fat.c cores/esp32/wiring_pulse.c cores/esp32/wiring_shift.c cores/esp32/WMath.cpp cores/esp32/WString.cpp ) set(ARDUINO_ALL_LIBRARIES ArduinoOTA AsyncUDP BLE BluetoothSerial DNSServer EEPROM ESP_I2S ESP_NOW ESP_SR ESPmDNS Ethernet FFat FS HTTPClient HTTPUpdate Insights LittleFS NetBIOS Network OpenThread PPP Preferences RainMaker SD_MMC SD SimpleBLE SPIFFS SPI Ticker Update USB WebServer NetworkClientSecure WiFi WiFiProv Wire ) set(ARDUINO_LIBRARY_ArduinoOTA_SRCS libraries/ArduinoOTA/src/ArduinoOTA.cpp) set(ARDUINO_LIBRARY_ArduinoOTA_REQUIRES esp_https_ota) set(ARDUINO_LIBRARY_AsyncUDP_SRCS libraries/AsyncUDP/src/AsyncUDP.cpp) set(ARDUINO_LIBRARY_BluetoothSerial_SRCS libraries/BluetoothSerial/src/BluetoothSerial.cpp libraries/BluetoothSerial/src/BTAddress.cpp libraries/BluetoothSerial/src/BTAdvertisedDeviceSet.cpp libraries/BluetoothSerial/src/BTScanResultsSet.cpp) set(ARDUINO_LIBRARY_DNSServer_SRCS libraries/DNSServer/src/DNSServer.cpp) set(ARDUINO_LIBRARY_EEPROM_SRCS libraries/EEPROM/src/EEPROM.cpp) set(ARDUINO_LIBRARY_ESP_I2S_SRCS libraries/ESP_I2S/src/ESP_I2S.cpp) set(ARDUINO_LIBRARY_ESP_NOW_SRCS libraries/ESP_NOW/src/ESP32_NOW.cpp libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp) set(ARDUINO_LIBRARY_ESP_SR_SRCS libraries/ESP_SR/src/ESP_SR.cpp libraries/ESP_SR/src/esp32-hal-sr.c) set(ARDUINO_LIBRARY_ESPmDNS_SRCS libraries/ESPmDNS/src/ESPmDNS.cpp) set(ARDUINO_LIBRARY_Ethernet_SRCS libraries/Ethernet/src/ETH.cpp) set(ARDUINO_LIBRARY_FFat_SRCS libraries/FFat/src/FFat.cpp) set(ARDUINO_LIBRARY_FS_SRCS libraries/FS/src/FS.cpp libraries/FS/src/vfs_api.cpp) set(ARDUINO_LIBRARY_HTTPClient_SRCS libraries/HTTPClient/src/HTTPClient.cpp) set(ARDUINO_LIBRARY_HTTPUpdate_SRCS libraries/HTTPUpdate/src/HTTPUpdate.cpp) set(ARDUINO_LIBRARY_Insights_SRCS libraries/Insights/src/Insights.cpp) set(ARDUINO_LIBRARY_LittleFS_SRCS libraries/LittleFS/src/LittleFS.cpp) set(ARDUINO_LIBRARY_NetBIOS_SRCS libraries/NetBIOS/src/NetBIOS.cpp) set(ARDUINO_LIBRARY_OpenThread_SRCS libraries/OpenThread/src/OThreadCLI.cpp libraries/OpenThread/src/OThreadCLI_Util.cpp) set(ARDUINO_LIBRARY_PPP_SRCS libraries/PPP/src/PPP.cpp libraries/PPP/src/ppp.c) set(ARDUINO_LIBRARY_Preferences_SRCS libraries/Preferences/src/Preferences.cpp) set(ARDUINO_LIBRARY_RainMaker_SRCS libraries/RainMaker/src/RMaker.cpp libraries/RainMaker/src/RMakerNode.cpp libraries/RainMaker/src/RMakerParam.cpp libraries/RainMaker/src/RMakerDevice.cpp libraries/RainMaker/src/RMakerType.cpp libraries/RainMaker/src/RMakerQR.cpp libraries/RainMaker/src/RMakerUtils.cpp libraries/RainMaker/src/AppInsights.cpp) set(ARDUINO_LIBRARY_SD_MMC_SRCS libraries/SD_MMC/src/SD_MMC.cpp) set(ARDUINO_LIBRARY_SD_SRCS libraries/SD/src/SD.cpp libraries/SD/src/sd_diskio.cpp libraries/SD/src/sd_diskio_crc.c) set(ARDUINO_LIBRARY_SimpleBLE_SRCS libraries/SimpleBLE/src/SimpleBLE.cpp) set(ARDUINO_LIBRARY_SPIFFS_SRCS libraries/SPIFFS/src/SPIFFS.cpp) set(ARDUINO_LIBRARY_SPI_SRCS libraries/SPI/src/SPI.cpp) set(ARDUINO_LIBRARY_Ticker_SRCS libraries/Ticker/src/Ticker.cpp) set(ARDUINO_LIBRARY_Update_SRCS libraries/Update/src/Updater.cpp libraries/Update/src/HttpsOTAUpdate.cpp) set(ARDUINO_LIBRARY_USB_SRCS libraries/USB/src/USBHID.cpp libraries/USB/src/USBMIDI.cpp libraries/USB/src/USBHIDMouse.cpp libraries/USB/src/USBHIDKeyboard.cpp libraries/USB/src/USBHIDGamepad.cpp libraries/USB/src/USBHIDConsumerControl.cpp libraries/USB/src/USBHIDSystemControl.cpp libraries/USB/src/USBHIDVendor.cpp libraries/USB/src/USBVendor.cpp) set(ARDUINO_LIBRARY_WebServer_SRCS libraries/WebServer/src/WebServer.cpp libraries/WebServer/src/Parsing.cpp libraries/WebServer/src/detail/mimetable.cpp) set(ARDUINO_LIBRARY_NetworkClientSecure_SRCS libraries/NetworkClientSecure/src/ssl_client.cpp libraries/NetworkClientSecure/src/NetworkClientSecure.cpp) set(ARDUINO_LIBRARY_Network_SRCS libraries/Network/src/NetworkInterface.cpp libraries/Network/src/NetworkEvents.cpp libraries/Network/src/NetworkManager.cpp libraries/Network/src/NetworkClient.cpp libraries/Network/src/NetworkServer.cpp libraries/Network/src/NetworkUdp.cpp) set(ARDUINO_LIBRARY_WiFi_SRCS libraries/WiFi/src/WiFiAP.cpp libraries/WiFi/src/WiFi.cpp libraries/WiFi/src/WiFiGeneric.cpp libraries/WiFi/src/WiFiMulti.cpp libraries/WiFi/src/WiFiScan.cpp libraries/WiFi/src/WiFiSTA.cpp libraries/WiFi/src/STA.cpp libraries/WiFi/src/AP.cpp) set(ARDUINO_LIBRARY_WiFiProv_SRCS libraries/WiFiProv/src/WiFiProv.cpp) set(ARDUINO_LIBRARY_Wire_SRCS libraries/Wire/src/Wire.cpp) set(ARDUINO_LIBRARY_BLE_SRCS libraries/BLE/src/BLE2901.cpp libraries/BLE/src/BLE2902.cpp libraries/BLE/src/BLE2904.cpp libraries/BLE/src/BLEAddress.cpp libraries/BLE/src/BLEAdvertisedDevice.cpp libraries/BLE/src/BLEAdvertising.cpp libraries/BLE/src/BLEBeacon.cpp libraries/BLE/src/BLECharacteristic.cpp libraries/BLE/src/BLECharacteristicMap.cpp libraries/BLE/src/BLEClient.cpp libraries/BLE/src/BLEDescriptor.cpp libraries/BLE/src/BLEDescriptorMap.cpp libraries/BLE/src/BLEDevice.cpp libraries/BLE/src/BLEEddystoneTLM.cpp libraries/BLE/src/BLEEddystoneURL.cpp libraries/BLE/src/BLEExceptions.cpp libraries/BLE/src/BLEHIDDevice.cpp libraries/BLE/src/BLERemoteCharacteristic.cpp libraries/BLE/src/BLERemoteDescriptor.cpp libraries/BLE/src/BLERemoteService.cpp libraries/BLE/src/BLEScan.cpp libraries/BLE/src/BLESecurity.cpp libraries/BLE/src/BLEServer.cpp libraries/BLE/src/BLEService.cpp libraries/BLE/src/BLEServiceMap.cpp libraries/BLE/src/BLEUtils.cpp libraries/BLE/src/BLEUUID.cpp libraries/BLE/src/BLEValue.cpp libraries/BLE/src/FreeRTOS.cpp libraries/BLE/src/GeneralUtils.cpp ) set(ARDUINO_LIBRARIES_SRCS) set(ARDUINO_LIBRARIES_REQUIRES) set(ARDUINO_LIBRARIES_INCLUDEDIRS) foreach(libname IN LISTS ARDUINO_ALL_LIBRARIES) if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_${libname}) if(ARDUINO_LIBRARY_${libname}_SRCS) list(APPEND ARDUINO_LIBRARIES_SRCS ${ARDUINO_LIBRARY_${libname}_SRCS}) endif() if(ARDUINO_LIBRARY_${libname}_REQUIRES) list(APPEND ARDUINO_LIBRARIES_REQUIRES ${ARDUINO_LIBRARY_${libname}_REQUIRES}) endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libraries/${libname}/src) list(APPEND ARDUINO_LIBRARIES_INCLUDEDIRS libraries/${libname}/src) endif() endif() endforeach() set(includedirs variants/${CONFIG_ARDUINO_VARIANT}/ cores/esp32/ ${ARDUINO_LIBRARIES_INCLUDEDIRS}) set(srcs ${CORE_SRCS} ${ARDUINO_LIBRARIES_SRCS}) set(priv_includes cores/esp32/libb64) set(requires spi_flash esp_partition mbedtls wpa_supplicant esp_adc esp_eth http_parser espressif__network_provisioning) set(priv_requires fatfs nvs_flash app_update spiffs bootloader_support bt esp_hid usb esp_psram ${ARDUINO_LIBRARIES_REQUIRES}) if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_OpenThread) #if(CONFIG_SOC_IEEE802154_SUPPORTED) # Does not work! #if(CONFIG_OPENTHREAD_ENABLED) # Does not work! if(IDF_TARGET STREQUAL "esp32c6" OR IDF_TARGET STREQUAL "esp32h2") # Sadly only this works list(APPEND requires openthread) endif() endif() idf_component_register(INCLUDE_DIRS ${includedirs} PRIV_INCLUDE_DIRS ${priv_includes} SRCS ${srcs} REQUIRES ${requires} PRIV_REQUIRES ${priv_requires}) if(NOT CONFIG_FREERTOS_HZ EQUAL 1000 AND NOT "$ENV{ARDUINO_SKIP_TICK_CHECK}") # See delay() in cores/esp32/esp32-hal-misc.c. message(FATAL_ERROR "esp32-arduino requires CONFIG_FREERTOS_HZ=1000 " "(currently ${CONFIG_FREERTOS_HZ})") endif() string(TOUPPER ${CONFIG_ARDUINO_VARIANT} idf_target_caps) string(REPLACE "-" "_" idf_target_for_macro "${idf_target_caps}") target_compile_options(${COMPONENT_TARGET} PUBLIC -DARDUINO=10812 -DARDUINO_${idf_target_for_macro}_DEV -DARDUINO_ARCH_ESP32 -DARDUINO_BOARD="${idf_target_caps}_DEV" -DARDUINO_VARIANT="${CONFIG_ARDUINO_VARIANT}" -DESP32=ESP32) if(CONFIG_AUTOSTART_ARDUINO) # in autostart mode, arduino-esp32 contains app_main() function and needs to # reference setup() and loop() in the main component. If we add main # component to priv_requires then we create a large circular dependency # (arduino-esp32 -> main -> arduino-esp32) and can get linker errors, so # instead we add setup() and loop() to the undefined symbols list so the # linker will always include them. # # (As they are C++ symbol, we need to add the C++ mangled names.) target_link_libraries(${COMPONENT_LIB} INTERFACE "-u _Z5setupv -u _Z4loopv") endif() # This function adds a dependency on the given component if the component is included into the build. function(maybe_add_component component_name) idf_build_get_property(components BUILD_COMPONENTS) if (${component_name} IN_LIST components) idf_component_get_property(lib_name ${component_name} COMPONENT_LIB) target_link_libraries(${COMPONENT_LIB} PUBLIC ${lib_name}) endif() endfunction() if(IDF_TARGET MATCHES "esp32s2|esp32s3" AND CONFIG_TINYUSB_ENABLED) maybe_add_component(arduino_tinyusb) endif() if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_ArduinoOTA) maybe_add_component(esp_https_ota) endif()