build system: remove lwip from common requirements

lwip was added to common requirements list to provide "sys/socket.h"
header to all components without additional requirements specified.

However, lwip pulls in a lot of dependencies on other components.
This commit removes lwip from common requirements to reduce the number
of components in G1-only apps.

To compensate for this removal, the following changes are made:
- newlib (which is a common requirement) has a public dependency on
  lwip if lwip is present in the build. This ensures that sys/socket.h
  is available as long as lwip component is included into the build.
- lwip is now a public requirement of esp-tls since esp_tls.h includes
  sys/socket.h header.
- lwip is now a public requirement o esp_http_client because
  sys/socket.h is included from esp_http_client.h
- lwip is now a private requirement of esp_wifi for "smartconfig_ack"
- lwip is now a private requirement of mqtt for socket functions
- lwip is now a public requirement of tcp_transport because
  esp_transport_tcp.h includes sys/socket.h header.
- mbedtls checks if lwip component is present in the build. If yes,
  net_sockets.c is added to the build, along with the dependency on
  lwip. Previously lwip was a public requirement of mbedtls
  unconditionally.

system/g1_components test app is updated to reflect the changes

Default public dependencies of a component before and after this
change, except common requirements:

- esp_timer (public dependency of freertos)
- bootloader_support (public dependency of esp_hw_support)
- vfs (public dependency of lwip)
- esp_wifi (public dependency of lwip)
- esp_event (public dependency of esp_wifi)
- esp_netif (public dependency of esp_event)
- esp_eth (public dependency of esp_netif)
- esp_phy (public dependency of esp_wifi)

After:

- esp_timer (public dependency of freertos)
- bootloader_support (public dependency of esp_hw_support)

Altogether, the following components have been always added as
public requirements to all other components, and are not added now
([breaking-change]):

- lwip
- vfs
- esp_wifi
- esp_event
- esp_netif
- esp_eth
- esp_phy

Application components now need to explicitly declare dependencies on
these components.
This commit is contained in:
Ivan Grokhotkov
2022-04-14 20:03:56 +02:00
parent ab6151fc8e
commit 47659be5b8
9 changed files with 32 additions and 40 deletions

View File

@@ -12,8 +12,10 @@ endif()
idf_component_register(SRCS "${srcs}" idf_component_register(SRCS "${srcs}"
INCLUDE_DIRS . esp-tls-crypto INCLUDE_DIRS . esp-tls-crypto
PRIV_INCLUDE_DIRS "private_include" PRIV_INCLUDE_DIRS "private_include"
REQUIRES mbedtls # lwip and mbedtls are public requirements becasue esp_tls.h
PRIV_REQUIRES lwip http_parser) # includes sys/socket.h and mbedtls header files.
REQUIRES mbedtls lwip
PRIV_REQUIRES http_parser)
if(CONFIG_ESP_TLS_USING_WOLFSSL) if(CONFIG_ESP_TLS_USING_WOLFSSL)
idf_component_get_property(wolfssl esp-wolfssl COMPONENT_LIB) idf_component_get_property(wolfssl esp-wolfssl COMPONENT_LIB)

View File

@@ -4,5 +4,6 @@ idf_component_register(SRCS "esp_http_client.c"
"lib/http_utils.c" "lib/http_utils.c"
INCLUDE_DIRS "include" INCLUDE_DIRS "include"
PRIV_INCLUDE_DIRS "lib/include" PRIV_INCLUDE_DIRS "lib/include"
REQUIRES http_parser # lwip is a public requirement because esp_http_client.h includes sys/socket.h
REQUIRES http_parser lwip
PRIV_REQUIRES tcp_transport) PRIV_REQUIRES tcp_transport)

View File

@@ -31,7 +31,7 @@ idf_component_register(SRCS "${srcs}"
INCLUDE_DIRS "include" INCLUDE_DIRS "include"
REQUIRES esp_event esp_phy REQUIRES esp_event esp_phy
PRIV_REQUIRES driver esptool_py esp_netif esp_pm esp_timer nvs_flash PRIV_REQUIRES driver esptool_py esp_netif esp_pm esp_timer nvs_flash
wpa_supplicant hal ${extra_priv_requires} wpa_supplicant hal lwip ${extra_priv_requires}
LDFRAGMENTS "${ldfragments}") LDFRAGMENTS "${ldfragments}")
if(CONFIG_ESP32_WIFI_ENABLED) if(CONFIG_ESP32_WIFI_ENABLED)

View File

