@@ -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,57 @@ 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+ 
78+     if (${MBED_TOOLCHAIN}  STREQUAL  "GCC_ARM" )
79+         # Override objects passed via target_link_options are finally 
80+         # de-duplicated, so we can avoid multiple definition issue caused 
81+         # due to cyclic target link via target_link_libraries. 
82+         # 
83+         # https://cmake.org/cmake/help/latest/command/target_link_options.html#option-de-duplication 
84+         target_link_options (mbed-wifi
85+             INTERFACE 
86+                 $<LIST:TRANSFORM,${override_objects} ,PREPEND,${CMAKE_CURRENT_BINARY_DIR} />
87+         )
88+ 
89+         # Commands for extracting override objects 
90+         foreach (override_object ${override_objects} )
91+             get_filename_component (override_object_dirname ${override_object}  DIRECTORY )
92+ 
93+             # Extract object files from static library 
94+             # 
95+             # NOTE: The support has restrictions on input static library: 
96+             # 1. No full path match modifier ('P') is specified on creating 
97+             #    the static library. 
98+             # 2. Object file names must be different for just one-level entry 
99+             #    names in the static library. 
100+             # https://sourceware.org/binutils/docs/binutils/ar-cmdline.html 
101+             set (extract_commands
102+                 ${extract_commands} 
103+                 COMMAND 
104+                     ${CMAKE_COMMAND}  -E make_directory ${override_object_dirname} 
105+                 COMMAND 
106+                     ${CMAKE_AR}  x --output  ${override_object_dirname}  $<TARGET_FILE_NAME:mbed-wifi> ${override_object} 
107+             )
108+         endforeach ()
109+ 
110+         add_custom_command (
111+             TARGET 
112+                 mbed-wifi
113+             POST_BUILD
114+             ${extract_commands} 
115+             WORKING_DIRECTORY 
116+                 ${CMAKE_CURRENT_BINARY_DIR} 
117+             VERBATIM 
118+         )
119+     endif ()
120+ 
121+     unset (override_sources)
122+     unset (override_objects)
123+     unset (extract_commands)
124+ endif ()
0 commit comments