Files
esp-idf/components/esp_wifi/CMakeLists.txt
Guillaume Souchere d670774f5c feat(esp_common): implement composable error code registration via link-time arrays
Refactor the esp_err_to_name() system to decouple esp_common from
higher-level components. Instead of a monolithic generated table,
each component registers its error codes into a dedicated linker
section (.esp_err_msg_table) via idf_define_esp_err_codes() in its
CMakeLists.txt.

New files:
- tools/err_codes_extract.py: extract ESP_ERR_* defines from headers to CSV
- tools/err_codes_to_c.py: generate C source placing entries into linker section
- tools/err_codes_to_rst.py: generate RST documentation from error codes
- tools/cmake/err_codes.cmake: CMake module providing idf_define_esp_err_codes()
- components/esp_common/include/esp_err_codes.h: esp_err_msg_t typedef
- components/esp_common/src/esp_err_to_name_new.c: new lookup using link-time array
- tools/test_apps/build_system/err_codes_check/: CI test app

Changes:
- Remove all optional component dependencies from esp_common/CMakeLists.txt
- Add .esp_err_msg_table section to all 5 linker scripts
- Register error codes in 18 components via idf_define_esp_err_codes()
- Add new scripts to .gitlab/ci/rules.yml build_check patterns
- use new scripts to generate doc and add CI validation
- Update esp_err.rst to add description of composable code registration
2026-05-28 09:53:32 +02:00

137 lines
5.3 KiB
CMake

idf_build_get_property(idf_target IDF_TARGET)
if(${idf_target} STREQUAL "linux")
idf_component_register() # Register empty component for first CMake pass for potential *Remote* functionality
add_subdirectory(remote) # wifi-remote on linux host
return() # *Local* esp-wifi component is not supported by the POSIX/Linux simulator
endif()
if( NOT CONFIG_ESP_WIFI_ENABLED
AND NOT CONFIG_ESP_HOST_WIFI_ENABLED
AND NOT CMAKE_BUILD_EARLY_EXPANSION )
# No local wifi: provide only netif bindings
set(srcs
"src/wifi_default.c"
"src/wifi_netif.c"
"src/wifi_default_ap.c")
# Public headers (notably esp_wifi_default.h) include esp_event.h,
# esp_netif.h and esp_phy.h. Declare these in REQUIRES so the headers
# are visible to consumers — same interface as the WiFi-enabled
# registration at the bottom of this file.
set(reqs "esp_event" "esp_netif" "esp_phy")
set(priv_reqs "wpa_supplicant")
# This component provides "esp_wifi" "wifi_apps/nan_app" headers if WiFi not enabled
# (implementation supported optionally in a managed component esp_wifi_remote)
idf_component_register(SRCS "${srcs}"
INCLUDE_DIRS "include" "wifi_apps/nan_app/include"
REQUIRES ${reqs}
PRIV_REQUIRES ${priv_reqs})
add_subdirectory(remote) # wifi-remote on esp32p4/h2 (no wifi)
return()
endif()
if(CONFIG_ESP_WIFI_ENABLED OR CONFIG_ESP_HOST_WIFI_ENABLED)
if(CONFIG_APP_NO_BLOBS)
set(link_binary_libs 0)
set(ldfragments)
else()
set(link_binary_libs 1)
set(ldfragments "linker.lf")
endif()
set(srcs
"src/lib_printf.c"
"src/mesh_event.c"
"src/smartconfig.c"
"src/wifi_init.c"
"src/wifi_default.c"
"src/wifi_netif.c"
"src/wifi_default_ap.c"
"src/ftm_load_calibration.c"
"${idf_target}/esp_adapter.c")
list(APPEND srcs "regulatory/esp_wifi_regulatory.c")
if(CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API AND CONFIG_LWIP_IPV4)
list(APPEND srcs
"src/smartconfig_ack.c")
endif()
if(CONFIG_ESP_WIFI_NAN_SYNC_ENABLE OR CONFIG_ESP_WIFI_NAN_USD_ENABLE)
list(APPEND srcs "wifi_apps/nan_app/src/nan_app.c")
if(CONFIG_ESP_WIFI_NAN_SECURITY)
list(APPEND srcs "wifi_apps/nan_app/src/nan_security.c")
endif()
if(CONFIG_ESP_WIFI_NAN_PAIRING)
list(APPEND srcs "wifi_apps/nan_app/src/nan_pairing.c")
endif()
endif()
if(CONFIG_ESP_WIFI_ENABLE_ROAMING_APP)
list(APPEND srcs "wifi_apps/roaming_app/src/roaming_app.c")
endif()
endif()
idf_component_register(SRCS "${srcs}"
INCLUDE_DIRS "include" "include/local" "wifi_apps/include" "wifi_apps/nan_app/include"
REQUIRES esp_event esp_phy esp_netif
PRIV_REQUIRES esp_pm esp_timer nvs_flash efuse
wpa_supplicant hal lwip esp_coex
PRIV_INCLUDE_DIRS ../wpa_supplicant/src/ ../wpa_supplicant/esp_supplicant/src/
wifi_apps/roaming_app/include wifi_apps/roaming_app/src
LDFRAGMENTS "${ldfragments}")
idf_define_esp_err_codes(HEADERS include/esp_wifi.h include/esp_now.h include/esp_mesh.h)
if(CONFIG_ESP_WIFI_ENABLED OR CONFIG_ESP_HOST_WIFI_ENABLED)
idf_build_get_property(build_dir BUILD_DIR)
if(CONFIG_ESP_HOST_WIFI_ENABLED)
set(target_name "${CONFIG_ESP_WIFI_CONTROLLER_TARGET}_host")
else()
set(target_name "${idf_target}")
endif()
target_link_directories(${COMPONENT_LIB} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/lib/${target_name}")
if(link_binary_libs)
if(CONFIG_ESP_HOST_WIFI_ENABLED)
set(blobs core espnow net80211 target smartconfig wapi)
else()
if(CONFIG_IDF_TARGET_ESP32C2)
set(blobs core espnow net80211 pp smartconfig)
else()
set(blobs core espnow mesh net80211 pp smartconfig wapi)
endif()
endif()
# Since some blob names are very generic, add an "esp_wifi_" prefix when creating target names,
# to avoid conflicts with other libraries.
set(blob_targets ${blobs})
list(TRANSFORM blob_targets PREPEND "esp_wifi_")
foreach(blob ${blobs})
set(blob_target "esp_wifi_${blob}")
add_prebuilt_library(${blob_target} "${CMAKE_CURRENT_SOURCE_DIR}/lib/${target_name}/lib${blob}.a"
REQUIRES ${COMPONENT_NAME})
set(blob_reqs ${blob_targets})
list(REMOVE_ITEM blob_reqs ${blob_target}) # remove itself from requirements
set_property(TARGET ${blob_target} APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${blob_reqs})
target_link_libraries(${COMPONENT_LIB} PUBLIC ${blob_target})
endforeach()
endif()
# TODO IDF-13365: remove the following lines
set_source_files_properties(regulatory/esp_wifi_regulatory.c
PROPERTIES COMPILE_FLAGS
-Wno-unterminated-string-initialization)
endif()
if(CONFIG_SPIRAM)
idf_component_optional_requires(PRIVATE esp_psram)
endif()
add_subdirectory(remote) # wifi-remote as a secondary wifi interface (on wifi targets)