@@ -17,10 +17,17 @@ endif()
idf_component_register(SRCS "${mbedtls_srcs}" idf_component_register(SRCS "${mbedtls_srcs}"
INCLUDE_DIRS "${mbedtls_include_dirs}" INCLUDE_DIRS "${mbedtls_include_dirs}"
REQUIRES lwip
PRIV_REQUIRES "${priv_requires}" PRIV_REQUIRES "${priv_requires}"
) )
# Determine the type of mbedtls component library
if(mbedtls_srcs STREQUAL "")
# For no sources in component library we must use "INTERFACE"
set(linkage_type INTERFACE)
else()
set(linkage_type PUBLIC)
endif()
if(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE) if(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE)
set(bundle_name "x509_crt_bundle") set(bundle_name "x509_crt_bundle")
@@ -103,8 +110,7 @@ endif()
set(mbedtls_targets mbedtls mbedcrypto mbedx509) set(mbedtls_targets mbedtls mbedcrypto mbedx509)
set(mbedtls_target_sources "${COMPONENT_DIR}/port/mbedtls_debug.c" set(mbedtls_target_sources "${COMPONENT_DIR}/port/mbedtls_debug.c")
"${COMPONENT_DIR}/port/net_sockets.c")
if(CONFIG_MBEDTLS_DYNAMIC_BUFFER) if(CONFIG_MBEDTLS_DYNAMIC_BUFFER)
set(mbedtls_target_sources ${mbedtls_target_sources} set(mbedtls_target_sources ${mbedtls_target_sources}
@@ -114,6 +120,15 @@ set(mbedtls_target_sources ${mbedtls_target_sources}
"${COMPONENT_DIR}/port/dynamic/esp_ssl_tls.c") "${COMPONENT_DIR}/port/dynamic/esp_ssl_tls.c")
endif() endif()
# net_sockets.c should only be compiled if BSD socket functions are available.
# Do this by checking if lwip component is included into the build.
idf_build_get_property(build_components BUILD_COMPONENTS)
if(lwip IN_LIST build_components)
list(APPEND mbedtls_target_sources "${COMPONENT_DIR}/port/net_sockets.c")
idf_component_get_property(lwip_lib lwip COMPONENT_LIB)
target_link_libraries(${COMPONENT_LIB} ${linkage_type} ${lwip_lib})
endif()
# Add port files to mbedtls targets # Add port files to mbedtls targets
target_sources(mbedtls PRIVATE ${mbedtls_target_sources}) target_sources(mbedtls PRIVATE ${mbedtls_target_sources})
@@ -240,14 +255,6 @@ set_property(TARGET mbedcrypto APPEND PROPERTY LINK_INTERFACE_LIBRARIES mbedtls)
set_property(TARGET mbedcrypto APPEND PROPERTY LINK_LIBRARIES idf::driver idf::${target}) set_property(TARGET mbedcrypto APPEND PROPERTY LINK_LIBRARIES idf::driver idf::${target})
set_property(TARGET mbedcrypto APPEND PROPERTY INTERFACE_LINK_LIBRARIES idf::driver idf::${target}) set_property(TARGET mbedcrypto APPEND PROPERTY INTERFACE_LINK_LIBRARIES idf::driver idf::${target})
# Link mbedtls libraries to component library
if(mbedtls_srcs STREQUAL "")
# For no sources in component library we must use "INTERFACE"
set(linkage_type INTERFACE)
else()
set(linkage_type PUBLIC)
endif()
target_link_libraries(${COMPONENT_LIB} ${linkage_type} ${mbedtls_targets}) target_link_libraries(${COMPONENT_LIB} ${linkage_type} ${mbedtls_targets})
if(CONFIG_ESP_TLS_USE_DS_PERIPHERAL) if(CONFIG_ESP_TLS_USE_DS_PERIPHERAL)

View File

@@ -4,6 +4,7 @@ idf_component_register(SRCS "esp-mqtt/mqtt_client.c"
"esp-mqtt/lib/platform_esp32_idf.c" "esp-mqtt/lib/platform_esp32_idf.c"
INCLUDE_DIRS esp-mqtt/include INCLUDE_DIRS esp-mqtt/include
PRIV_INCLUDE_DIRS "esp-mqtt/lib/include" PRIV_INCLUDE_DIRS "esp-mqtt/lib/include"
PRIV_REQUIRES lwip
) )
if(TEST_BUILD) if(TEST_BUILD)

View File

@@ -53,3 +53,7 @@ if(CONFIG_NEWLIB_NANO_FORMAT)
endif() endif()
add_subdirectory(port) add_subdirectory(port)
# if lwip is included in the build, add it as a public requirement so that
# #include <sys/socket.h> works without any special provisions.
idf_component_optional_requires(PUBLIC lwip)

