@@ -14,6 +14,35 @@ macro(create_mbed_wifi_target)
1414 endif ()
1515endmacro ()
1616
17+ # Collect sources which need to extract from static library to override
18+ # weak symbols. Their paths are required to relative to this directory
19+ # ,so that they match with entries in static library and their corresponding
20+ # object files there can be found and extracted.
21+ set (MBED_WIFI_OVERRIDE_SOURCES "" CACHE INTERNAL "" FORCE)
22+
23+ # Add override sources by subdirectories
24+ #
25+ # The input sources are required to relative to their subdirectories
26+ # and will get converted to relative to this directory herein.
27+ function (mbed_wifi_add_override_sources)
28+ set (override_sources ${MBED_WIFI_OVERRIDE_SOURCES} )
29+
30+ foreach (override_source ${ARGN} )
31+ # Convert to relative to this directory
32+ file (RELATIVE_PATH
33+ override_source_fix
34+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
35+ ${CMAKE_CURRENT_LIST_DIR} /${override_source}
36+ )
37+
38+ set (override_sources
39+ ${override_sources}
40+ ${override_source_fix}
41+ )
42+ endforeach ()
43+
44+ set (MBED_WIFI_OVERRIDE_SOURCES ${override_sources} CACHE INTERNAL "" FORCE)
45+ endfunction ()
1746
1847# The WICED subdirectory is for wifi drivers developed using Infineon WICED framework.
1948# https://community.infineon.com/t5/Knowledge-Base-Articles/WICED-Wi-Fi-FAQ/ta-p/247356
@@ -39,3 +68,54 @@ if("COMPONENT_ESPRESSIF_ESP8266=1" IN_LIST MBED_TARGET_DEFINITIONS)
3968 add_subdirectory (COMPONENT_ESPRESSIF_ESP8266)
4069endif ()
4170
71+ # Extract override objects from static library and pass them to
72+ # link options to actively participate in linking and override weak
73+ # symbols.
74+ if (TARGET mbed-wifi AND NOT "${MBED_WIFI_OVERRIDE_SOURCES} " STREQUAL "" )
75+ set (override_sources ${MBED_WIFI_OVERRIDE_SOURCES} )
76+ list (TRANSFORM override_sources APPEND ${CMAKE_CXX_OUTPUT_EXTENSION} OUTPUT_VARIABLE override_objects)
77+ list (TRANSFORM override_objects PREPEND ${CMAKE_CURRENT_BINARY_DIR} / OUTPUT_VARIABLE override_objects_fullpath)
78+
79+ if (${MBED_TOOLCHAIN} STREQUAL "GCC_ARM" )
80+ # Override objects passed via target_link_options are finally
81+ # de-duplicated, so we can avoid multiple definition issue caused
82+ # due to cyclic target link via target_link_libraries.
83+ #
84+ # https://cmake.org/cmake/help/latest/command/target_link_options.html#option-de-duplication
85+ target_link_options (mbed-wifi
86+ INTERFACE
87+ ${override_objects_fullpath}
88+ )
89+
90+ # Commands for extracting override objects
91+ foreach (override_object ${override_objects} )
92+ get_filename_component (override_object_dirname ${override_object} DIRECTORY )
93+
94+ # Extract object files from static library
95+ #
96+ # NOTE: The support has restrictions on input static library:
97+ # 1. No full path match modifier ('P') is specified on creating
98+ # the static library.
99+ # 2. Object file names must be different for just one-level entry
100+ # names in the static library.
101+ # https://sourceware.org/binutils/docs/binutils/ar-cmdline.html
102+ set (extract_commands
103+ ${extract_commands}
104+ COMMAND
105+ ${CMAKE_COMMAND} -E make_directory ${override_object_dirname}
106+ COMMAND
107+ ${CMAKE_AR} x --output ${override_object_dirname} $<TARGET_FILE_NAME:mbed-wifi> ${override_object}
108+ )
109+ endforeach ()
110+
111+ add_custom_command (
112+ TARGET
113+ mbed-wifi
114+ POST_BUILD
115+ ${extract_commands}
116+ WORKING_DIRECTORY
117+ ${CMAKE_CURRENT_BINARY_DIR}
118+ VERBATIM
119+ )
120+ endif ()
121+ endif ()
0 commit comments