View File

@@ -11,4 +11,4 @@ endif()
idf_component_register(SRCS "${srcs}" idf_component_register(SRCS "${srcs}"
INCLUDE_DIRS "include" INCLUDE_DIRS "include"
PRIV_INCLUDE_DIRS "private_include" PRIV_INCLUDE_DIRS "private_include"
REQUIRES esp-tls) REQUIRES esp-tls lwip)

View File

@@ -162,9 +162,8 @@ function(__build_init idf_path)
else() else()
# Set components required by all other components in the build # Set components required by all other components in the build
# #
# - lwip is here so that #include <sys/socket.h> works without any special provisions
# - esp_hw_support is here for backward compatibility # - esp_hw_support is here for backward compatibility
set(requires_common cxx newlib freertos esp_hw_support heap log lwip soc hal esp_rom esp_common esp_system) set(requires_common cxx newlib freertos esp_hw_support heap log soc hal esp_rom esp_common esp_system)
idf_build_set_property(__COMPONENT_REQUIRES_COMMON "${requires_common}") idf_build_set_property(__COMPONENT_REQUIRES_COMMON "${requires_common}")
endif() endif()

View File

@@ -41,15 +41,6 @@ set(extra_components_which_shouldnt_be_included
# Figure out if these components can exist without a dependency on efuse. # Figure out if these components can exist without a dependency on efuse.
# If not, see if esp_hw_support can provide minimal efuse component replacement in G1 build. # If not, see if esp_hw_support can provide minimal efuse component replacement in G1 build.
efuse efuse
# esp_eth is a dependency of esp_netif, esp_event, lwip
# Once they are removed from G1, esp_eth will be removed as well.
esp_eth
# esp_event is a dependency of esp_wifi, esp_eth. Both should be removed from G1.
esp_event
# esp_netif is a dependency of lwip and esp_event, should disappear once lwip is removed.
esp_netif
# esp_phy is a dependency of esp_wifi.
esp_phy
# esp_pm is pulled in by freertos, can be made a weak dependency # esp_pm is pulled in by freertos, can be made a weak dependency
# conditional on related Kconfig option. It is also used by esp_wifi, driver, mbedtls, # conditional on related Kconfig option. It is also used by esp_wifi, driver, mbedtls,
# all of which should be removed from G1-only build. # all of which should be removed from G1-only build.
@@ -59,30 +50,17 @@ set(extra_components_which_shouldnt_be_included
# esp_timer is a dependency of freertos, esp_event, esp_wifi, driver. # esp_timer is a dependency of freertos, esp_event, esp_wifi, driver.
# For freertos, it can be made a weak dependency conditional on FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER # For freertos, it can be made a weak dependency conditional on FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER
esp_timer esp_timer
# esp_wifi is a dependency of lwip.
# [refactor-todo]: investigate making esp_wifi a conditional dependency.
esp_wifi
# esptool_py is a dependency of bootloader, esp_wifi, app_update, partition_table, all of which # esptool_py is a dependency of bootloader, esp_wifi, app_update, partition_table, all of which
# should be removed from G1-only build. # should be removed from G1-only build.
esptool_py esptool_py
# lwip is a common component due to "sys/socket.h" header.
# [refactor-todo] consider adding a system-level sys/socket.h in newlib instead
lwip
# mbedtls is a dependency of bootloader_support (plus other easier-to-remove ones) # mbedtls is a dependency of bootloader_support (plus other easier-to-remove ones)
# it is hard to make it conditional, need to remove bootloader_support. # it is hard to make it conditional, need to remove bootloader_support.
mbedtls mbedtls
# nvs_flash is required by:
# esp_wifi, esp_phy — both should be removed
nvs_flash
# partition_table is pulled in by app_update, esptool_py, bootloader; all to be removed # partition_table is pulled in by app_update, esptool_py, bootloader; all to be removed
partition_table partition_table
# pthread is required by esp_system (for initialization only, can be made a weak dependency) # pthread is required by esp_system (for initialization only, can be made a weak dependency)
# and cxx. See also [refactor-todo] about cxx, can it work without pthread? # and cxx. See also [refactor-todo] about cxx, can it work without pthread?
pthread pthread
# vfs is a dependency of lwip. It can be made conditional, while lwip is still a common component.
vfs
# wpa_supplicant is a dependency of esp_wifi, which is to be removed from G1-only build
wpa_supplicant
) )
set(expected_components set(expected_components